自制操作系统系列(三):加载其他文件执行
代码仓库地址:https://github.com/freedom-xiao007/operating-system
简介
上篇中我们成功将软盘数据读取到内存并显示到屏幕上,接下来我们将加载其他的文件并执行文件代码
新增软件说明
本篇中需要用到相应的软件,Windows 相关的下载链接如下:
git for windows:在本篇中需要拼接其他文件放到镜像文件后面,本文使用的 linux 下的 dd 命令,使用 git 的 bash 窗口可以使用 dd 命令,比较方便
程序整体思路
本次我们将写一个新的 nasm 文件,其功能是清屏并输出文字:Start Loader
在上篇的程序读入内容后,调用我们新的 nasm 文件,然后执行对应的代码
经过这些操作后,我们需要运行的命令也相对比较多了,我们将其整合到一个脚本里面,方便一键运行
大致的步骤如下:
新 nasm 文件编写
原启动 nasm 程序读取软盘数据,执行新的 nasm 文件代码
将相关的命令整合成脚本,方便一键运行
1. 新 nasm 文件编写
想着比较简单,但实际操作还是出现了点问题
首先是 ORG 的地址问题,原来是跟着《30 天写操作系统》书中使用程序加载到内存中的地址,但导致在显示字符串时有问题,经过不断尝试,感觉是地址没有对应上,导致显示了空白字符(知识掌握程度还是不够深,目前还是凭感觉猜测)
后面使用了《一个 64 位操作系统的设计和实现》书的地址,设置比较大的地址,成功显示了,所以猜测是地址的问题
其他的就是从《汇编语言程序设计》书中抄了一个清屏的代码
loader.asm 文件完整代码如下:
2. 原启动 nasm 程序读取软盘数据,执行新的 nasm 文件代码
需要对我们原来的主文件进行调整
首先是对加载扇区的调整,原来我们是从扇区 1 开始读取的,现在改为 2。因为扇区 1 是启动引导扇区,存放的就是我们的主文件,但不需要这个,所以我们直接从扇区 2 开始读取我们的新的文件到内存中
对应的就是把 read_file_ready 中的 CL 改为 2
最后是读取完成后进行调用,汇编里面好像是直接跳转到相关的内存地址后,指令 IP 就会自动处理
跳转这里的地址问题是需要注意的,需要给出完成的地址
我们直接修改 fin 即可:
3. 将相关的命令整合成脚本,方便一键运行
我们新建一个 run.sh 的脚本,然后将我们需要运行的命令都写到里面去,如下:
上面的脚本功能是:
将主文件 myOS.asm 进行编译
将文件 loader.asm 进行编译
将编译后的 myOS.img 复制一份
使用 dd 命令,将 loader.bin 文件拼接到 os.img 文件后面
最后运行即可
在安装完 git 后,可以在根目录中代码 git bash,然后运行 run.sh 脚本即可
如下图:运行 git bash、运行脚本、成功显示
总结
终于快要进行到使用 C 或者其他语句进行操作系统编写的进程了,泪目
写一个引导从这几天看来确实是挺麻烦的,也难怪用 rust 写操作系统中直接使用 grub 之类的引导
虽然过程艰辛,但结果是令人振奋的,根据书中的描述内存,后面会相对好点,虽然预感还是艰辛,但加油
本次完整代码
myOs.asm 文件
loader.asm 文件
版权声明: 本文为 InfoQ 作者【萧】的原创文章。
原文链接:【http://xie.infoq.cn/article/7d1f27b0d6f56c75ccfb689c1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论