一,从电源启动到BIOS
1,操作系统分界线:内核态和用户态,从实时模式(物理内存)到保护模式(虚拟内存)变化。
保护模式:全部使用虚拟内存、页等机制对内存进行保护。相比实时模式更加安全可靠,同时也增加扩展性和灵活性。
实时模式:在此模式下地址访问为真实内存地址所在位置,软件可以不受限制操作所有地址的空间和IO设备。
2,从启动电源到BIOS:按下电源-->主板会向电源组发出信号-->接收到信号后。当主板收到电源正常启动的信号后,主板就会启动CPU(CPU重置所有寄存器数据,并且初始化数据)。
比如32位系统:实时模式采用内存段来管理0---0xfffff的这1MB内存空间,但是只有16位寄存器,所有最大地址只能表示0xFFFFF(64KB)
二,从BIOS到BootLoader
1,BIOS执行程序存储在ROM中,起始位置为0xFFFF0。当CS:IP指向此位置时,BIOS开始执行。 BIOS主要包括内存映射。
2,BIOS程序会选择一个启动设备,并将控制权转交给启动扇区的代码,主要工作使用中断向量和中断服务程序完成Bootloader的加载,最终将boot.img加载到0X7c00的位置启动。
linux内核通过Boot protocol定义如何实现此引导程序。
三,Bootloader工作加载流程
1,boot.img由boot.S编译而成,512字节,安装在启动盘的第一个扇区,即MBR。由于空间大小有限,代码简单只是作为一个引导的作用。
加载core之后启动main() -->初始化控制台,计算模块及地址,设置root设备,读取grub配置文件,加载模块。
总结:按下电源开关加载完毕bootloader整个过程,后面分析从实时模式进入保护模式,从而启动内核创建0号、1号、2号进程的整个过程。
四,linux内核运行原理机制
必须通过main()函数完成一系列的初始化之后才会打开新的终端,从而使内核模式正式运行,这个部分包括:为进程0建立内核态对栈-->清零eflags寄存器-->调用setup_idt()的中断处理程序填充IDT-->把BIOS中获得的参数传给第一个页框-->用GDT和IDT表填充寄存器。完成整个工作之后内核就正式运行(开始创建0号进程)。
五,linux内核锁部分
1,atomic原子变量
2,spinlock自旋锁
3,semaphore信号量
4,mutex互斥锁
5,rw-lock读写锁
6,preempt抢占
7,per-cpu变量
8,RCU机制(read-copy update)
9,内存屏障(memory-barrier)
具体使用层次框架如下:
程序运行过程中,对内存访问不一定按照代码编写顺序来处理:
①编译器对代码进行优化
②多CPU架构存在指令乱序访问内存的可能性