linux内核学习篇 --linux内核启动流程

本文详细介绍了计算机启动过程中的内存模式转换(实时模式到保护模式),BIOS与BootLoader的交互,以及Linux内核的加载和运行机制,特别关注了内存管理和同步控制的多种锁机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,从电源启动到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架构存在指令乱序访问内存的可能性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值