C++ 内存
堆(heap)和栈(stack)是两种用于存储数据的内存区域
stack 栈内存 是由操作系统自动管理 栈是一种用于存储局部变量和函数调用信息的内存区域,通常采用LIFO(后进先出)结构。
heap 堆内存 是用于动态分配的内存区域,通过显式地使用new和delete
C语言【malloc分配空间,free释放】C++【new分配,delete释放】
全局/静态存储区 (.bss段和.data段)
常量存储区 (.rodata段)
代码区 (.text段)
CMake 解决方案的构建
分为三个阶段——配置、生成和运行构建工具
Cmake
cmake_minimum_required()
project()命令将检测和测试您选择的可用编译器
遵循一个称为关注点分离的设计原则。
简单来说,就是将代码分成块,将具有紧密相关功能的代码分组,同时将其他代码片段解耦,以创建强大的边界。
工具链包括构建和运行应用程序的所有工具
交叉编译—— 宿主和目标系统
必要步骤之一是将
CMAKE_SYSTEM_NAME 和 CMAKE_SYSTEM_VERSION 变量设置为目标操作系统(CMake 文档中将其称为目标系统)
编译测试文件
CMake 管理依赖关系
知道和可以看到
自定义的类 对于main函数所在的文件是可见的
.h:头文件,是多文件编程时用来声明被引用的类、方法、常量等,但必须注意的是头文件仅仅是声明,源文件才是用来实现程序具体方法的地方
自定义头文件:使用“xxx.h”引用,例如#include "book.h"
系统中的头文件和库文件
头文件,并且已经安装到了系统的标准头文件目录中, 可以直接引用它:
find_library()
include_directories()
add_subdirectory()
third-party library
Native方法通常指的是那些用本地语言(如C、C++)编写的方法,它们可以直接与底层系统或硬件交互
默认引入-无需显式地导入
编译器和操作系统-源码
C 源码管理以及系统配置--
C++ namespace C++ 使用手动内存管理
###编译器和包 ---操作系统 编程和执行程序的方便性并不是理所当然的,背后有着从硬件到软件多种机制的支持
##系统调用充当了用户和内核之间的边界
Rust - cargo(Rust 的构建系统和包管理器) + Rust 使用自动内存管理,它通过所有权(ownership)、借用(borrowing)和生命周期(lifetimes)
Rust 标准库 std 需要通过系统调用获得操作系统的服务
std is available to all Rust crates by default. crate 是 Rust 在编译时最小的代码单位。
Cangjie 默认引入 core std.core 包不需要显式导入,默认导入 core 包是标准库的核心包,提供了适用仓颉语言编程最基本的一些 API 能力
GC 垃圾回收
引入: import std.collection.*
Python 默认引入 __built_in__ __main__
Java 默认引入的 java.lang
Swift文件中,使用import语句来引入需要的模块
Go: package main
标准库是 Go 自带的一组包,可以直接导入和使用
第三方包
导入本地包
Rust 标准库与核心库
Rust的标准库主要包括3个组件:
语言核心库——CORE库、 核心库是与平台无关的。
智能指针库——ALLOC库、
用户态——STD库
CORE库是基础,ALLOC库及STD库都是基于CORE库的
编程语言的标准库或三方库的 某些功能会直接或间接的用到操作系统提供的系统调用
Rust 有一个对 Rust 语言标准库–std 裁剪过后的 Rust 语言核心库 core。
core库是不需要任何操作系统支持的,它的功能也比较受限,
但是也包含了 Rust 语言相当一部分的核心机制,可以满足我们的大部分功能需求
Rust 语言标准库–std 是让 Rust 语言开发的软件具备可移植性的基础
裸机平台 (bare-metal)。这意味着在裸机平台上的软件没有传统操作系统支持。
裸机平台上我们要将对于标准库 std 的引用换成核心库 core
移除移除 println! 宏及其所在的标准库 以及 交叉编译
实现一个简陋的 panic 处理函数
语言标准库和三方库作为应用程序的执行环境,需要负责在执行应用程序之前进行一些初始化工作,然后才跳转到应用程序的入口点
Linux 内核
在 Ubuntu 系统上,可以通过 strace 工具来运行一个程序并输出程序运行过程当中向内核请求的所有的系统调用及其返回值。
我们只需输入 strace target/debug/os 即可看到一长串的各种系统调用。
C# 主要用于 Windows 桌面应用程序开发
在Linux系统中,进程与硬件的交互并非直接进行,而是通过系统调用来实现。
strace 是一个强大的工具,它可以追踪进程执行时的系统调用以及接收到的信号,这对于诊断和调试程序非常有用
如果要跟踪一个已经运行的进程,可以使用-p参数指定进程ID
strace
itrace 库文件调用跟踪器,Linux内核内建命令
ptrace
ftrace
ltrace(1), strace-log-merge(1),
ptrace(2), seccomp(2), proc_pid_maps(5), capabilities(7), mount_namespaces(7), vdso(7), ovs-ctl(8), systemd-sysext(8)
systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具
Seccomp 是一种重要的Linux安全特性,用于限制进程可以执行的系统调用
Seccomp(全称 “Secure computing”)
Berkeley Packet Filte
ptrace是Linux系统中的一个标准系统调用,
它允许一个进程(称为“tracer”)监视和控制另一个进程(称为“tracee”)的执行。ptrace提供了一种机制,
使得tracer可以读取和修改tracee的内存、寄存器、信号等信息,从而实现断点调试、单步执行、系统调用跟踪等功能。
ptrace是gdb和 strace等调试工具的基础
拦截((intercepting))系统调用: 系统调用拦截
seccomp-bpf+ptrace 实现修改 系统调用原理
https://man7.org/linux/man-pages/man7/pthreads.7.html
参考
https://github.com/xiaoweiChen/Modern-CMake-for-Cpp-2ed/tree/main
https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html
Rust 程序设计语言 https://doc.rust-lang.org/book/
https://man7.org/linux/man-pages/man2/ptrace.2.html
Rust语言圣经(Rust Course) https://course.rs/about-book.html
https://course.rs/first-try/sth-you-should-not-do.html
Rust 核心库 https://rustwiki.org/zh-CN/core/index.html
https://strace.io/
https://man7.org/linux/man-pages/man1/strace.1.html
标签:调用,模型,系统,C++,html,内存,https,Rust
From: https://www.cnblogs.com/ytwang/p/18574652