自制操作系统日记(5):跳转到C语言执行

代码仓库地址: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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值