开发操作系统,如何从汇编语言程序进入C语言内核程序?这是操作系统的难点。经过本人的不懈摸索,得到普遍方法,本章将详细说明在Windows环境下的实现过程。
一、操作系统程序结构
1. Linux系统结构
2. 我的程序结构
基于Linux的结构,通过如下方式组织操作系统程序文件。
使用计算机自制操作系统(Windows篇)中的工具进行编译和链接。这些工具在《30天》书中都有完整版本。
二、操作系统内核程序开发
1. 内核堆区
从汇编语言进入C语言后,编写简单的main()来测试内核程序。实现3个功能:打印字符"C"、字符串"kernel"和调用汇编程序打印字符"A"。通过全流程编译链接后,运行结果如下。为什么“kernel”字符串没有正常显示出来?分析main程序的目标代码,发现打印字母‘A’的参数传递方式与“kernel”字符串在堆区的存储方式不同。为解决此问题,程序需将“kernel”字符串先放入内存[00100000]=1MB处。这需提前将可执行文件中所有变量从文件区移动到堆区,通过在引导启动程序“head.asm”中添加数据区复制过程实现。
2. 内核栈区
链接器指定hrb文件中,栈/堆地址为1MB。但程序正常运行并未修改栈地址,原因在于未将堆区和栈区设置为相邻。在上一章的head.asm程序中能找到操作系统栈值。根据hrb格式标准,重新设置操作系统栈地址为1MB,以实现栈底指针上方是堆区、下方是栈区的良好系统构架。但在设置栈地址为1MB时,内核程序崩溃,原因是在BIOS启动区域,即靠近1MB处的内存不能随意访问。通过查询资料得知,此区域用于存放BIOS信息,不能作为栈区使用。最后,将栈区设置为0x50000处,合理排除了冲突区域,实现内核程序稳定运行。
三、操作系统源程序编译链接过程
1. kernel内核目录:生成kernel.hrb。
2. boot引导程序目录:生成boot_setup.bin。
3. 操作系统镜像总目录:生成Linux.img。
4. 更新的head.asm源程序。
5. main.c源程序。
6. kernela.asm源程序。
至此,自制Linux操作系统的C语言内核已成功装载,开发环境搭建完成,可以开始使用C语言进行内核开发。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。