问答1 问答5 问答50 问答500 问答1000

【原创】计算机自制操作系统(Linux篇)二:Windows环境下用C编译器进行C...

提问网友 发布时间:2025-01-08 13:51
声明声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2025-03-18 19:55
开发操作系统,如何从汇编语言程序进入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(抖音搜索懂视),直接咨询即可。

如何将在LINUX中编写的应用程序放到WINDOWS下面也可以运行。_百度知 ... vscode远程调试Linux系统中的c++程序 怎么把煤焦油渣油,水脱走? 如何加快焦油的脱水速度 制氮设备行情怎么样? 楼梯休息平台宽度规范是多少 为什么我登陆地下城的时候要输入验证码~ 地下城与勇士为什么最近玩老是要输验证码? 为什么进地下城与勇士每次都要输入验证码 地下城与勇士进图出现验证码怎么取消,求求解 光线和磁感线是理想模型吗 什么是光照模型 光学漫反射之朗伯模型(Lambert's Model) 光球的结构模型 四种光照模型。 BRDF、朗伯体模型、Phong模型 小孩为什么要补锌? 宝宝必须补锌吗 小孩出汗多应该怎么办 宝宝夏季为什么要注意补锌 北京中医药大学东方学院高考分却 北京中医药大学东方学院录取分数线2024年是多少分(附各省录取最低... 北京中医药大学东方学院是一本还是二本 2024年高考多少分能上北京中医药大学东方学院 北京中医药大学东方学院是一本吗 北京中医药东方学院建于哪年 福建高考368分左右能上什么大学 500分左右的重点大学有哪些 股藓的最佳治疗方法 如何洗发黄的被套 窗口化的快捷键是什么? 窗口化快捷键窗口化快捷键是什么 气泡水机有必要买吗?气泡水机的作用 气泡超音波水疗机气泡超音波水疗机五大作用 广东移动什么卡打长途划算 深圳动感地带如何收费? 开发一套小程序系统要多少钱 燃烧8g硫,需要消耗多少克O2?同时生成多少克污染物SO2? ...5g氧气中燃烧,一定生成6g二氧化硫B.3g硫在2g氧气中燃烧 m螺纹的底孔多大?