bootsect.s
我们实验环境中,Image就是一个软驱镜像,bootsect.s就在软驱的第一个磁道中(引导磁道,0扇区,0盘片,第一个磁道)
硬碟有一个单独的镜像文件
BIOSROM假如设置成软驱启动,就把引导磁道的代码加载到0x7C00开始处执行。由于上面的显存保存有有用的信息。
若果是从硬碟启动系统,就不执行bootsect.s。LILO,Grub等多操作系统引导程序来完成bootsect.s的任务。
setup.s
借助BIOSROM中断读取硬件的系统数据linux自启动c程序,并将保存在0x90000的显存,覆盖掉bootsect.s并将system模块(不超过512K)联通到0x00000处,加载中断描述表寄存器,和全局描述符表寄存器,开始A20地址线,设置两个中断控制芯片8259A,将硬件中断号重新设置,最后设置CPU控制寄存器CR0,步入32位保护模式运行。
head.s
在保护模式下运行,与上面的句型不通,采用AT&T汇编语言格式,形参的方向是从左到右。head.s执行后,显存布局如右图,GDT都设置好了,页式管理相关的寄存器显存都设置好了。借助返回指令将预先放置在堆中的/init/main.c程序的入口地址弹出。
system.s
main.c
真正的初始化工作在这儿,对硬件挨个初始化。其中会调用:outb_p等直接和硬件打交道的汇编调用。
手工设置第一个任务task0,完成初始化后linux自启动c程序,内核把自己执行权限切换到用户模式,forkinit进程1。
进程0在创建首个新进程1之前,不能使用其用户态栈。就是要求0不要调用任何函数,用inline解决这个问题。中断调用还是会用到栈,并且用的是内核态的栈linux 虚拟主机,所以没事。
创建进程1后,进程0和1使用相同的栈linux桌面,用的是copyonwriting。
初始化进程的显存使用
Linux所以任务运行在用户态,内核源代码lib/目录下的库文件(不仅string.c),就是为那些新创建的用户态进程提供函数的。内核代码本身不使用这种。
环境初始化,Session概念。