上回书说到了些原因及环境准备,本书将说说我们将要设计的小系统的划分。
我们的小系统整体上分为MBR, LOADER, KERNEL, USER_APP,至于这些个东西是个什么玩意,别急,下面我会隆重介绍下,准备好你们的小板凳,坐好。
MBR:系统上电后第一个加载 的程序, 存放在磁盘0.一般前446字节保存代码,后64字节为分区表信息,最后两个字节标明MBR(0xaa55);它的命令是加载 Loader到内存,并将运行权利交由loader,然后就game over. 它的大小为512字节,工作在实模式。
LOADER:由mbr加载,它的功能是加载会加载core到内存,开启保护模式,突破内存0x100000的访问限制。loader我们限定不超过64K,
CORE:通过loader加载到内存,主要完成:1.内部中断处理,2.打开页功能 3.程序调度 等其它功能。它的大小不固定
USER-APP:用户程序,开始验证时代码中固定,后面通过终端加载来动态实现 。
它们的调用关系如下:
这里有同学会发现上面说到mbr会工作在实模式,loader /core/app会工作在保护模式,这两个模式是什么意思?下面和大家一起研究研究。
实模式:这里面的实可不是老实的意思,其实,这种模式可是一点都不老实,大大的狡猾。这么说吧,在这个模式下,你想干嘛就干嘛,看谁不爽就可以伸脚踹,可以随意访问空间,随意修改代码,大家都是赤裸相待,有什么东西都看的一清二楚,就像活在原始社会,没有约束,自由自在。Just follow your heart. 但这个模式就像原始社会人的活动范围一样,是受限制的(最大访问1M内存,再多也不好意思,用不了,就像新大陆一样,你知或者不知,它都在那里)。毕竟吃都吃不饱,哪里有力气瞎逛。
保护模式:实模式的升级版本,原始社会进化的产物。说白了,你愿意你们家的大门向谁都敞开吗?进来吃你家的,喝你家的,关键手脚还不老实,一对老鼠绿豆王八眼还贼兮兮的看着你的老婆!如果你这都可以忍受,请把你家的地址告诉我(当然我不是老鼠绿豆王八眼)!当你受够了实模式下的担惊受怕后,不妨引入保护模式,这个模式化对所有的人都划定的条条框框,没有你的允许,不许乱伸手伸脚,连你们家的大门地址都摸不到!这要是搁宋朝,那哪还有西门大官人什么事啊,我们的大郎也不要喝药了,宋江那帮反贼也就歇菜了。当然这个模式也有好处,就是活动范围广了,理论上你可以在4G的范围内逛。
还有就是为什么要引入Loader,直接一步到位引入core企不是更好?如果我说是为了展示我那二逼的编程能力,你们估计板凳口水都上来了。其实这也是无奈。MBR只有512个字节。随便加点指令就满了,搞不好连分区信息表都要占用掉(当前也不是没有办法,就是繁琐点,把mbr拆分成几段,加载 Mbr时,第一件事就把自己剩余的部分都加载内存中,有兴趣的可以后面尝试下,但不要把mbr标识符占用掉)。
既然要运行程序 ,必然在内存中进行,我们当前把内存分布按照如下进行。
加载MBR后的内存分布(MBR固定从0x7C00处加载, 512字节)
地址 | 说明 |
0x100000及以上 | 别想了,我们的MBR访问不了。。 |
0xFFFFF | 设备映射区 |
0xA0000 | |
0x9FFFF | 暂时未用 |
0x7E00 | |
0x7DFF | MBR |
0x7C00 | |
0x7BFF | 暂时未用 |
0x400 | |
0x3FF | 中断向量表(IVT) |
0x0 |
2.加载loader后的地址
地址 | 说明 |
0x100000及以上 | 开保护后,可以访问。 |
0xFFFFF | 设备映射区 |
0xA0000 | |
0x9FFFF | 暂时未用 |
0x20000 | |
0x1FFFF | Loader |
0x10000 | |
0xFFFF | 暂时未用 |
0x7E00 | |
0x7DFF | MBR(这块可回收了) |
0x7C00 | |
0x7BFF | 暂时未用, |
0x400 | |
0x3FF | 中断向量表(IVT)(这块可回收了) |
0x0 |
在进入loader后,mbr所有的区域可以回收;在打开保护模式时,会先关闭中断,IVT区域也可以回收了。
地址 | 说明 |
0x100000及以上 | 开保护后,可以访问。 |
0xFFFFF | 设备映射区 |
0xA0000 | |
0x9FFFF | 暂时未用 |
0x20000 | |
0x1FFFF | Loader |
0x10000 | |
0xFFFF | 暂时未用 |
0x0 |
3.加载core,理论上core在loader打开保护模式后加载 的,因此可以加载到内部可用的任何内存处。
地址 | 说明 |
0x100000及以上 | 开保护后,可以访问。 |
0xFFFFF | 设备映射区 |
0xA0000 | |
0x9FFFF | kernel |
0x20000 | |
0x1FFFF | Loader |
0x10000 | |
0xFFFF | 暂时未用 |
0x0 |
在内核运行后,loader的使命就over了,它的空间释放
地址 | 说明 |
0x100000及以上 | 开保护后,可以访问。 |
0xFFFFF | 设备映射区 |
0xA0000 | |
0x9FFFF | kernel |
0x20000 | |
0x1FFFF | 暂时未用 |
0x0 |
4.加载用户程序 ,与core一样,可以加载到任何位置,具体 的位置将由core指定
当前除了mbr的起始地址外,剩余的地址你自己都可以随意指定,毕竟你的地盘你做主。
时间不早了,下回书我们聊聊我们的文件系统作用及它的实现,
好了。都散了吧,回去看看你们家大门有没有关好。