版本:Linux-0.11
Linux内核源代码目录结构:
包含14个子目录,共102个代码文件。
1.Makefile文件:
*1*Makefile,是编译辅助工具软件make的参数配置文件,make工具软件的主要用途是通过识别那些文件已被修改,从而自动的决定在一个含有多个源程序文件的程序系统中那些文件需要被重新编译。
该文件描述了整个程序包中各个程序之间的关系,并针对每个需要更新的文件给出具体的控制命令。
2.引导程序启动目录boot:
包含3个汇编语言文件,是内核源代码文件中最先被编译的程序。
*2*bootsect.s代码是磁盘引导块程序,驻留在磁盘第一个扇区中。
主要作用是:
首先将setup模块(由setup.s编译而成)从磁盘加载到内存中紧接着bootsect后面的位置(0x90200)
然后利用bios中断0x13取磁盘参数表中当前启动引导盘的参数,接着在屏幕上显示“loading system…”字符串。
再将system模块从磁盘上加载到内存0x10000开始的地方。随后确定根文件系统的设备号
最后长跳转到setup程序的开始处(0x90200)执行setup程序。
(从硬盘启动时,通常内核映像文件image存放在活动分区的根文件系统中。因此需要知道image处于文件系统中的位置以及是什么样的文件系统)
*3*setup.s程序。
主要作用:
利用bios中断读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖掉bootsect程序所在的位置)
然后将system模块从0x10000-0x8ffff整块移动到内存绝对地址0x00000处。
接下来加载中断描述符表寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线(实现地址线的兼容),(为进入保护模式做准备?)重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20-0x2f。
最后设置cpu的控制寄存器CR0,从而进入32位保护模式,并跳转到位于system模块最前面的head.s程序继续运行。
*4*,head.s
head.s在被编译后会被连接成system模块的最前面开始部分。他处于内存绝对地址0处开始的地方。
作用:
首先加载各个数据段寄存器,重新设置中断描述符表idtr(共256项),并使每个表项均指向一个只报错误的哑中断程序。
然后重新设置全局描述符表gdt。接着使用物理地址0与1MB开始处的内容相比较的方法检测A20地址线是否开启。
然后测试pc机是否含有数学协处理器芯片。并在控制寄存器CR0中设置相应的标志位。
接着设置管理内存的分页处理机制,将页目录表放在绝对物理地址0开始处(覆盖掉自己)。紧随其后放置共可寻址16MB内存的4个页表,
最后利用返回指令将预先放置在堆栈中的/init/main.c程序的入口地址弹出去执行main()。
head.s执行完后,正式完成了内存页目录和页表的设置,并重新设置了内核实际使用的中断描述符表idt和全局描述符表gdt。此时system模块在内存中的详细映像如下图。
系统启动的大致流程:
开机加电后cpu自动进入实模式并从地址0xFFFF0(偏移量寄存器?全1)开始执行指令.该地址一般指向bios中(CMOS\BIOS是一段固化的自检程序),bios开始系统检测并在物理地址0处开始初始化中断向量(?是填写中断向量?),此后将启动设备(现在的硬盘)的第一个扇区读入内存绝对地址0x7C00处,并跳转到这个地方。即执行bootsect.s程序(linux最前面部分是bootsect.s)。bootsect.s执行时将自己移动到绝对地址0x90000处,并把启动设备中后2kb代码(setup.s)读入到0x90200处,而内核其他部分(system模块)被读入从地址0x10000开始处,跳转到setup后,setup将system移动到内存起始处,这样system模块中代码的地址等于实际的物理地址,便于对内核代码和数据的操作。(为什么不一步到位?启动时内存起始处被中断向量表占用。)下图是linux系统启动时内存变化。
系统启动时程序的执行顺序:
3.内核初始化程序目录init
只包含一个main.c文件。
*5*,main.c:
系统在执行完boot/目录中的head.s程序后就将执行权交给main.c。用于执行内核所用初始化工作,然后移到用户模式创建新进程,并在控制台设备上运行shell程序。
(1) main.c先通过setup.s程序取得的系统参数设置系统根文件设备号以及一些内存全局变量。这些内存变量指明了主内存的开始地址,系统拥有的内存容量和作为高速缓存区内存的末端地址。
内核可以自由访问高速缓存,而主内存区中的区域由内存管理模块m m通过分页机制进行管理,使用时只能通过mm。
(2) 然后内核进行所有方面的硬件初始化(调用了其他程序中的初始化部分)。包括陷阱门,块设备,字设备和,tty和人工创建的第一个任务task0.待所有初始化工作完成后就设置中断允许标志,开启中断。
(3) 内核完成初始化后,将执行权限切换到用户模式,即cpu从0