
逻辑地址,就是指机器语言指令中用来指定一个操作数或一条指令的地址,由一个段(segment)和偏移量(offset)组成,说地直白点就是CPU拿到的地址。
线性地址,也叫虚拟地址,就是进程使用的地址。值得注意的是这个地址就是一个32位无符号的整型数,所以虚拟地址空间总共就是4 GB大小。
MMU有两个硬件电路单元,一个称之为分段单元(segmentation unit)、一个称之为分页单元(paging unit),下面是它的工作原理:
逻辑地址 -> [分段单元] -> 虚拟地址 -> [分页单元] -> 物理地址
所以MMU的存在使64位系统的内存大于4G时, 仍可以进行寻址, 实际访问到的物理地址是由MMU进行分配映射的.
add eax, ebx
流程: 预取器从cache中获取一条二进制指令, 交给译码器判断指令内容, 从而调用对应的加法器和寄存器, 交给ALU做算术操作(只能加法和左移), 之后再赋值给寄存器, 然后再返回到内存里, 交给主线.

linux下CPU权限只使用0级和3级, 由MMU修改内存访问级别. MMU映射到物理内存的最小单位是页, 一页4k.
两个进程的用户区分别由MMU映射到物理内存的不同部分, 但kernel区指向物理内存的同一块, 因为kernel只有一份. 虽然两个进程的PCB表不同, 但共存于同一块物理内存中.
进程四种状态

进程有5种状态, 其中初始化和就绪态常合二为一. 挂起是一种阻塞态, 一般是等待I/O, 暂停运行, 等得到需要的资源后再就绪等待时间片. 各个状态均可以在任意时刻被停止(kill).
环境变量
环境变量表是一个char*数组, 结尾是NULL, 类似于命令行参数, 导入环境变量需要声明extern char** environ
. 需要注意区分shell和程序是不同的进程, 其环境变量也不同, 只是值可以一样.
getenv("PATH")
返回对应环境变量的值, setenv("ABC", "aabbcc", 1)
设置新的环境变量, 1表示覆盖已有的, 0表示创建新的或不覆盖原有的(此时前两个参数作废).
unsetenv("ABC")
删除环境变量, 删除不存在的环境变量时返回0也视作成功, 只有unsetenv("ABC=")
这种情况才会返回-1看作失败.
网友评论