2019-2020-1 20199304《Linux内核原理与分析》第四周作业
第四周学习——构造一个简单的Linux系统
- 问题描述:
-
经过上一周的学习,我们进一步学习了计算机操作系统的核心工作机制,进一步分析了函数调用堆栈机制,以及C代码内嵌汇编的写法。以及,学会了在mykernel中的在C语言以及汇编语言和linux编程的基础上编写一个简单的内核,
-
本周首先,我们将初步构造一个简单的Linux系统MenuOS。
-
下一步分析运行这个简单的OS并进行一定的分析
-
利用GDB简单分析Start_kernel
-
一、在自己的虚拟机上构造Linux内核系统
下载内核源代码编译内核:
$ cd./LinuxKernel/
$ wget https://www.kernel.org/pub/linux/kernel//v3.x/linux-3.18.6.tar.xz
$ xz -d linux-3.18.6.tar.xz
$ tar -xvf linux-3.18.6.tar
这里我们成功解压了安装包,写一部将要对其进行初步编译:
$ cd linux-3.18.6
$ make i386_defconfig
$ make
等待系统将其成功编译后即可进行下一步,制作系统根文件:
cd ./LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu gcc -o init linktable.c menu.c test.c -m32 -static -lpthread
cd ../roofts
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
完成以上步骤后即完成了安装,接下来就可以像在实验楼上的操作一样,进行运行以及gdb调试。
但在我的电脑上出现了问题如下:
我推测是我的ubanto的gcc版本问题,我尝试一些方式去卸载gcc7,或者安装其他版本的gcc均无效,问题尚待解决。
后来我又尝试了更新系统,依然未能解决问题。
二、构造一个简单的Linux Menu OS
可以利用给出的系统内核,简单运行,得到初步现象。
知识点
首先,我们应该了解计算机和操作系统的法宝
-
计算机三个法宝:
1.存储程序计算机
2.函数调用堆栈
3.中断 -
操作系统两把宝剑:
1.中断上下文的切换
2.进程上下文的切换
启动Linux Menu OS
在实验楼实验平台中,键入代码启动平台:
$ cd ~/LinuxKernel/
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
启动过程需要读取众多文件,启动后 的状态如下:
GDB调试
-
首先,应当启动Linux Menu OS,但本次启动的方式需要额外加上参数 -s 与参数 -S,启动代码如下:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
-
关于-s和-S选项的说明:
-
参数 -S:
freeze CPU at startup (use ’c’ to start execution)
即启动后冻结CPU -
参数 -s:
shorthand for -gdb tcp::1234
即选择端口1234启动
-
冻结启动后状态如下:
-
在gdb调试中,首先应当用GDB读入系统的标志符号文件(符号表),键入代码:
(gdb)file linux-3.18.6/vmlinux
-
接着建立gdb和gdbserver之间的连接,
(gdb)target remote:1234` 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
-
设置断点 断点的设置可以在target remote之前,也可以在之后,
(gdb)break start_kernel### call 指令 设置完成后可以键入字母c,按下回车以继续运行Linux系统。
继续后的状态如下: