交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
2 进入c语言代码并debug
分享
未结
0
2619
李延
LV6
2022-10-30
悬赏:20积分
# 1 前置内容 其实让我们的程序进入c语言中很简单,只需要满足以下几个条件就行: - 程序进入到32位保护模式 - 为程序设置栈地址也就是设置 esp寄存器 - 通过call指令,调用 我们c的函数即可 而这几部中的第一步我们通过GRUB 直接进入32位保护模式。其他代码如下章节 # 2 示例代码 示例代码地址:[liooyan/liyux-os at 初步进入c代码 (github.com)](https://github.com/liooyan/liyux-os/tree/初步进入c代码) 其中标签: `初步进入c代码`为本章内容。 ## 2.1 代码运行 代码通过makefile进行编排,运行 ```shell make qemu-32 ``` 可以直接编译代码,并且通过qemu虚拟机进行运行,其中: ```shell qemu-32 : clean $(PROJECT_NAME) @qemu-system-i386 -cdrom build/iso/liyux-os.iso -s -S ``` 中的`-s -S` 表示开启远程debug模式。默认端口为:1234.我们可以通过这个端口直接debug我们的代码,配置如下:  这里我们连接本地的1234端口,并且符号文件配置为我们刚刚编译出来的文件,就可以debug了,我们在是src下的main文件中打上断点查看:  这里我们看到进入了我们的代码中,并且参数为multiboot的对象。 # 3 代码说明 ## 3.1 multiboot 因为我们使用的是multiboot启动,它会直接帮助我们进入到32位保护模式,同时初始化一些其他内容: - 设置gdt,默认设置两个段、一个为代码段、一个为数据段,确保我们可以在保护模式下可以正常运行 - 扫描硬件信息,将我们机器的一些基础信息都组织到multiboot_info这个结构中,并将它的指针赋值给寄存器ebx ## 3.2 boot.S 首先我们的代码进入到boot.S 中,而它的逻辑也很简单 ```c //设置 栈 指针 movl $stack_top, %esp //将multiboot_info 的指针入栈,这样我们的c代码就可以通过参数获取 pushl %ebx // 进入我们的c代码 call _setup_init # 进入main方法 ``` 这样我们就进入了32位保护模式,并且可以在IDE中进行调试了,方便我们后面的开发。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号