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

  • 相关阅读:
    vue 中的const {XXX } =this 的作用效果
    <a href="javascript:;">的用法说明
    iOS抓包工具Charles —— 破解、抓包入门
    iOS抓包工具Charles
    Android抓包方法(一)之Fiddler代理
    appium+python自动化24-滑动方法封装(swipe)
    Appium移动自动化测试(五)--app控件获取之uiautomatorviewer
    appium自动化框架项目实战1——app初次使用引导页
    一个完整的Appium手机自动化测试实例
    Appium提高脚本复用、可配置性
  • 原文地址:https://www.cnblogs.com/20135121conan/p/5272760.html
Copyright © 2020-2023  润新知