Linux-系统初始化
- cpu工作流程
- 操作系统引导
- linux内核启动
cpu工作流程
图一
a. cpu 包含运算单元,控制单元,数据单元(控制单元如将数据单元中的代码,数据加载到运算单元运算)
图二
a. 8086架构cpu中有8个16位寄存器用于存放临时数据。通用寄存器(AX,BX,CX,DX),指针变址寄存器(SP,BP,SI,DI)
b. cpu中的控制单元有ip指令指针寄存器,将指令加载到指令队列交给运算单元计算
c. cs代码段寄存器,DS数据段寄存器。8086架构中CS和BS 都是基地址。代码段,数据段偏移地址分别放在ip寄存器和通用寄存器。基地址+偏移地址=要加载(代码或数据)。8086的地址总线为20位,寄存器为16位,所以计算目标位置函数=(CS或DS)寄存器中值<4位+通用寄存器的值或IP寄存器中
d. 32位cpu CS,DS存放的不是基地址,是寻找基地址的指针
操作系统引导
a. BIOS通电,检查硬件设备
b. 加载0x7c00 启动boot.img,boot.img 加载core.img,boot.img将控制权交给disboot.img,执行lzma_decompress.img(建立分段分页,打开地址线)。执行kernel.img,最后启动内核
linux内核启动
a. 内核入口在init/main.c文件中start_kernel()
b. start_kernel启动了init_task第一个进程pid=0的任务。接着是启动trap_init()中断管理,mm_init()内存分配,shed_init()进程调度
c. 最后进入reset_init(),通过kernel_thread 初始化kernel_init用户态进程pid=1和kthreadadd内核态进程pid=2。