zoukankan      html  css  js  c++  java
  • 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程

    一、调试步骤如下:

    • 使用gdb跟踪调试内核

      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选项

    另开一个shell窗口

    gdb
    (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
    (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
    (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
    (gdb)c # 系统开始启动,启动到start_kernel
    (gdb)list # 可以看到start_kernel上下的代码
    (gdb)break rest_init
    (gdb)c # 当前系统执行到rest_init
    (gdb)list # 可以看到rest_init是在start_kernel的尾部调用的。
    (gdb)break kernel_thread 
    (gdb)c # 当前系统执行到kernel_thread
    (gdb)list # 这一步可以看到kernel_thread(kernel_init,NULL,CLONE_FS)
    (gdb)break kernel_init
    (gdb)c # 当前系统执行到kernel_init
    (gdb)list #
    (gdb)break run_init_process
    (gdb)c # 这里并没有如愿停在run_init_process,而是停在另外的kernel_thread里,这个太多了,我们先删掉这个断点
    (gdb)d 3 # kernel_thread的编号为3
    (gdb)c # 停在run_init_process
    (gdb)list
    

    二、Linux内核的启动过程

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

    最重要的一行代码:

    qemu -kernel (文件名) -initrd (rootfs.img)
    
    1. qemu相当于打开一个虚拟机
    2. kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。
    3. initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。

    所以就是要启动一个内核,挂一个硬盘,然后再运行一个init即1号进程。
    也就是说,init中main.c中有一个start_kernel函数
    在start_kernel函数的尾部调用了一个rest_init
    0号进程
    有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

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

    init_process 一号进程,默认的

    三、几个问题

    1. 为什么要编译内核?
      为了生成符号表。

    2. 怎么编译内核?

      1. 最简单的是make config,但是这个需要的时间很长
      2. make menuconfig,是图形化的界面,比上面更为方便
      3. make allnoconfig,所有能选no的都选no,简单粗暴。
    3. Makefile和config
      这两个和在一起能够决定内核中哪些需要被编译,哪些不会被编译。

    四、实验截图

    1. 运行截图
      enter description here

    2. 第一个断点,start_kernel
      enter description here
      enter description here

    3. rest_init
      enter description here

    4. kernel_thread
      enter description here

    5. kernel_init
      enter description here

    6. run_init_process

      enter description here

    五、学习总结

    闫佳歆第三周学习笔记

  • 相关阅读:
    并发包学习(二)-容器学习记录
    初尝微信小程序开发与实践
    记一次全站升级https引发的一系列问题
    Hadoop集群搭建
    es5 的类和继承
    TypeScript 类和继承
    TypeScript 函数
    TypeScript 变量 和 数据类型
    js变量提升与函数提升
    vue 路由监听
  • 原文地址:https://www.cnblogs.com/20135202yjx/p/5262907.html
Copyright © 2011-2022 走看看