内核地址空间
内核空间1GB大小,映射的是操作系统的代码和数据;操作系统是计算机启动时载入的第一个程序,一般是靠近物理内存的低地址处;进程地址空间的内核空间经过内核级页表与物理内存建立映射,当然也有偏移量计算从虚拟地址直接映射为物理地址,如虚拟地址减去3GB;
用户级页表每个进程对应一份,因为进程的独立性;内核级页表只有一份,所以每一个进程看到的3~4GB的空间是一样的;所以每一个进程执行系统调用时,都是从代码区到内核区执行,然后返回代码区;
一般进程无法直接执行内核代码需要从用户态转换成为内核态;CPU中存放着CR3寄存器存放的是用户级页表的起始地址,是物理地址;CPU中还存放着ecs寄存器,当执行用户态代码的时候ecs寄存器就会指向用户态的代码,切换成内核态就会执行内核态代码;在ecs寄存器的最后两位形成了四种组合00、01、10、11,而CPU一般有两种工作模式,一种叫做内核态(0),一种叫做用户态(3),所以当进程想访问呢欸和代码的时候需要将身份切换成内核态,即将ecs最后两个标志位改成00,这也叫做进入内核态;int 80:陷入内核,将11改为00;
内核态:允许进程访问内核代码和数据;用户态:只允许进程访问用户代码和数据;
总结:程序运行时,会从代码区开始执行,执行到函数调用时触发int 80将ecs后两位由11变成00,进入内核态,根据用户级页表映射进入内核空间执行代码,根据内核级页表映射到内存空间,执行代码,返回时要先执行一次do signal(当前进程对信号做一次检测,对pending表,block表的检测),如果不需要处理,直接变成用户态,将ecs寄存器的后两位由00变成11,并且返回到原先用户空间执行代码处;否则先将pending表对应信号位置零,对于忽略方式直接返回,默认方式直接执行,都是在内核空间处理,而对于自定义处理需要先将身份转换为用户态(因为操作系统不信任用户的代码,有风险)然后执行完使用sigreturn(使用函数压栈的方式传入的此函数,所以可以执行)返回内核态跳转之前的位置,然后在跳转回用户态执行的地方;
1.操作系统的本质
操作系统是一个基于时钟中断的死循环;
在计算机中存在一个芯片单元CMOS,定期(时间间隔很短)向计算机发送时钟中断,操作系统接收到时钟中断根据中断号调用中断表的方法;每一次发送叫作一次滴答;操作系统被动地执行;
其他软件的执行都是由操作系统进行调度实现的,而操作系统本身是靠时钟中断推动执行的;
当操作系统准备工作做完之后,就开始死循环执行pause(),检测是否有时钟到来,如果中断到来,就开始执行方法如进程调度,然后开始检查当前进程的时间片是否到了,然后确定是否切换进程;
有纽扣电池支持时间滴答,使得时间计数器++,记录过去了多少时间,使得每次开机知道过去了多少时间,所以不联网也是知道时间的;