好文档 - 专业文书写作范文服务资料分享网站

怎样读Linux内核源代码

天下 分享 时间: 加入收藏 我要投稿 点赞

4.接下来就到了load_setup子过程;它调用0x13中断的第2号服务;把第0道第2扇区开始的连续的setup_sects (为常量4)个扇区读到紧邻bootsect的内存区;,即0x9000:0x0200开始的2048个字节;而这四个扇区的内容即是/arch/i386/boot/setup.S编译连接后对应的二进制代码; 也就是说,如果要用bootsect-loader进行系统引导,不仅必须把bootsect.S编译连接后对应的二进制代码置于MBR,而且还得把setup.S编译连接后对应的二进制代码置于紧跟MBR后的连续的四个扇区中;当然,由于setup.S对应的可执行码是由bootsect装载的,所以,在我们的这个项目中可以通过修改bootsect来根据需要随意地放置setup.S对应的可执行码;

5.load_setup子过程的唯一出口是probe_loop子过程;该过程通过枚举法测试磁盘“每个磁道的扇区数”;

6.接下来几个子过程比较清晰易懂:打印我们熟悉的“Loading”;读入系统到

0x1000:0x0000; 关掉软驱马达;根据的5步测出的“每个磁道的扇区数”确定磁盘类型;最后跳转到0x9000:0x0200,即setup.S对应的可执行码的入口,将机器控制权转交setup.S;整个bootsect代码运行完毕;

3. 引导过程执行完后的内存印象图:

出于简便考虑,在此分析中,我忽略了对大内核的处理的分析,因为对大内核的处理,只是此引导过程中的一个很小的部分,并不影响对整体的把握。完成了系统的引导后,系统将进入到初始化处理阶段。系统的初始化分为实模式和保护模式两部分。

II、实模式下的初始化

实模式下的初始化,主要是指从内核引导成功后,到进入保护模式之前系统所做的一些处理。在内核源码中对应的程序是 /Arch/i386/boot/setup.S;以下部分主要是针对此文件进行的分析。这部分的分析主要是要弄懂它的处理流程和INITSEG(9000:0000)段参数表的建立,此参数表包含了很多硬件参数,这些都是以后进行保护模式下初始化,以及核心建立的基础。

1. 几个其它相关文件: <1> /Arch/i386/boot/bootsect.S

<2> /include/linux/config.h

<3> /include/asm/boot.h

<4> /include/ asm/segment.h

<5> /include/linux/version.h

<6> /include/linux/compile.h

2. 实模式下的初始化过程分析:

INITSEG(9000:0000)段参数表:(参见Include/linux/tty.h)

参数名

偏移量(段址均为0x9000) 长度Byte

参考文件

PARAM_CURSOR_POS 0x0000 2

Arch/i386/boot/video.S extended mem Size 0x0002 2

Arch/i386/boot/setup.S

0x0004 2

Arch/i386/boot/video.S PARAM_VIDEO_MODE 0x0006 1

Arch/i386/boot/video.S PARAM_VIDEO_COLS 0x0007 1

Arch/i386/boot/video.S 没用 0x0008 2

Include/linux/tty.h PARAM_VIDEO_EGA_BX 0x000a 2

Arch/i386/boot/video.S 没用 0x000c 2

PARAM_VIDEO_PAGE

怎样读Linux内核源代码

4.接下来就到了load_setup子过程;它调用0x13中断的第2号服务;把第0道第2扇区开始的连续的setup_sects(为常量4)个扇区读到紧邻bootsect的内存区;,即0x9000:0x0200开始的2048个字节;而这四个扇区的内容即是/arch/i386/boot/setup.S编译连接后对应的二进制代码;也就是说,如果要用bootsect-loader
推荐度:
点击下载文档文档为doc格式
5dvvp0e00a3y3j84w1kq
领取福利

微信扫码领取福利

微信扫码分享