linux加电开机启动的第一个动作,Linux内核设计的艺术(第一章,从开机加电到执行main函数之前的过程)...

一、启动BIOS,准备实模式下的中断向量表和中断服务程序

【实模式】一个20位的存储器地址空间(1M),可以直接通过软件的方式访问BIOS以及周边硬件,没有硬件支持的分页机制和实时多任务的概念,CPU的开机状态都是实模式。

1在RAM中什么程序也没有的时候,BIOS来完成加载软盘中操作系统的任务。

2 【BIOS的启动原理】BIOS程序由硬件执行,CPU的硬件都设计为加电即进入16位实模式状态运行,同时,将CPU的硬件逻辑设计为加电瞬间强行将CS置为0xFFFF,IP置为0x0000,这样CS:IP就指向0xFFFF0这个地址位置。这是一个纯硬件完成的动作,BIOS程序的入口地址恰恰是0xFFFF0。

3 【BIOS在内存中加载中断向量表和中断服务程序】BIOS在内训最开始的位置(即0x00000)用1KB的空间构建中断向量表,用紧挨着它的位置用256字节构建BIOS数据区,在这之后加载了8KB左右的与中断向量表相应的中断服务程序。中断向量表有256个中断向量,每个4个字节,其中两个字节是CS,两个是IP。

二、加载操作系统内核程序并为保护模式做准备

1 【第一批】由BIOS终端int 19把第一扇区(512B)bootsect的内容加载到内存0x07C00处。这个扇区的内容就是Linux0.11操作系统的引导程序,作用就是把软盘中的操作系统程序载入内存,第一扇区中的程序是由bootsect.s中的汇编语言汇编而成。

2 【第二批】操作系统的设计者要全面、整体地考虑内存的规划。将bootsect从0x07C0复制到0x9000.接着就会将setup程序(从第二扇区开始一共4个扇区)加载到内存中(紧接着bootsect代码后面0x90200处)(应用int13中断)。

3 【第三批】接下来bootsect程序(仍然是int13中断)将系统模块载入内存。将第六扇区开始的240个扇区的system模块加载进内存。这时候会在屏幕上显示Loading system…(通过汇编而不是C语言实现)。

4 setup的作用就是将机器的系统数据加载到bootsect中(回收利用)。

三、开始向32位模式转变,为main函数的调用做准备

1 关中断,setup将位于0x10000的内核程序拷贝到内存地址起始位置0x00000处。

一箭三雕:

A 废除BIOS的中断向量表,等价于废除了BIOS提供的实模式下的中断服务程序

B 收回使用寿命刚刚结束的程序占用的内存空间

C 让内核代码占据内存物理地址开始的,最天然的,最有利的位置。

2 setup设置中断描述符表和全局描述符表

3 打开A20,实现32位寻址,意味着CPU可以进行32位寻址,最大寻址空间为4GB。

4 为在保护模式下执行head.s做准备,setup对可编程中断控制器8259A进行重新变成。

5 head.s开始执行。先将head.s汇编成目标代码,将用C语言编写的内核程序编译成目标代码,然后连接成system模块。head程序在前,内核程序在后,head程序在内存中占有25KB+184B空间。

【重点】:head程序做了一件对内核程序在内存中的布局及内核程序的正常运行有重大意义的事,即用程序自身的代码在程序自身所在的内存空间创建了内核分页机制,即在0x000000的位置创建了页目录表、页表、缓冲区、GDT、IDT,并将head程序已经执行过的代码所占的内存空间覆盖,意味着head自己将自己废弃,main函数即将开始执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值