zoukankan      html  css  js  c++  java
  • “Linux内核分析”实验三报告

    构造一个简单的Linux系统

    张文俊+原创作品转载请注明出处+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    实验内容:

    一、gdb跟踪调试内核从start_kernel到init进程启动

    1.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 server
        若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

    2.启动Linux内核的三个参数:kernel、initrd、root所在分区目录

    代码:

    qemu -kernel (文件名) -initrd (rootfs.img)

    1)qemu相当于打开一个虚拟机

    2)kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。

    3)initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。    

    3.使用gdb跟踪调试:

    1)加载符号表、建立连接、设置断点:

    2)输入c让qemu上的linux继续运行:

    3)输入list查看设置断点处的代码:

    二、总结

    init中main.c中有一个start_kernel函数,在start_kernel函数的尾部调用了一个rest_init

    1)0号进程
    有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

    2)0号进程创建了1号进程和其他
    rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
    kernel_init中有run_init_process,
    run_init_process创建了1号进程,默认路径下的程序。

  • 相关阅读:
    POJ 2155 Matrix
    Codeforces 626D Jerry's Protest 「数学组合」「数学概率」
    Codeforces 626E Simple Skewness 「数学」「二分」
    Codeforces 633D
    Codeforces 631C
    二分查找
    CodeForces 617C【序枚举】
    HDU 4405 【概率dp】
    ZOJ 3329 【概率DP】
    POJ 2096 【期望DP】
  • 原文地址:https://www.cnblogs.com/20135121conan/p/5272760.html
Copyright © 2011-2022 走看看