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调试。
但在我的电脑上出现了问题如下:

2019-2020-1 20199304《Linux内核原理与分析》第四周作业_第1张图片

我推测是我的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

启动过程需要读取众多文件,启动后 的状态如下:

2019-2020-1 20199304《Linux内核原理与分析》第四周作业_第2张图片

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启动

冻结启动后状态如下:

2019-2020-1 20199304《Linux内核原理与分析》第四周作业_第3张图片

  • 在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系统。

继续后的状态如下:

2019-2020-1 20199304《Linux内核原理与分析》第四周作业_第4张图片

你可能感兴趣的:(2019-2020-1 20199304《Linux内核原理与分析》第四周作业)