Linux0.12编译与Clion调试

1.简介

1.修改了部分c以及汇编代码,可以通过GCC最新版本编译通过(本人电脑macOS Catalina 10.15;gcc version 10.3.0 (GCC))

2.学习资料放在源码目录下的study,可以查阅用

2.编译源码

  1. 下载源码https://github.com/galis/linux-0.12
  2. 修改源码根目录下的Makefile文件,把下面几个路径修改成你电脑的
export KERNEL_INCLUDE = /Volumes/mac-code/linux-0.12/include
export GCC_PREFIX = /usr/local/opt/x86_64-elf-gcc/bin/x86_64-elf-
export BINUTILS_PREFIX = /usr/local/opt/x86_64-elf-binutils/bin/x86_64-elf-
  1. 执行make clean && make,可以得到Image,位于源码根目录下

3.运行与调试

  1. 确保你电脑安装了支持gdb的bochs,bochs如何安装请自行查找,网上很多资料.
  2. 解压tools/root-0.12.img.zip,得到tools/root-0.12.img.(git 不允许超过100M文件上传!!)
  3. 根据实际情况修改tools/bochsgdb.sh脚本配置
LINUX_CODE_PATH=/Volumes/mac-code/linux-0.12
BOCHS_EXE_PATH=/Volumes/mac-data/bochs-2.6.11/build-mac-gdb/bin/bochsdbg
BOCHS_CONFIG_PATH=${LINUX_CODE_PATH}/tools/bochsconfig_linux12.txt
  1. 根据实际情况修改tools/bochsconfig_linux11.txt配置
romimage:file=/Volumes/mac-data/bochs-2.6.11/build-mac/share/bochs/BIOS-bochs-latest
vgaromimage:file=/Volumes/mac-data/bochs-2.6.11/build-mac/share/bochs/VGABIOS-lgpl-latest
floppya:1_44=/Volumes/mac-code/linux-0.12/Image,status=inserted
ata0-master: type=disk, mode=flat, path="/tmp/root-0.12.img", cylinders=410, heads=16, spt=38
  1. 在Clion创建脚本执行配置,填入相关参数,点击OK创建

    参数Script Path,选择源码根目录下的tools/bochsgdb.sh
    参数Working Directory,选择源码根目录路径

在这里插入图片描述

  1. 在Clion创建GDB REMOTE DEBUG配置,然后填写相关参数,,点击OK创建

    参数symbol file,选择源码编译出来的tools/system.symbol
    参数sysroot,选择源码根目录。
    Before launch添加第5步创建好的Shell Script,目的是调试前先编译然后启动bochs.

在这里插入图片描述

  1. 在main.c打断点,点击debug按钮就可以调试了

在这里插入图片描述
在这里插入图片描述

4.注意事项与修改记录

  1. 去除AS86 LD86用gcc代替
  2. bootsect.S setup.S用as编译
  3. 删除seg,修改部分代码。seg 影响下一条语句而已
  4. export 变量给下一级makefile使用
  5. 删除汇编clobber列表
  6. 扩展汇编才需要%%,不扩展就%
  7. 合并重定义符号,只使用第一个符号。ld
  8. lvalue required as left operand of assignment 没有什么好的办法呢,重写下吧
  9. 把函数修饰符号_删除。。。自己改吧…BUILD irq很多
  10. 在Mac上大小写敏感很重要,在MAC编译的时候注意分区是否支持大小写。
  11. invalidate_buffers 在floppy.c找不到。加一行extern void invalidate_buffers(int dev);
  12. 输出和内存变量输入同时存在要注意了。
  13. HD controller not ready问题

原来语句:
163 int retries=10000;
165 while (–retries && (inb_p(HD_STATUS)&0xc0)!=0x40);
修改为
163 int retries=100000;
165 while (–retries && (inb_p(HD_STATUS)&0x80));
理由是:驱动器是否就绪与控制器的状态无关,我们只需要检测状态寄存器忙位是否为1即可,不需要管就绪位。`

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值