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号进程,默认路径下的程序。

  • 相关阅读:
    1293E. Xenon's Attack on the Gangs (树形DP)
    二分check的妙用
    Educational Codeforces Round 80 (CF
    CodeForces Goodbye2019 E.Divide Points (构造)
    POJ 1061 (拓展欧几里得+求最小正整数解)
    1238D
    关于Mysql用户的相关操作
    JAVA类的符号引用的理解
    关于tomcat的路径等基础问题
    Java 方法中,参数的装配顺序
  • 原文地址:https://www.cnblogs.com/20135121conan/p/5272760.html
Copyright © 2011-2022 走看看