代码仓库地址:https://github.com/freedom-xiao007/operating-system
简介
在上篇中切换了CPU的64位模式,但后面是失败的,并没有真正切换,也没有相关的验证代码,本篇中终于修正并执行了C代码
CPU模式切换修正
上篇中后面发现系统在Get SVGA时卡住了,并没有向下执行
后面搜索资料,最终尝试下来,感觉上使用qeme好像有些问题,同样的镜像在qemu中会不断循环重启,而在bochs中不会,所以我们重新抄了下代码,并且换了下虚拟机,换成bochs
文章的参考链接如下,写的很好,又学到了很多
我们直接抄它的三个文件:bootsect.asm、setup.asm、head.asm
在head.asm中,他是直接在里面模拟的c的main函数,我们将其注释掉,并修改call main为我们的c的start函数,具体修改如下:
修改call main 为 call _start; 在104行左右
注释掉所有的main函数代码,115到120行左右
push 0 ;These are the parameters to main :-)
push 0 ;这些是调用main程序的参数(指init/main.c)。
push 0
push L6 ;return address for main, if it decides to.
push _start ;'_main'是编译程序对main的内部表示方法。
jmp setup_paging ;这里用的JMP而不是call,就是为了在setup_paging结束后的
;ret指令能去执行C程序的main()
L6:
jmp L6 ;main程序绝对不应该返回到这里。不过为了以防万一,
;所以添加了该语句。这样我们就知道发生什么问题了。
; _main: ;这里暂时模拟出C程序main()
; mov esi,mainmsg ;保护模式DS=0,数据用绝对地址访问
; mov cl, 0x09 ;蓝色
; mov edi, 0xb8000+22*160 ;指定显示在某行,显卡内存地址需用绝对地址
; call printnew ;0xb8000为字符模式下显卡映射到的内存地址
; ret
这样对他的相关改造就OK了
C代码植入
关于运行C代码的部分我们还是跟随《30天自制操作系统》的思路:将C代码转换成汇编码,和head.asm拼接到一起,然后直接编译即可
根据大体思路,我们的具体操作如下:
- 1.编写C代码
- 2.使用GCC将C代码生成.O文件
- 3.使用objconv将.O文件转成nasm汇编文件
- 4.使用python脚本处理调转换得到的汇编文件的一些不需要的地方
- 5.编写运行脚本,拼接文件,编译,运行
具体细节如下:
1.C代码编写
我们就简单起名叫start.c吧,里面就打印一个字符串,无限循环
typedef unsigned char uint8_t;
void put_str(uint8_t* message);
void start(void) {
put_str("0123456789");
while(1)