Linux源码学习笔记day4 操作系统怎么把自己弄到内存里的?
上次已经学到了 CPU为访问内存做好了准备,把一些重要寄存器的值都设置好了。
今天我们主要一起学习,操作系统是如何把自己从硬盘给弄到内存里的?
现在的状态已经把ds,es,cs设置好了,从CPU的角度看,已经知道如何访问内存了。
其它的操作系统代码
我们接着看下面的代码
load_setup:
mov $0x0000, %dx # drive 0, head 0
mov $0x0002, %cx # sector 2, track 0
mov $0x0200, %bx # address = 512, in INITSEG
.equ AX, 0x0200+SETUPLEN
mov $AX, %ax # service 2, nr of sectors
int $0x13 # read it
jnc ok_load_setup # ok - continue
mov $0x0000, %dx
mov $0x0000, %ax # reset the diskette
int $0x13
jmp load_setup
这里除了mov 和 jmp,还有一种新的指令:int。 这个int 指令是代表中断, int 0x13 就是 发起0x13号中断。
中断之前 先把ax,bx,cx,dx 这四个寄存器都赋上值了。 因为中断程序需要这四个寄存器作为参数。 还有另一种传参方式,通过栈来传递参数。
所谓中断,就是打断原有的指令执行的顺序,让我们去处理这个中断信息,上面这个案例是13号中断,那13号中断程序的段地址和偏移量怎么获得呢?又需要到中断向量表里来查找。
具体可以查看 《汇编语言》
好,简单介绍了中断后,我们继续回到代码上来看。 发起13号中断后,就会去中断向量表找到13号中断程序的地址,然后跳转过去执行,感觉有点像执行一个函数。
13号中断程序是BIOS写好的,就是读取硬盘的函数。随着我们阅读越来越多的代码,也会接触到更多的中断程序,各模块会注册自己的中断处理程序。
结合注释看出这段代码的作用: 从硬盘的第2个扇区开始,把数据加载到内存的0x90200处(正好跳过 上一节说的那512个字节),加载4个扇区。
大致如下图所示:
这里可能是加载古老的软盘的逻辑,因为软盘早已消失在历史的长河里了,所以就当作硬盘来看吧!
再往下看就是2个跳转指令jnc和jmp。 成功了就跳转到 ok_load_setup 去执行。 失败的话就继续跳转到 load_setup 标签执行,就是失败重试。
那我们接着看成功的逻辑
.equ SETUPSEG, 0x9020 # setup starts here
.equ SYSSEG, 0x1000 # system loaded at 0x10000 (65536).
ok_load_setup:
……
mov $SYSSEG, %ax
mov %ax, %es # segment of 0x010000
call read_it
call kill_motor
……
ljmp $SETUPSEG, $0
这里只留下了几行核心逻辑的代码。 就是从 把硬盘的第6个扇区到240个扇区,加载到内存0x10000处。 和上面从硬盘复制是一样的。
等操作系统的代码都加载到内存中后, 又通过ljmp 0x9020,0 跳转到0x90200处,也就是第二扇区开始的地方。
这里的内容就是 setup.s 这个文件了。
编译过程
在看setup.s之前,先回顾下操作系统的编译过程: 通过Makefile和build.c达到这样的目的:
- 把bootsect.s编译成bootsect 并放到硬盘的1扇区。
- 把setup.s编译成setup并放到硬盘2-5扇区。
- 把剩下的代码编译成system,并放在硬盘的随后的240个扇区。
- 我们接下来要看的0x90200处的代码就是第二扇区的setup二进制文件的内容。 期待下一次与你一起揭开setup.s的神秘面纱。
相关文章
- 构建 Linux 游戏服务器:探索源码之路(linux游戏服务器源码)
- 快速掌握Linux内存查看方法(linux查看内存排序)
- 如何在双系统中删除Linux(双系统怎么删除linux)
- Linux硬件配置:实施与优化(linux硬件配置)
- 查看Linux内存命令:简单明了(查看linux内存命令)
- Linux系统监控进程内存使用情况(linux监控进程内存)
- 向Linux命令添加无声运行(让linux命令后台运行)
- Linux环境下内存泄漏检测实战(内存泄漏检测linux)
- 如何使用Linux编写Shell脚本(linux编写sh文件)
- 深入探索Linux系统中进程调度算法(linux进程调度算法)
- Linux源码:在线查看与分析(linux源码在线)
- Linux的分支:开源发展之路(linux的分支)
- Linux的发展历程:从单一版本到多分支(linux的分支)
- Linux发展之路:多元分支(linux的分支)
- 如何通过自学快速掌握Linux技能(怎么自学linux)
- 欢庆Linux上机考试开考啦!(linux上机考试)
- 深入探索Linux驱动程序源码,打造稳定高效的系统(linux驱动程序源码)
- Linux 源码下载:一步到位(linux下载源码)
- 损坏Linux文件头损坏:不可忽视的风险(linux文件头)
- Linux系统内存分析指南(linux内存分析)
- 从终端窗口登录Linux:掌握Linux系统命令(linux系统命令登录)
- Linux下的上网行为如何进行管理?(linux上网行为管理)
- 如何选择适合自己的Linux服务器?(linux服务器选择)
- 25字中文文章标题:Linux版本显示命令(显示linux版本命令)
- 如何在Linux命令行下配IP:入门指南(linux命令行配ip)
- Linux源码安装指南:从源码构建你的操作系统(linux 安装源码)
- Linux:优化内存管理技术(linux 内存模型)
- Linux下快速打印文件夹内容(linux打印文件夹)
- Linux系统下建立内存镜像,解决崩溃问题(linux内存镜像)
- Linux:面对零基础,勇闯未知领域(linux零基础)