haribote&&linux0.11引导程序阅读笔记整理抽取
Posted 资质平庸的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haribote&&linux0.11引导程序阅读笔记整理抽取相关的知识,希望对你有一定的参考价值。
工作日每晚平均两小时周末全勤的那段日子是此文阅读h&&l源码的全部生命力,一些见过这样我的人可能会说他除此外似已无其它爱好。
此文也很绝望啊,因为h&&l只有少数模块仅会花一两晚时间,其余需要此文花一周,两周,三周……时间的阅读量,所得到的以注释为主的笔记也普遍繁长。
此文若在一些人面前主动提到这些笔记,会预先重复承认其当真繁长的话语,因为他们当真繁长啊。就像网上曾流行一时还被部分人采纳过的——不能轻易去进一步了解丑人内涵是因为其丑 这类理论所能描述的那种长。那些注释笔记的长也会让人望长生嫌。
是的,这些注释笔记需要一点整理和抽取。有时候真是想什么来什么,上次所想的源码阅读假真的来了。
另外,作为与此文开头句的呼应——我的爱好在30岁之后将会体现出来,没有个人爱好多让人难为情。
1. 启动区程序运行契口
启动区程序能够被运行是因为其契合了Bios对外呈现的编程入口。
[0] 计算机上电开机启动会跳转执行BIOS程序;
[1] 通过BIOS交互进入参数设置模式下,可设置软盘、硬盘、U盘等外设作为BIOS启动盘;
[2] 默认让BIOS持续被执行,BIOS初始化程序被执行完后 其读取启动区(启动盘第1扇区)到内存地址空间[0x07c00, 0x07e00)对应内存段的程序会被执行;
[3] 若启动区最后两字节分别为0x55和0xAA(0xaa)则(通过跳转指令)跳转0x07c00处开始执行引导程序。
只要契合BIOS执行启动区程序的三点要求,即将一个程序的第511和第512字节的内容设置为0xAA55并将其拷贝到BIOS启动盘的第1个扇区,重启计算机(随着CPU对BIOS的执行)就能让计算机执行该程序。
[1] 进入BIOS参数设置界面设置启动盘。
[2] 将启动源码转换为机器码并写入启动盘启动区。
|--------|
0|........|
1|........|
.|........|
.|........|
.|........|
511|01010101|
512|10101010|
|--------|
启动区程序(机器码视角)
|
|
V
=====================
|bootsector| .......
=====================
启动盘(逻辑扇区视角)
[3] 计算机启动,CPU执行BIOS初始化程序以及BIOS加载引导区的程序。
|---------------------------------------------------------|
| 0|------| |
| | . | |
| ---------------- | . | |
| |CPU executing | | . | |
| | BIOS now | ----> 0x07c00|------| |--------| |
| ---------------- | boot | <---> |physical| |
| | ^ |loader| | memory | |
| | | | | |--------| |
| | | 0x07e00|------| |
| V | | . | |
| |------------| | . | |
| | bootsector | | . | |
| |------------| 0xfffff|------| |
| memory address space |
|---------------------------------------------------------|
计算机(及外设)
2. h&&l启动区引导程序功能总结
在能契合BIOS加载并执行启动区程序条件后,若启动区程序还具备 引导程序这个名字 所描述的功能,该程序就算得上是一个真正意义上的引导程序。看看h&&l引导程序的基本功能吧。
hribote引导程序。
[1] haribote引导程序包含了FAT12保留区域内容;
[2] 将hribote操作系统程序拷贝到指定空闲内存段中并跳转执行被拷贝的操作系统
程序。
linux0.11引导程序。
[1] 将[0x07c00, 0x07e00)内存段内容拷贝到[0x90000, 0x90200)内存段, 随后跳转被拷贝内存段中执行后续未被执行的引导程序;
[2] 拷贝linux0.11操作系统程序到指定空闲内存段中并跳转执行被拷贝的操作系统程序。
3. h&&l引导程序对实模式内存地址空间的使用
BIOS加载引导程序到[0x07c00, 0x07e00)内存段中后,实模式下还有[0x00400, 0x07c00)和[0x07e00, 0xa0000)内存地址空间对应的内存块是空闲可用的([0xa0000, 0x100000)也是空闲可用的,此文此处的意思 你懂的)。此时的内存空间分布简示如下。
0x00000|----------------------------------|
| 1KB RAM |
| BIOS Interrupt vector table etc. |
0x003FF|==================================|----
| | ↑
| bootloader in [0x07c00, 0x07e00) | |
| | available
| 639KB | |
| RAM addr space | |
| | ↓
0x9FFFF|==================================|----
| |
| 128K |
| video card ram addr space |
0xBFFFF|==================================|
| |
| 256KB |
| BIOS ROM addr space |
| |
| |
0xFFFFF|==================================|
看看h&&l分别是如何利用剩余空闲可用内存空间的呢。
[1] haribote
0x00000|----------------------------------|
| 1KB RAM |
| BIOS Interrupt vector table etc. |
0x003FF|==================================|----
| ... | ↑
| | |
| bootloader in [7c00h, 7e00h) | |
| haribote OS in [8200h, 30800h) | |
| | available
| . | |
| . | |
| . | |
| | ↓
0x9FFFF|==================================|----
| |
| 128K |
| video card ram addr space |
0xBFFFF|==================================|
| |
| 256KB |
| BIOS ROM addr space |
| |
| |
0xFFFFF|==================================|
[2] linux0.11
0x00000|----------------------------------|
| 1KB RAM |
| BIOS Interrupt vector table etc. |
0x003FF|==================================|
| ... |
0x10000|----------------------------------|
| linux0.11 OS in [0x10000,0x40000)|
0x40000|==================================|
| ... |
0x90000|----------------------------------|
| bootloader in [7c00h, 7e00h) |
0x90200|==================================|
| setup in [0x90000,0x90200) |
0x90A00|==================================|
| ... |
0x9FFFF|==================================|
| |
| 128K |
| video card ram addr space |
0xBFFFF|==================================|
| |
| 256KB |
| BIOS ROM addr space |
| |
| |
0xFFFFF|==================================|
以上是关于haribote&&linux0.11引导程序阅读笔记整理抽取的主要内容,如果未能解决你的问题,请参考以下文章
haribote&&linux0.11引导程序阅读笔记整理抽取