ccp -> .i -> cc1 -> .s -> as -> .o -> ld -> prog(exec)
动态链接器负责链接共享库,运行时加载共享库
位置无关代码:可以被加载到内存的任何位置,不需要重定位,共享库的编译总是需要加上 -fPIC
选项
编译时打桩:需要访问源代码
链接时打桩:需要访问可重定向目标文件
运行时打桩:只需要访问可执行文件
SIGKILL 和 SIGSTOP 不能被捕获或忽略
对信号 S 的信号处理函数可以被对信号 T 的处理函数中断(过程转移),处理完 T 后再继续处理 S
TLB 对页表进行缓存,以 VPN 查询
TLB 可以在 MMU 内缓存多级页表,页表存在于内存中,只有一级页表常驻内存,其他级别的页表在需要时才加载到内存中(或者根本没创建)
内部碎片:分配块大小-有效载荷大小,包括头脚部
Cache 高速缓存是物理寻址的,进程切换时/内核态切换时不需要刷新
TLB 是虚拟寻址的,进程切换时需要刷新,但是内核态切换时不需要刷新(因为内核态的虚拟地址空间是共享的,即不改变内存映射)
Core i7 每个页表项为 8 字节,包括各种控制位 + 页表物理基地址
A 位(引用位)和 D 位(修改位)由 MMU 在读写时设置,由软件擦除,从而实现一些页替换算法(如 LRU)
图 9.22 的寻址过程很重要
任务结构:进程间独立
pgd(Page Global Directory):页全局目录,存放一级页表的物理地址,也存放在 CR3 寄存器中
P581
mmap(Memory Map):指向一个 vm_area_struct (区域结构)的链表,每个 vm_area_struct 描述了一个虚拟内存区域
- vm_start:区域开始的虚拟地址
- vm_end:区域结束的虚拟地址
- vm_next:指向下一个区域的指针
- vm_prot:区域的保护位,如可读、可写、可执行
- vm_flags:区域的标志位,
dup2
函数是一个在类 Unix 操作系统中用于处理文件描述符的系统调用。它的作用是将一个已打开的文件描述符复制到另一个指定的文件描述符。如果目标文件描述符已经打开,dup2
会先将其关闭,然后进行复制。如果目标文件描述符未打开,dup2
会直接复制文件描述符。
因而,可以向一个未打开的描述符进行复制、从一个未打开的描述符复制(即未打开的描述符是 dup2 的第一个参数)都是合法的(但是后者一旦开始写就会报错)。
IP 地址和端口号总是以网络字节序存储,即大端序
hostname -i 返回点分十进制的 IP 地址(而不是域名)
可重入的:不引用任何共享变量
- 显式可重入:函数参数都是按值传递的,并且所有数据引用都是本地自动栈变量(没有引用静态/全局变量)
- 隐式可重入:允许传递指针,但是线程小心地传递指向非共享数据的指针
线程安全的:多个并发线程反复调用该函数,不会出错
线程不安全类:
- 不保护共享变量
- 保持跨越多个调用的状态信息,如随机数发生器
- 返回指向静态变量的指针
- 调用了线程不安全的函数,但这类不一定是线程不安全的
复习相关洞:4513174(太细)
5813817