zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209310 《Linux内核原理与分析》第四周作业

    1. 下载内核源码,解压并编译
      代码如下:
    mkdir LinuxKernel
    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
    
    1. 制作根文件系统
      代码如下:
    mkdir rootfs
    git clone https://github.com/mengning/menu.git
    cd menu
    gcc -pthread -o init linktable.c menu.c test.c -m32 -static
    cd ../rootfs
    cp ../menu/init ./
    find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
    
    1. 对内核进行跟踪调试,重新配置编译Linux内核
      输入以下命令:
      make menuconfig
      出现错误:

      把缺少的部分安装上:
      sudo apt-get install libncurses5-dev
      重新配置编译linux内核:
    make menuconfig 
    make
    

    4.使用gdb跟踪调试linux内核的启动过程
    启动内核:
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

    • -S:使CPU初始化之前冻结起来
    • -s:在1234端口上创建了一个gdb-server,然后可以另开一个窗口,用gdb把带有符号表的内核镜像加载进来,再连接gdb-server,设置断点跟踪内核。
      如下图所示,内核被冻结。

    再打开一个窗口,启动gdb,把内核加载进来,建立连接,指令如下:

    file linux-3.18.6/vmlinux  
    target remote:1234 
    

    在start_kernel处设置断点,指令如下:
    break start_kernel
    查看start_kernel函数:

    在rest_init处设置断点,指令如下:
    break rest_init
    查看rest_init函数:

  • 相关阅读:
    du熊学斐波那契I
    《博客园精华集》分类索引
    C++中指针和引用的区别
    堆和栈的区别
    getch和getchar的区别
    class和struct
    ARM开发步骤
    ARM寻址方式
    存储器映射
    思维中的错误
  • 原文地址:https://www.cnblogs.com/bestYZF/p/13912245.html
Copyright © 2011-2022 走看看