⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.txt

📁 一份精简的linux内核源代码
💻 TXT
字号:
bootsect.s   :磁盘引导程序
head.s       :32位运行启动代码程序
将内核代码段和数据段都设置为16MB
setup.s      :获取BIOS中参数

此3个文件将内核从块设备加载到内存;探测系统配置参数;为进入32位保护模式做准备
linux中创建新进程使用fork()系统调用,所有进程都是通过复制进程0而得到的。
引导程序把内核从磁盘上加载到内存中,并让系统进入保护模式下运行后,就开始执行系统初始化程序init/main.c。该程序首先确定如何分配使用物理内存;然后调用内核各个部分的初始化函数分别对内存管理、中断处理、块设备和字符设备、进程管理及硬盘和软盘硬件进行初始化处理。完成上述操作后,系统的各部分已经处于可运行状态。此后程序把自己“手工”移动到任务0中运行,并使用fork()调用首次创建出进程1。在进程1中程序将继续进行应用环境的初始化并执行shell登录程序。而原进程0则会在系统空闲时被调度执行,此时任务0仅执行pause()系统调用,并有会调用调度函数。
“移动到任务0中执行”这个过程由宏move_to_user_mode(include/asm/system.h)完成。它将main.c程序的执行流从内核态移动到了用户态的任务0中继续运行。
内核初始化代码也即是任务0的代码(main.c也是任务0的代码)。只是开始时,运行在任务0的内核态,而宏move_to_user_mode将任务0转回了用户态。
CPU允许低级的代码(用户态)通过中断、门、陷阱门来调用或转入高级的代码(内核态,系统调用),反之则不然。
一般流程:用户态程序通过中断进入内核态,完成调用后再返回用户程序。而linux初始化时,任务0一开始就处于内核态,通过模拟iret中断返回指令来进入用户态(思想:手动的在堆栈中构筑中断返回指令所需要的内容,如把返回地址的段选择符设为任务0的段选择符)。

bootsect.s和setup.s是实模式下运行的16位代码,head.s在保护模式下运行。

开机时的总体流程:
linux系统启动时的主要流程:当pc的电源打开后,80x86结构的cpu将自动进入实模式,并自动从地址0xffff0处开始执行程序(该位置为rom bios中的地址,即开始执行bios程序)。首先bios将进行系统检测,并在物理地址0处初始化中断向量,此后,将引导扇区(bootsect.s)读入内存0x7c00处,并跳转到这个地方开始执行。
bootsect.s的主要流程:把自己移到到0x90000处,并把启动扇区后2kb字节(setup.s)读入内存0x90200处,然后识别主机的某些特性(通过rom bios中的中断调用来获得(其idt位于0x0000处,大小为1kb),故一开始不能将bootsect直接加载到0x0000处),随后在屏幕上显示“loading system...”,随后内核的其它部分(system模块)则被读入到0x10000处,随后确定根文件系统设备号,此后bootsect.s将控制权交给setup.s。
setup.s主要流程:利用ROM BIOS中断读取系统参数并将其覆盖掉bootsect。然口将整个系统(system模块,head.s在该模块的开始处)从0x10000移动到0x0000处(覆盖了原来系统初始化时设置的中断向量表),然后加载中断描述符表寄存器(idtr)和全局段描述符表寄存器(gdtr),开启A20的地址线,重新设置两个8259A芯片,将硬件中断号重新设置为0x20--0x2f。最后设置cpu的CR0寄存器,进入保护模式,并跳转至head.s(即0x0000处)。
head.s的主要流程:首先加载各个数据段寄存器,重新设置idt表,共256项,并使各表项均指向一个只报错的哑中断子程序ignore_int,随后重新设置gdt表(其实就是将原表移到适当的位置),接着检测A20地址线是否开启,接着检测PC中是否含有数学协处理器,接着打开分页机制(页目录及4页页表,存于物理地址0开始处,即覆盖了head.s),并设置它们的表项,最终调用main(利用返回指令将堆栈中预先放置的main.c的入口地址弹出)。

仅在内存中加载上述模块还不能使linux运行起来,还需要一个文件系统,即根文件系统(在bootsect.s的43行处定义了根文件系统的默认块设备号)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -