从内核代码初探Linux的启动过程(一)

      在开始之前想先聊点儿闲话。最近在学习Linux内核,看了好多书。这篇随笔写于开始学习Linux内核三个月之后,内核代码是Linux Version0.12版本,大概是最早的那个版本,选用的主要资源是赵炯老师编写的《Linux内核完全剖析——基于0.12内核》,写的很详细,受益匪浅。开始阅读的时候困难相当大,概述部分不想多说,开始的几章大概就是介绍了Linux的发展,linux是怎么发展起来的,都是那些人组织了这个开源系统的开发,世界广大linux爱好者的努力。。。然后就是阅读代码前的知识准备,计算机组成原理,编程语言语法及编译环境,80X86CPU保护模式和编程,Linux内核体系结构。然后就真正的开始阅读内核代码了。前五章(准确的说是四章)笔者花掉了近2个月的内容来阅读,这段时间笔者的大部分时间用在了复习大二上学期计算机组成原理课程还有自学汇编语言和CPU工作原理,当时自己觉着学的不错的内容真到了学习这本书的时候真心觉着什么都不知道。这些内容相信来关注这篇随笔的IT人对前面我所说的内容都是比较精通,在以后的内容发现不正确的内容希望各位前辈指点迷津~(在此笔者先说声谢谢)。如果是和笔者一样也在正学习的过程中,笔者希望您能自己去网上去图书馆找资料踏踏实实的打下这个基础,真心重要。好了吧闲话就到此为止吧,下面我们开始今天的主题内容——Linux启动引导程序原理及实现(初探Linux内核代码之linux/boot/bootsect.S)。

首先,介绍下今天要研究的文件,bootsect.S这个文件是用8086汇编语言编写的,是Linux的最前面的一部分,计算机接通电源后这个文件将有BIOS读入到内存绝对地址0X7C00(31kb)处,但是当这段程序被执行时,它又会把自己从这个地址移动(或者说复制)到内存绝对地址0X90000(576KB)处,并将启动设备盘中后2KB代码(boot/setup.S)读入到内存中绝对地址为0X90200处,而内核的其他部分(system模块)被读入到从内存地址0X10000(64KB)开始处,由于我们所研读的linux内核版本的system模块长度并不大,不会超过512KB因此并不会覆盖掉0X90000的内容。在整个加载内容的过程中屏幕中显示  Loading......  全部加载完成后,控制权便不再归bootsect.S所有。而今天我们讨论的就是这个加载的过程。首先把代码展示下吧,这里笔者分析的只是笔者不太明白的部分,希望前辈们看到了给予指点,同等水平的看到了共同研究进步吧。

SETUPSECTS      = 4                    
BOOTSEG         = 0x07C0               
INITSEG         = DEF_INITSEG  !(0x9000)
SETUPSEG        = DEF_SETUPSEG !(0x9020) 
SYSSEG          = DEF_SYSSEG   !(0x1000) 
SYSSIZE         = DEF_SYSSIZE  !(0x7F00) 


ROOT_DEV        = 0
SWAP_DEV        = 0 !设备使用设置


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
start:
        !具体移动方法
        mov ax,#BOOTSEG
        mov ds,ax
        mov ax,#INITSEG
        mov es,ax
        mov cx,#256
        sub si,si !si寄存器置空
        sub di,di !di寄存器置空
        rep
        movw
        

        jmpi go,INITSEG !移动完成,跳转到新的内存地址继续执行
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!到此完成了自身的移动并跳转执行

上面代码中文件包含没有给出,不过个变量代表的实际值已经在注视中给出,实际上文件包含了#include<linux/config.h>

 

 

posted @ 2013-03-22 17:23  shockingli  阅读(345)  评论(0编辑  收藏  举报