zoukankan      html  css  js  c++  java
  • 《Linux内核分析》第三周:Linux系统启动过程

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

    一、实验——使用gdb跟踪调试内核从start_kernel到init进程启动

    使用实验楼的虚拟机打开shell

    cd LinuxKernel/
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
    

    内核启动完成后进入menu程序,支持三个命令help、version和quit。

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

    系统是stop的状态:

    按c后系统开始运行,启动到start_cernel的位置:

    list之后看到执行的位置:

    设置断点到rest_init:

    二、分析从start_kernel到init进程启动的过程

    1. 从init目录下找到mian.c中德start_kernel函数,从start_kernel函数开始,内核进入了C语言部分,它完成了内核的大部分初始化工作,
      2.主要函数分析:
    • set_task_stack_end_magic(&init_task):init_task即手工创建的PCB,0号进程即最终的idle进程。
    • trap_init():初始化中断向量,设置了中断门、硬件中断。
    • sched_init():调度模块初始化
    • rest_init()
      ->kernel_thread(kthreadd,...):用一个内核线程来管理系统的一些资源
    • rest_init()
      -〉cpu_startup_entry()
      -〉cpu_idle_loop():处于一直循环的状态,从内核启动开始一直存在,实现0号进程。0号进程创建了1号进程。

    三、总结

    详细分析了Linux内核的启动过程,学习了几个重要函数的作用。Linux内核的启动过程实际上就是为进程调度准备的过程,start_kernel启动时,0号进程——rest_init()会一直存在,当系统没有进程需要执行时就调度到idle进程。0号进程创建了1号进程kernel_init()。

  • 相关阅读:
    数据结构实验之栈与队列四:括号匹配(SDUT 2134)
    从 s 点到 t 点的最短路(简单模板)(迪杰斯特拉)
    畅通工程续(HDU 1874)(简单最短路)
    Til the Cows Come Home ( POJ 2387) (简单最短路 Dijkstra)
    顺序表应用7:最大子段和之分治递归法(SDUT 3664)
    Java面向对象4(P~U)
    House Lawn Kattis
    Jumbled String (Kattis
    队列详解及java实现
    栈详解及java实现
  • 原文地址:https://www.cnblogs.com/yswysw/p/5258239.html
Copyright © 2011-2022 走看看