任务描述
本关任务:修改 Linux 0.11 内核程序,将系统启动时显示的字符串由原来的Partition table ok.
变为Hello, world!
。 通过本关任务,可以熟悉 Linux 0.11 内核实验环境,掌握内核程序的编辑、编译和测试方法。
相关知识
为了完成本关任务,你需要: 1.了解实验环境; 2.测试内核是否正常; 3.查看内核源码; 4.修改内核源码; 5.重新编译内核; 6.测试新内核是否正常。
1.了解实验环境
本课程将会在 Ubuntu 16.04 下进行学习,Ubuntu 属于Linux
衍生出来的以桌面应用为主的Linux
操作系统,Linux
操作系统的使用与Windows
基本上不同,所以最初会觉得无法理解,但是本质上还是差不多的。
本实验将使用 Bochs 模拟硬件环境,在完成对代码的修改或编译之后将使用run
去启动新的虚拟机,环境都是准备好,可以直接使用的,只需要使用脚本去启动就行了。 本实验中已经给出了完整的linux 0.11
内核文件放在/root/os/linux-0.11-lab/0/linux
中,可以直接使用。
本课程的实验在目录~/os/linux-0.11-lab
下进行,此目录下的内容如下:
其中各目录和文件的含义是:
- 脚本文件
run*
:以不同模式运行虚拟机,脚本 run 采用正常模式,脚本 rundbg 采用 bochs 调试模式(汇编级),脚本 rungdb 采用 gdb 调试模式( C 语句级),这三个模式都用于内核测试。 用于启动虚拟机的内核映像文件是cur/linux/
目录下的Image
; 虚拟机的根文件系统是images
文件夹下的rootimage-0.11
;
- 目录
0
:存放有 Linux 0.11 内核的源代码及其 Source-Insight 工程文件,本实训中使用 VSCode 代替 Source-Insight ,不需要使用到 Source-Insight ,只需要使用到linux
文件夹中的源码;
- 目录
conf
:存放有虚拟机的配置文件,这些配置文件描述了虚拟机的硬盘、软盘、内存大小等参数;
- 目录
images
:包含虚拟机的硬盘(根文件系统)和软盘的映像文件;
其中映像文件hdimage-devel
用作应用开发模式的硬盘,里面包含应用程序编译所需的 gcc 等软件。脚本run
、rundbg
和rungdb
用软盘作为启动盘,对应的软盘映像文件是cur/linux/Image
。
cur
是一个符号链接,指向当前分析的内核目录,现在指向目录0
,可以当作是一个快捷方式。
2.测试内核是否正常
运行run
脚本就会使用在~/os/linux-0.11-lab
目录下的内核映像cur/linux/Image
启动 Linux 0.11 。
虽然这个虚拟机的硬盘容量只有 1 MB ,但它目前可以满足内核分析的需要。
3.查看内核源程序
关闭虚拟机,然后使用 VSCode 打开源码所在文件夹,选择 File ,然后选择 Open Folder ;
找到linux
文件夹,然后确认打开;
可以看到文件夹下所有的源码都已经被导入了,可以在这里开始对源码进行修改了。
4.修改内核源码
在源码中可以修改很多东西,例如修改开机画面中的字符串Loading system ...
,将其修改为Loading linux 0.11
,这里需要注意一点,不能太长而影响生成的目标文件的大小。
使用搜索功能,搜索关键词Loading
,在结果中找到Loading system ...
,将其修改为Loading linux 0.11
。 如果知道文件的具体位置,也可以在命令行中使用vim
对配置文件进行修改,只需要找到文件中对应的地方进行修改,和在 VSCod 里面修改结果都是一样的。
修改完毕之后点击 File 然后选择 Save All ,保存所有修改即可。
5.重新编译内核
在内核源码目录~/os/linux-0.11-lab/0/linux
中使用make
命令重新编译内核;
下图是编译输出的结果,可以看到被修改的文件bootsect.s
已经重新编译成功,这是只编译修改过的文件,有时为了可靠也可以完全编译;
完全编译需要将旧的编译文件清除,使用make clean
命令清除编译文件,然后重新使用make
命令编译,只不过完全编译的时间相对较长;
上图是编译之后的结果,Image 即为生成的完整内核映像,包含引导代码;tools 目录下有内核的主体可执行文件 system ,其符号文件是 System.map ,包含变量和函数的地址,其链接时的详细布局信息在文件 System.map.2 中。
6.测试新内核是否正常
切换到linux-0.11-lab
目录下使用./run
启动脚本使用新的内核运行虚拟机;
可以看到虚拟机的加载的字符串已经从原来的Loading system ...
,变为Loading linux 0.11
了。
编程要求
根据相关知识,将系统启动时显示的字符串由原来的Partition table ok.
变为Hello, world!
。 注: 1.字母区分大小写,符号使用英文输入法输入,请注意作答的时候注意不要写错了。 2.评测之前请关闭已经启动的虚拟机之后才可以点击评测!!!
测试说明
平台会对源码进行检测,请完成编程要求并且保存测试。
实验步骤
1、打开vscode,找到os/linux-0.11-lab/0/linux目录,点击ok
2、 搜索Partiton table (不要搜索Partiton table ok. 因为根本搜不到)
3、找到第155行,改成hello world
4、左上角,save all
5、打开终端,编译即可
cd os/linux-0.11-lab/0/linux
make