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

    继续后的状态如下:

  • 相关阅读:
    windows 按时自动化任务
    Linux libusb 安装及简单使用
    Linux 交换eth0和eth1
    I.MX6 GPS JNI HAL register init hacking
    I.MX6 Android mmm convenient to use
    I.MX6 GPS Android HAL Framework 调试
    Android GPS GPSBasics project hacking
    Python windows serial
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    freemarker跳出循环
  • 原文地址:https://www.cnblogs.com/dhr9313/p/11666686.html
Copyright © 2011-2022 走看看