zoukankan      html  css  js  c++  java
  • 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系统。
      

    继续后的状态如下:

  • 相关阅读:
    qt5更改QT执行文件图标
    opencvlogPolar对数极坐标转换成笛卡尔坐标
    opencv边缘检测之拉普拉斯变换Laplacian
    opencvlinearPolar极坐标转化成笛卡尔坐标
    【转】阅读优秀代码是提高开发人员修为的一种捷径
    maven maven设置 m2eclipse
    软件工程中的图
    使用IDEA远程调试代码
    使用Junit4从测试场景的准备优化测试脚本的执行效率
    eclipse 自动提示 配置
  • 原文地址:https://www.cnblogs.com/dhr9313/p/11666686.html
Copyright © 2011-2022 走看看