文档章节

linux启动

mskk
 mskk
发布于 2017/05/04 21:20
字数 1082
阅读 1
收藏 0

转自<http://www.docin.com/p-550589514.html>

 

         对于 Intel  x86   PC , 开启电源后, 机器就会开始执行 ROM BIOS 的一系列系统测
试动作,包括检查RAM,keyboard,显示器,软硬磁盘等等。执行完bios 的系统测试之后,
紧接着控制权会转移给ROM 中的启动程序(ROM bootstrap routine);这个程序会将磁盘上的
第 0 轨第 0 扇区 (叫boot sector 或 MBR <Master Boot Record >,系统的引导程序就放在
此处)读入内存中,并放到自 0x07C0:0x0000 开始的 512 个字节处;然后处理机将跳到此处
开始执行这一引导程序;也即装入MBR 中的引导程序后, CS:IP = 0x07C0:0x0000 。加电后
处理机运行在与 8086相兼容的实模式下。
       如果要用 bootsect-loader进行系统引导,则必须把 bootsect.S 编译连接后对应的
二进制代码置于 MBR; 当ROM  BIOS 把 bootsect.S 编译连接后对应的二进制代码装入内存
后,机器的控制权就完全转交给 bootsect; 也就是说,bootsect 将是第一个被读入内存中
并执行的程序。 Bootsect 接管机器控制权后,将依次进行以下一些动作:
 
       1.首先,bootsect 将它"自己"(自位置 0x07C0:0x0000 开始的 512 个字节)从被 ROM
BIOS 载入的地址 0x07C0:0x0000处搬到 0x9000:0000 处; 这一任务由 bootsect.S 的前十条
指令完成;第十一条指令“jmpi               go,INITSEG”则把机器跳转到“新”的 bootsect 的“jmpi
   go,INITSEG”后的那条指令“go: mov di,#0x4000-12”;之后,继续执行bootsect 的剩
下的代码;在bootsect.S 中定义了几个常量:
     BOOTSEG = 0x07C0      bios 载入 MBR 的约定位置的段址;
     INITSEG  = 0x9000     bootsect.S 的前十条指令将自己搬到此处(段址)
     SETUPSEG =0x9020      装入 Setup.S 的段址
     SYSSEG   =0x1000      系统区段址
对于这些常量可参见/include/asm/boot.h 中的定义;这些常量在下面的分析中将会经常用
到;
 
       2.以0x9000:0x4000-12为栈底,建立自己的栈区;其中0x9000:0x4000-12到
0x9000:0x4000 的一十二个字节预留作磁盘参数表区;
 
       3.在0x9000:0x4000-12到0x9000:0x4000 的一十二个预留字节中建立新的磁盘
参数表,之所以叫“新”的磁盘参数表,是相对于bios 建立的磁盘参数表而言的。由于
设计者考虑到有些老的bios 不能准确地识别磁盘“每个磁道的扇区数”,从而导致bios
建立的磁盘参数表妨碍磁盘的最高性能发挥,所以,设计者就在bios 建立的磁盘参数表
的基础上通过枚举法测试,试图建立准确的“新”的磁盘参数表(这是在后继步骤中完成
的);并把参数表的位置由原来的0x0000:0x0078搬到 0x9000:0x4000-12;且修改老的磁
盘参数表区使之指向新的磁盘参数表;
 
       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 代码运行完毕;

 

本文转载自:http://gaylord.iteye.com/blog/2176802

共有 人打赏支持
mskk
粉丝 3
博文 156
码字总数 3099
作品 0
昆山
程序员
私信 提问
rhel7/oel7上修改默认内核启动顺序的方法

rhel7和 rhel6的默认启动顺序的修改方法,不太一样,需要使用grub2来修改。具体如下, 比如想修改 Oracle Linux Server, with Linux 3.10.0-123.el7.x86_64作为默认的启动项, --首先找到各菜...

tututu_jiang
08/31
0
0
Ubuntu11.10 开机启动菜单 删除多余的内核(旧版本) 调整不同操作系统的启动顺序

很多用户一般都会选择Windows + Ubuntu的双系统。用得时间久了,随着Ubuntu内核的不断升级,开机启动菜单会变得越来越臃肿。下面简单介绍一下如何删除开机启动菜单多余的内核(旧版本),以及...

神勇小白鼠
2012/03/27
0
0
双系统恢复linux的grub2系统引导(附带windos、linux双系统安装简要攻略)

00x0 适用情况(亲测有效): 1.双系统,windows重新安装后无法进入grub引导启动linux 2.删除或者重装linux后进入了grub rescue>模式启动不了系统(此情况网上有在此模式下set修改位置修复的...

张豪飞
2015/02/07
0
0
Linux mysql安装修改root密码服务

在向大家详细介绍Linux mysql之前,首先让大家了解下Linux mysql,然后全面介绍Linux mysql,希望对大家有用。 1. Linux mysql安装: $ yum install mysql-server 2. Linux mysql修改root密码...

Zero__One
2012/09/04
0
0
深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo
04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈Redux中间件的实践

最近项目前端开发框架采用React+Redux进行实现,但是,如何异步访问服务器端,以及想要在开发过程中进行状态树日志的输出,所以怎么才能解决这两个问题? 采用Redux中间件 为什么要使用中间件...

peakedness丶
20分钟前
1
0
大数据教程(8.1)mapreduce核心思想

上一章介绍了hadoop的HDFS文件系统的原理及API使用。本章博主将继续对hadoop的mapreduce编程框架进行分享。 mapreduce原理篇 mapreduce是一个分布式运算程序的编程框架,是用户开发“基于had...

em_aaron
27分钟前
0
0
Vue与Node.js通过socket.io通信的示例

#一、Node中socket.io基础 1、是什么 Socket.IO类库,是在服务器和浏览器之间提供一个共享接口,其可以用于实现以下几种通信方式: HTML5中的WebSocket通信 Flash中使用的WebSocket通信 XHR轮...

前端攻城老湿
32分钟前
2
0
JavaScript的组成 | DOM/BOM

往期回顾 在上一期的《JavaScript的组成 | 核心-ECMAScript 》☜里,我们有说到JavaScript 是由三大部分组成,分别是:核心ECMAScript、文档对象模型-DOM、浏览器对象模型-BOM 那么本期就让我...

我的卡
36分钟前
0
0
三, 跨语言微服务框架 - Istio官方示例(自动注入.请求路由.流量控制.故障注入)

基础的Istio环境已经搭建完成,我们需要开始了解Istio提供作为微服务网格的各种机制,也就是本文标题的自动注入.请求路由.故障注入.流量切换,官方很给力的准备的实例项目也不需要大家自己编写d...

喵了_个咪
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部