博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介
阅读量:5902 次
发布时间:2019-06-19

本文共 1744 字,大约阅读时间需要 5 分钟。

朱荟潼 + 原创作品转载请注明出处 + 《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

744834-20160307194851100-808968603.png

  • 内核启动完成后进入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选项

744834-20160307194741913-1678845136.png

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

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之前,也可以在之后

744834-20160307195024413-1539990609.png

gdb设置断点

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

简单分析start_kernel(只部分截图,详细源代码见:)

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

744834-20160307203326866-88347934.png

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

744834-20160307203344335-1847864862.png

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

744834-20160307203353413-1084972897.png

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

744834-20160307203403538-2023702222.png

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

744834-20160307203416788-1280016595.png

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

744834-20160307203446304-920750582.png

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

744834-20160307203503819-1318227532.png

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

744834-20160307203512397-819933402.png

【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的源代码见:

转载于:https://www.cnblogs.com/zzzz5/p/5251881.html

你可能感兴趣的文章
Windows上Python2.7安装Scrapy过程
查看>>
Chapter 3:Code Style in Django
查看>>
挖掘数据金矿 领军协同创新 曙光荣膺“2016大数据创新应用领袖企业”称号
查看>>
Fast通道获得Win10 Mobile Build 14977更新
查看>>
《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》—第3章3.6节识别操作系统...
查看>>
linux系统防火墙iptables命令规则及配置的示例
查看>>
10 个顶尖的 Linux 开源人工智能工具
查看>>
Firefox 跟踪保护技术将页面加载时间减少 44%
查看>>
聚合(根)、实体、值对象精炼思考总结
查看>>
java解析虾米音乐
查看>>
rails将类常量重构到数据库对应的表中之三
查看>>
mysql 多行合并函数
查看>>
【案例】RAID卡写策略改变引发的问题
查看>>
第四十八讲:tapestry 与 淘宝kissy editor编辑器带图片上传
查看>>
Linux/Centos 重置Mysql root用户密码
查看>>
[C语言]unicode与utf-8编码转换(一)
查看>>
利用PDO导入导出数据库
查看>>
DDR3
查看>>
分支 统计字数
查看>>
艾级计算机的发展与挑战
查看>>