linux操作系统初始化过程

刚学完这部分,还没有完全理解,不知道会不会有人看到,很希望能和大家一起讨论。靠着自己的理解写的,不知道会不会出错,O(∩_∩)O~

 

(一)linux系统引导过程:“内核代码装入内存执行--->出现"login:"的过程

 

     IBM Pc使用固化在ROM中的bios程序来启动程序。刚开机时,除了rom,系统中所有的硬件设备都处于随机不确定的状态,因此计算机启动很复杂。

     微型计算机有一根对系统进行启动的复位线(RESET),他和系统中所有部件相连。系统上电后,会有脉冲送到复位线上,此时cpu即开始初始化。上电时,只允许在实模式工作(机器状态字PE=0,只能寻找1MB物理地址空间)。此时CS=F000H,IP=0000FFF0H,因此cpu要执行的第一条指令的地址在CS:IP=F000:FFF0=0FFFF0H单元,那么这个单元存放的指令是什么呢?通常是一条转移指令JMP X,而转移地址是启动程序的首地址。

    引导程序代码在arch/i386/boot目录的bootsect.S文件,用汇编语言编写。那么此代码是怎样装入内存的呢?

    cpu执行第一条转移指令,跳转到Post去执行,测试成功后,要先将中断向量装配到内存的低1024个单元中。接着cpu执行19H中断,执行系统初始引导程序,改程序按BIOS设置寻找启动扇区,找到后就将其装入0000:7C00H单元开始的区域,并转到这个地址执行引导程序。

引导过程又分为硬盘引导和软盘引导,他们的过程是不同的。因为具体细节比较繁琐,所以我留到有时间再详细的说一下。

    引导过程结束后,就将其控制权给了setup()函数,它负责实模式下的初始化。此函数的功能主要是代码签名检查并获得进一步初始化所需的各种参数。还有一个功能是从实模式到保护模式的切换,将实模式下的16位指令模式转换为32位的,并将程序控制转移到0x00100000处继续执行。即开始执行start_32()函数。共有两个此函数,第一个用来解压缩系统内核,并对BSS,IDTB页表和页目录等进行初始化,然后又转移到第二个start_32()函数,此函数功能是为0进程建立执行环境。那这个环境是怎样一个环境呢?

    初始化临时中断描述符表,cpu控制寄存器CR0,CR3,CR4的机器状态字,并对页目录,页表进行设置。

    当然以上每一个小段的执行都是一个相当复杂的过程,并不是我说的这样简单。

(二)启动linux内核

    系统调用start_kernel函数时,标志核心程序开始启动并在保护模式下执行linux内核初始化过程。(明天再写吧,坐不住了)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值