《深入Linux内核架构》学习笔记1
1.虚拟地址空间
CPU的字长决定了可管理的地址空间的最大长度。例如:32位机器可管理2^32即4G的地址空间;64位机器可管理2^64的地址空间;
地址空间实际上与物理内存的最大长度无关,每个进程都会使用对应的一个虚拟的地址空间,从0 - 2^32或2^64,称之为虚拟地址空间。
所以:
a. 每个进程都认为只有自己一个进程存在,每个进程都有各自互不干涉的进程地址空间;
b. 进程的虚拟空间可能大于实际的内存空间;
c. 用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址;
d. 虚拟地址可起到保护操作系统的效果,因为用户不能直接访问物理内存;
进程通过虚拟地址找到实际物理地址,需要经过 “逻辑地址”--段转换-->"线性地址"--页转换-->"物理地址"。
虚拟地址空间分为:用户空间和内核空间。用户空间:0--TASK_SIZE;内核空间:TASK_SIZE--2^32或2^64。 linux系统中,用户空间和内核空间比通常为3:1,windows系统默认为2:2。
2.进程虚拟地址空间特权
linux将虚拟地址空间分为“用户态”和“核心态”。
处于“用户态”的进程禁止直接访问内核空间,不可直接对其进行任何读写或代码执行操作。
从“用户态”进程想要执行任何影响操作系统的动作,必须借助“系统调用”向内核发出相应指令。内核会检测进程权限,然后执行操作,再返回到用户态。
“核心态”的进程(一般指内核)分为:
①普通内核线程;可以访问虚拟地址空间的用户空间
②通过中断调用的中断上下文。不可以访问虚拟地址空间的用户空间
执行流程:
① CPU大部分时间在执行用户空间的代码,处于用户态。当执行到系统调用的时候,CPU会进入到核心态,内核将完成请求,此时,内核可以访问虚拟地址空间的用户空间。当系统调用完成时,返回到用户态。
② CPU也可以通过中断进入核心态,执行中断上下文,但此时不可访问虚拟地址空间的用户空间。
参考:

浙公网安备 33010602011771号