Linux0.12编译与Clion调试

时间:2024-10-13 20:29:13

1.简介

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

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

2.编译源码

  1. 下载源码/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
  • 2
  • 3
  1. 执行make clean && make,可以得到Image,位于源码根目录下

3.运行与调试

  1. 确保你电脑安装了支持gdb的bochs,bochs如何安装请自行查找,网上很多资料.
  2. 解压tools/root-0.,得到tools/root-0..(git 不允许超过100M文件上传!!)
  3. 根据实际情况修改tools/脚本配置
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
  • 2
  • 3
  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.", cylinders=410, heads=16, spt=38
  • 1
  • 2
  • 3
  • 4
  1. Clion创建脚本执行配置,填入相关参数,点击OK创建

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

4.注意事项与修改记录

  1. 去除AS86 LD86用gcc代替
  2. 用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 在找不到。加一行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即可,不需要管就绪位。`