缘起

之前我写过一篇博文:Linux 0.11 实验环境搭建

本以为有了这个环境(gcc-3.4 & gdb-6.8),就可以调试无忧了。谁知遇到了以下问题:

(1)用 gdb 调试 main 函数的时候,无法输出变量的值。总是提示:

No symbol “XXX” in current context.

(2)虽然在编译时为 gcc 加上了-gdwarf-2 -g3这两个选项,但仍然无法查看宏的定义。

如下图所示:

对于(1),因为有-g选项,所以 gcc 编译后确实生成了相关符号,但为什么 gdb 总说找不到符号呢?因为 gdb 版本过低,对于较高版本的 gcc 产生的符号表,它根本不认识,所以说找不到符号。解决办法就是升级 gdb.

对于(2),我本以为原因同(1)。把 gdb 升级到 8.1 还是不行,看来另有原因。

我写了一个小程序,gcc-5.4.0 配合 gdb-8.1,调试时可以打印宏的值,info macro xxx等命令没有问题。所以,我打算用高版本的 gcc 编译 Linux-0.11.

问题来了,Linux-0.11 已经是很古老的代码了,用高版本的 gcc 根本编译不过,怎么办呢?好在有很多前辈勇于探索,修改了源码和 Makefile,使得 Linux-0.11 可以被高版本的 gcc 编译通过。

环境搭建

他山之石,可以攻玉。搜了一波后,发现了一个叫“泰晓科技”的网站,其官网是http://tinylab.org/,官方代码仓库是 https://github.com/tinyclub

代码仓库里面有个项目——Linux 0.11 Lab

下载源码

得到linux-0.11-lab-master.zip文件,解压后进入目录linux-0.11-lab-master,如下图:

make help命令可以查看帮助信息。

