Skip to content

补充

LINUX 相关

  • binutils:GNU Binutils 是一组用于处理二进制文件的工具
    • objdump:反汇编二进制文件
    • ld:链接目标文件和库为可执行文件或共享库
    • readelf:显示 ELF 文件信息(节头表、段头表等)
    • nm:显示目标文件的符号表
    • as:将汇编语言代码转化为机器代码
  • Coreutils:一组在 Unix 和 Linux 操作系统上使用的基本命令行工具的集合
    • ls、cat、cp、mv 等各种常用指令集合
  • strace(System call trace):跟踪一个程序执行期间的所有系统调用及其接收到的信号,即用于记录程序运行过程中的系统调用信息
  • proc/:特殊文件夹,用于查看进程的信息,如 /proc/[pid]/maps 查看进程的地址空间
  • memorymap 系统调用
    • mmap 系统调用用于将文件或设备映射到进程的虚拟地址空间中。
    • munmap 系统调用用于解除映射,释放映射的虚拟内存区域。
    • mprotect 系统调用用于更改映射区域的内存保护属性
  • 输入输出重定向:比如将标准输出重定向 cat test.txt > file,打开文件得到一个新的文件描述符,之后将标准输出复制到新的文件描述符即可。三个步骤:打开新描述符、绑定、关闭旧描述符
    • > 主要用于将标准输出重定向到文件
    • | 管道则是用于将一个命令的输出作为下一个命令的输入
  • $ sudo echo hello > /etc/a.txt 的报错 bash: /etc/a.txt: Permission denied
    • sudo 只提升了 echo 命令的权限,但没有提升重定向操作的权限(也就无法写入文件)。
    • 以超级用户权限运行一个新的 shell,并在这个 shell 中执行整个命令字符串。`sudo sh -c 'echo hello > /etc/a.txt'
  • execve 的参数:path argv envp
    • argv 为要传递给新程序的命令参数
    • envp 传递给新程序的环境变量(PATH、HOME、USER 等运行时环境)
    • argv 是运行程序时临时指定的,envp 则是由系统和用户配置环境变量生成,影响程序的运行环境
  • ioctl:调用,主要用于设备控制。它允许程序通过设备文件向设备驱动程序发送特定的命令,执行各种控制操作
    • “非数据” 的设备功能几乎全部依赖 ioctl
    • ioctl 的参数和行为高度设备依赖,在实现和使用上具有很高的复杂性和不一致性。
  • dup:用于复制文件描述符
    • int dup(int oldfd); 返回复制得到的新的文件描述符
    • 两个文件描述符指向相同的文件
    • int dup2(int oldfd, int newfd); 可以指定目标文件描述符,应用更为广泛
    • 输出重定向:dup2(fd, STDOUT_FILENO) 将 fd 复制到标准输出,也就替代了标准输出,实现了输出重定向
  • 系统调用的执行过程:
    • 准备参数,如系统调用号
    • 执行陷阱指令,进入内核态
    • 由系统调用调用处理函数格努句系统调用号到系统调用表找到并执行对应的内核函数
    • 为什么不由用户态直接调用内核函数:权限不够
    • image.png|500

ELF 与链接

Linux下的ELF文件、链接、加载与库 - Executable and Linkable Format,即可执行、可链接格式 - 可重定位文件 .o,可执行文件,恭喜那个库文件 .so 都是 ELF 文件 - ELF 文件的两种视图 - 静态链接 - image.png|500 - 生成了包含全部内容的,完全链接的可执行目标文件 - 可执行文件的加载过程 - 为进程分配独立的虚拟地址空间 - 将可执行文件映射到进程的虚拟地址空间(mmap) - 将 PIC 设置到 ELF 中的程序的如口地址,开始执行 - 动态链接 - 引入动态链接之后,操作系统会在程序开始运行之前先将控制权交给动态连接器(ld),动态链接器完成工作之后再把控制权交给应用程序 - image.png|500 - 为什么要有 PLT?

libc 相关

  • sleep:导致调用进程进入等待状态,操作系统内核将进程从运行态转化为等待态,通过时钟中断(会设置一个定时器)实现到达时间后将进程从等待态转化到就绪态。
  • printf 的执行过程:image-20230527132049144

其他

- MMU 内存控制器:位于 CPU 和内存之间,负责处理内存地址转换和内存访问权限的控制。