《linux_bootsect_计算机软件及应用_IT计算机_专业资料》由会员分享,可在线阅读,更多相关《linux_bootsect_计算机软件及应用_IT计算机_专业资料(27页珍藏版)》请在金锄头文库上搜索。
1、linux 0.11内核学习一 bootsect.s,万里长征第一 步呵呵,终于将linux 0.11下面的boot文件夹下的三个文件读完,下面是相关注释,没有汇编基础的人也是可以读的。废话少说,下面就是linux的源码了。参考资料Linux内核完全注释.pdf网上相关资料!时间:2010-1-14!工作:阅读linux 0.11源码中的bootsect.s!总体linux启动过程如下:I!当PC得电源打开之后,80x86结构的CPU将自动进入实时模式,并且从OxFFFFO开始自动执行程序代码,这个地址通常是!ROM-BIOS的地址。PC机的BIOS将执行系统的检测,并且在物理地址的0处开始初
2、始化中断向量。此后,它将可启动设备的第一!扇区(512字节)读入内存的绝对地址0x7c00处z并且觀匕转到这个地方。启动设备通常是软盘或者是硬盘。这里的叙述是很简单 !的,但是这已经足够理解内核的初始化的工作过程。!linux的0x9000由BIOS读入到内存的绝对地址0x7c00(31k)处,当它被!执行时就会把自己移动到绝对地址0x90000处并把启动设备中后2kb字节代码(boot/setup.s) 读入到内存0x90200处,而内核的!其他部分则被读入到从地址0x10000的开始处。在系统的加载期间显示信息?Loading.;然后 将控制权传递给boot/setup.s中!的代码这是另
3、一个实时模式汇编程序。I!系统启动部分识别主机的某些特性以及vga卡的类型。如果需要,它会要求用户为控制台选择 显示模式。然后整个系统从地址!0xl0000移至0x0000处,进入保护模式病期匕转至系统的余下部分。此时所有的32位运行方 式的设置启动被完成:idt,gdt,ldt被!加载,处理器和协处理器也确认,分页的工作也设置好了。最终将调用init/main.c中的main 程序。上述的操作的源代码是在!boot/head.s中的。这可能是整个内核中最有诀窍的代码了。注意如果在上述任何一步中出现 了一步错误。计算机就会死锁。在!操作系统还没有完全运转之前是处理不了错误的。II!bootse
4、c.s文件说明如下:fbootsec.s代码是磁盘的引导块程序,驻留在磁盘的第一扇区。在PC机加电rom bios自检之 后,引导扇区由bios加载到内存0x7c00 !处,然后将自己移动到内存0x90000处。该程序的主要作用是首先将setup模块从磁盘加载到 内存中,紧接着bootsect的后面位置!(0x90200)撚后利用bios中断0x13中断去磁盘参数表中当前引导盘的参数,然后在屏幕上显 示Loading system.字符串。再者!将system模块从磁盘上加载到内存0x10000开始的地方。随后确定根文件系统的设备号,如 果没有指走,则根据所保存的引导盘的每!类型和种类并保存设
5、备号与boot.dev,最后长跳转到setup程序开始处0x90200执行setupII!注释如下:I! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x3000 is 0x30000 bytes = 196kB, more than enough for current! versions of linuxiSYSSIZE = 0x3000I!以下是这一段代码的翻译。! bootsect.sfbootsect.s被bios启动程序加载至0x7c00 31k处,并将自己移动到地址0x90000 576k处,并跳转到那里。
6、!它然后利用bios中断将setup直接加载到自己后面0x90200 576.5k ,并将system加载到地 址 0x10000处。I!注意:目前的内核系统最大的长度限制为8*65536 512k字节,即使是在将来这也应该没有问 题的。我想让他保持简单明了,!这样512k的最大内核长度应该足够了 ,尤其是这里没有向minix中一样包含缓冲区高速缓冲。!加载程序已经做的足够简单了,所以持续的独处错误将导致死循环。只能手工重启。只要可能, 通过一次取岀所有的扇区,加载的!过程可以做的很快.! bootsect.s (C) 1991 Linus TorvaldsI! bootsect.s is l
7、oaded at 0x7c00 by the bios-startup routines, and moves! iself out of the way to address 0x90000/ and jumps therei! It then loads setup directly after itself (0x90200) 256b, and the system! at 0x10000, using BIOS interrupts.! NOTE! currently system is at most 8*65536 bytes long. This should be no! p
8、roblem, even in the future. I want to keep it simple. This 512 kB! kernel size should be enough, especially as this doesnt contain the! buffer cache as in minixi! The loader has been made as simple as possible, and continuos! read errors will result in a unbreakable loop Reboot by hand. It! loads pr
9、etty fast by getting whole sectors at a time whenever possible.!六个全局标示符.globl begtext, begdata, begbss, endtext, enddata, endbss!文本段.textbegtext:!数据段.databegdata:!堆栈段.bssbegbss:!文本段.textSETUPLEN = 4! nr of setup-sectors setup 程序的扇区数(setup-sectors)值BOOTSEG = 0x07c0 ! original address of boot-sector b
10、ootsect 的原始地址INITSEG = 0x9000 ! we move boot here - out of the way 将 bootsect 移动到这里SETUPSEG = 0x9020 ! setup starts here setup 程序开始地址SYSSEG = 0x1000 ! system loaded at 0x10000 (65536).将 system 模块加载到的地址ENDSEG = SYSSEG + SYSSIZE ! where to stop loading 停止加载的地址! ROOT_DEV: 0x000 same type of floppy as b
11、oot.! 0x301 first partition on first drive etcROOT_DEV = 0x306 !根文件系统设备是第二硬盘的第一个分区!0x300 - /dev/hdO!0x301 - /dev/hdlI 0x309 /dev/hd9entry start告知连接程序,程序充start标号开始。start:/!下面的代码是将自身bootsect从目前位置0x07c0 31k移动到0x9000 576k处,然后跳转到本程序的下一条语句处。!此时(在实时模式下)内存使用如下的分布:!0 0x7c00(bootsect.s)!+ + + + + + + + +ids = 0x7c00! 512llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll /bootsect程序块后紧随着加载setup模块。注意es已经设置好了。es是指附加段寄存器。 附加段寄存器是es ,它的作用是很大的.!因为我们在处理数据的时候,往往需要用到两个数据段,特别是在字符串的处理方