—– Linux 0.11 Lab (http://tinylab.org/linux-0.11-lab) —–
:: Compile ::
make –generate a kernel floppy Image with a fs on hda1
make clean – clean the object files
make distclean – only keep the source code files
:: Test ::
make start – start the kernel in vm (qemu/bochs)
make start-fd – start the kernel with fs in floppy
make start-hd – start the kernel with fs in hard disk
make start-hd G=0 – start with curses based terminal, instead of SDL
:: Debug ::
make debug – debug the kernel in qemu/bochs & gdb at port 1234
make debug-fd – debug the kernel with fs in floppy
make debug-hd – debug the kernel with fs in hard disk
make debug DST=boot/bootsect.sym – debug bootsect
make debug DST=boot/setup.sym – debug setup
make boot BOCHS=bochs-debugger VM=bochs – debug with bochs internal debugger
make switch – switch the emulator: qemu and bochs
make boot VM=qemu|bochs – switch the emulator: qemu and bochs
:: Read ::
make cscope – genereate the cscope index databases
make tags – generate the tag file
make cg – generate callgraph of the default main entry
make cg f=func d=dir|file b=browser – generate callgraph of func in file/directory
:: More ::
>>> README.md <<<
~ Enjoy It ~
—–Linux 0.11 Lab (http://tinylab.org/linux-0.11-lab)—–
—> Linux Kernel Lab (http://tinylab.org/linux-lab) <—

安装一些软件

这里以 Linux Ubuntu 操作系统为例。作者推荐用 docker.

The docker install method is recommended for all systems, including Linux, Windows and Mac OS.

不过我没有用 docker,还是用比较原始的办法。

Here is the deprecated method:

  1. The Linux distributions: debian and ubuntu (>= 14.04) are recommended

  2. Install basic tools

    $ sudo apt-get install vim cscope exuberant-ctags build-essential qemu lxterminal
  3. Optional

    $ sudo apt-get install bochs vgabios bochsbios bochs-doc bochs-x >libltdl7 bochs-sdl bochs-term
    $ sudo apt-get install graphviz cflow

编译

linux-0.11-lab-master目录下,运行make命令.

运行

$ make start

采用 qemu 或者 bochs 模拟器运行 Linux-0.11,如果想切换模拟器,可以用

$ make switch

调试

$ make debug

运行后出现如下界面:

再开一个终端,还是在linux-0.11-lab-master目录下,运行命令

$ gdb --quiet src/kernel.sym

这时候,就可以用 gdb 的各种命令进行调试了。

如何查看宏

正如 GDB 官网上说:

We pass the -gdwarf-2 and-g3 flags to ensure the compiler includes information about preprocessor macros in the debugging information.

所以,先要给 gcc 添加 -gdwarf-2-g3 选项。对于本实验环境,就是修改src 目录下的 Makefile.head 文件。为第 29 行的CFLAGS加上 -gdwarf-2 -g3

如图:

之后重新编译,再次调试。

在调试的时候,可以用p(print)命令查看宏的值,还可以用

info macro 宏名

例如:

【参考资料】

https://sourceware.org/gdb/onlinedocs/gdb/Macros.html

https://github.com/tinyclub/linux-0.11-lab/blob/master/README.md

Linux 0.11 实验环境搭建与调试相关推荐

  1. Linux 0.11 实验环境搭建

    如果想学习Linux 0.11,实验环境是必不可少的.最好是能编译,能运行,能调试. 如今大家都是用64位的Linux操作系统,而且是高版本的GCC(4.0以上),所以环境搭建是个难题.要么就是编译后 ...

  2. linux0.11+Bochs环境搭建和使用

    Linux 系统的创始人在一篇新闻组投稿上所说的,要理解一个软件系统的真正运行机制,一定 要阅读其源代码(RTFSC – Read The Fucking Source Code).系统本身是一个完整 ...

  3. 自己动手搭建 Linux 0.12 编译环境 — Linux主机

    Hi,又见面了,这两天事情比较少,所以又快速构思这篇的内容. 上篇我用极简模式说完了关于Linux 0.12的模拟环境Bochs,这篇同样沿袭上篇的思路,不过主要内容是关于Linux主机.在搭建Lin ...

  4. Xp下的程序编译成linux,WinXP下打造自己的linux 0.11简易编译环境(原创)

    http://caiwei8888.blog.163.com/blog/static/3017424120101913353856/ 学习赵炯博士的<linux 0.11 内核完全注释>, ...

  5. Eclipse CDT+Qemu调试Linux 0.11内核

    操作系统:CentOS 6.3 for 32bit 需要软件:eclipse-cpp-galileo-SR2-linux-gtk.tar.gz qemu 需要内核文件:linux 0.11(Makef ...

  6. LINUX 0.11内核完全剖析学习笔记-第三章内核编程语言和环境

    一.编译器 linux 0.11 集成了两种汇编器.一种是能产生16位代码的as86汇编器,使用配套的ld86链接器:另一种是GUN汇编器gas,使用GNU ld链接器俩链接产生的目标文件. 1.1 ...

  7. ARM64+树莓派4b+JLINK仿真器实验环境搭建指南

    ARM64体系结构与编程,全球原创的ARM64实验,笨叔带队,等你哟! ARM64体系结构与编程-yx音频:00:00/00:20 奔跑吧第三季视频课程实验设备清单 硬件开发平台:树莓派4B (2G或 ...

  8. Linux 0.11内核分析04:多进程视图

    目录 1 进程概念的引入 1.1 使用CPU的直观想法 1.2 直观用法的缺点 1.3 直观用法的改进 1.4 进程的概念 1.4.1 保存程序执行状态 1.4.2 进程与PCB 1.5 Linux ...

  9. Linux 0.11内核分析01:概述

    目录 1. 什么是操作系统 1.1 计算机硬件组成 1.2 操作系统基本结构 2. 操作系统核心视图 2.1 多进程视图 2.1.1 操作系统的相关演变 2.1.2 核心思想 2.2 文件视图 2.2 ...

最新文章

  1. Navicat 2003-can't connect to MYSQL server on 'localhost'(10061)
  2. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
  3. basis--IMG后台如何显示事务码(How to display IMG's Tcode)
  4. java 读取中文配置文件问题
  5. QT的QMutableVectorIterator类的使用
  6. 四则运算栈c语言程序,四则运算   c语言编程
  7. Python 18.4 aiohttp
  8. 整理 .NET 平台下一些强大的开源控件和类库
  9. 一个好的公司网站应怎么样去推广
  10. jquery click()方法模拟点击事件对a标签不生效的解决办法
  11. 怎么在pyqt界面上添加新菜单栏选项_PyQt创建菜单栏、工具栏
  12. 1月16日英语计算机统考,高考英语听力首次机考16日开考
  13. Ubuntu 安装sopcast-player看网络电视
  14. 带你读论文系列之计算机视觉--Inception V4
  15. 计算机键盘音乐 卡农,巴赫键盘音乐
  16. Robotic KDL library
  17. windows10安装配置vim
  18. 如何在 GitLab CI 管道中构建 Docker 映像
  19. 上海职称不用考计算机和英语翻译,国家翻译专业资格考试将替代职称评定
  20. android studio按坐标布局,Android studio一个手势锁的界面布局

热门文章

  1. NYOJ 1075 (递推 + 矩阵快速幂)
  2. Kafka- Spark消费Kafka
  3. MPU6050首例整合性6轴的姿态模块(转)
  4. 财务管理的革新带动财务软件的变革
  5. 病症:arm启动后应用程序界面显示…
  6. c++工程师面试常见问题之c++中四种cast转换
  7. Leetcode 每日一题 40 组合2
  8. Inception代码解读
  9. 基于马克思哲学原理论外在美与内在美2017-12-31
  10. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170410