zoukankan      html  css  js  c++  java
  • 20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介

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

    知识笔记

    1.arch/ 支持不同的CPU的源代码——X86。

    2.init/ 内核启动相关的代码基本在此目录下。

    main.c  Linux内核启动的起点:start_kernel。
    

    start_kernel 相当于普通C程序的main()。

    mm/ 内存管理代码。

    kernel/ 与进程调度有关;Linux内核的核心代码在该目录中。

    3.README

    如何安装内核源代码:
    	make menuconfig
    	modules_install install 安装模块
    	make allnoconfig 关闭所有可选项
    

    4.init是第一个用户态进程,是1号进程。

    实验分析

    打开shell

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

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

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

    • 当前状态是被冻结起来的。

    gdb设断点

    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设置断点

        break func 设置断点,在函数func()入口处
        info break 查看断点信息。
        r 运行程序
        n 单条语句执行
        c 继续运行程序
        p I 打印变量i的值
        bt 查看函数堆栈。
        finish 退出函数。
        q 退出gdb
    

    简单分析start_kernel(只部分截图,详细源代码见:http://codelab.shiyanlou.com/xref/linux-3.18.6/)

    进入init/main.c/(图—分析,如下)

    • 【510行】全局变量init_task,即手工创建的PCB,0号进程即是最终的idle进程。

    • 【804—810行】设置了很多的中断门,不同的硬件中断。

    • 【839行】系统陷阱门(系统调用也是一种中断,只是用指令的方式来触发一个中断)。

    • 【562行】内存管理模块
    • 【569行】调度模块的

    • 【405】创建kthreadd,用一个内核线程管理
    • 【403行】点击如下图

    【945行】init_process是linux系统中的1号进程,是第一个用户态进程,默认根目录下的init程序。

    【418行】0号进程idle就是在这里启动的。

    【cpu_startup_entry】进入,while一直在循环,这个就是0号进程。

    总结:

    1.sched_init()进程调度初始化函数,函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。

    2.rest_init()其他初始化函数,函数内将创建1号进程,即init进程。

    3.rest_init实际上就是start_kernel内核一启动的时候会一直存在,这个就叫0号进程;0号进程创建了1号进程kernel_init和其他服务线程。这就是内核的启动过程。

    4.ps:start_kernel的源代码见:http://codelab.shiyanlou.com/xref/linux-3.18.6/

  • 相关阅读:
    【BZOJ 4631】4631: 踩气球 (线段树)
    【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)
    【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)
    【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
    【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
    【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
    【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)
    【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)
    【BZOJ 3442】 3442: 学习小组 (最大费用流)
    【BZOJ 3218】 3218: a + b Problem(最小割+可持久化线段树)
  • 原文地址:https://www.cnblogs.com/zzzz5/p/5251881.html
Copyright © 2011-2022 走看看