欢迎来到天天文库
浏览记录
ID:14382258
大小:60.50 KB
页数:36页
时间:2018-07-28
《linux操作系统内核引导程序详细剖析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux操作系统内核引导程序详细剖析发信人:seis(矛),信区:Linux标题:Linux操作系统内核引导程序详细剖析发信站:BBS水木清华站(FriFeb214:12:432001) 这段程序是Linux操作系统启动boot程序,其思想原理可参看本人翻译的《Linux内核漫游》一篇。中文注释:赵炯gohigh@shtdu.edu.cnwww.freedove.com!bootsect.s(c)1991,1992LinusTorvalds版权所有!DrewEckhardt修改过!BruceEvans(bde)修
2、改过!!bootsect.s被bios-启动子程序加载至0x7c00(31k)处,并将自己!移到了地址0x90000(576k)处,并跳转至那里。!!bde-不能盲目地跳转,有些系统可能只有512k的低!内存。使用中断0x12来获得(系统的)最高内存、等。!!它然后使用BIOS中断将setup直接加载到自己的后面(0x90200)(576.5k),!并将系统加载到地址0x10000处。!!注意!目前的内核系统最大长度限制为(8*65536-4096)(508k)字节长,即使是在!将来这也是没有问题的。我想让它保持简单
3、明了。这样508k的最大内核长度应该!是足够了,尤其是这里没有象minix中一样包含缓冲区高速缓冲(而且尤其是现在!内核是压缩的:-)!!加载程序已经做的尽量地简单了,所以持续的读出错将导致死循环。只能手工重启。!只要可能,通过一次取得整个磁道,加载过程可以做的很快的。#include/*为取得CONFIG_ROOT_RDONLY参数*/!!config.h中(即autoconf.h中)没有CONFIG_ROOT_RDONLY定义!!!?#include.textSETUPSECS=4!默认的setup程序扇区数(s
4、etup-sectors)的默认值;BOOTSEG=0x7C0!bootsect的原始地址;INITSEG=DEF_INITSEG!将bootsect程序移到这个段处(0x9000)-避开;SETUPSEG=DEF_SETUPSEG!设置程序(setup)从这里开始(0x9020);SYSSEG=DEF_SYSSEG!系统加载至0x1000(65536)(64k)段处;SYSSIZE=DEF_SYSSIZE!系统的大小(0x7F00):要加载的16字节为一节的数;!!以上4个DEF_参数定义在boot.h中:!!DE
5、F_INITSEG0x9000!!DEF_SYSSEG0x1000!!DEF_SETUPSEG0x9020!!DEF_SYSSIZE0x7F00(=32512=31.75k)*16=508k!ROOT_DEV&SWAP_DEV现在是由"build"中编制的;ROOT_DEV=0SWAP_DEV=0#ifndefSVGA_MODE#defineSVGA_MODEASK_VGA#endif#ifndefRAMDISK#defineRAMDISK0#endif#ifndefCONFIG_ROOT_RDONLY#define
6、CONFIG_ROOT_RDONLY1#endif!ld86需要一个入口标识符,这和通常的一样;.globl_main_main:#if0/*调试程序的异常分支,除非BIOS古怪(比如老的HP机)否则是无害的*/int3#endifmovax,#BOOTSEG!!将ds段寄存器置为0x7C0;movds,axmovax,#INITSEG!!将es段寄存器置为0x9000;moves,axmovcx,#256!!将cx计数器置为256(要移动256个字,512字节);subsi,si!!源地址ds:si=0x07C0:
7、0x0000;subdi,di!!目的地址es:di=0x9000:0x0000;cld!!清方向标志;rep!!将这段程序从0x7C0:0(31k)移至0x9000:0(576k)处;movsw!!共256个字(512字节)(0x200长);jmpigo,INITSEG!!间接跳转至移动后的本程序go处;!ax和es现在已经含有INITSEG的值(0x9000);go:movdi,#0x4000-12!0x4000(16k)是>=bootsect+setup的长度+!+堆栈的长度的任意的值;!12是磁盘参数块的大小
8、es:di=0x94000-12=592k-12;!bde-将0xff00改成了0x4000以从0x6400处使用调试程序(bde)。如果!我们检测过最高内存的话就不用担心这事了,还有,我的BIOS可以被配置为将wini驱动表!放在内存高端而不是放在向量表中。老式的堆栈区可能会搞乱驱动表;movds,ax!置ds数据段为0x9000;movss
此文档下载收益归作者所有