linux操作系统内核引导程序详细剖析

linux操作系统内核引导程序详细剖析

ID:14382258

大小:60.50 KB

页数:36页

时间:2018-07-28

linux操作系统内核引导程序详细剖析_第1页
linux操作系统内核引导程序详细剖析_第2页
linux操作系统内核引导程序详细剖析_第3页
linux操作系统内核引导程序详细剖析_第4页
linux操作系统内核引导程序详细剖析_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。