首页 技术 正文
技术 2022年11月12日
0 收藏 395 点赞 3,713 浏览 1707 个字

 程涵 

原创博客

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

【跟踪分析Linux内核的启动过程】 


知识点梳理

Linux内核源代码

arch:支持不同的CPU的源代码,其中的关键目录包括:Documentation、drivers、firewall、fs、include等
documentation:文档目录
fs:文件系统
init:内核启动相关的代码main.c、Makefile等基本都在该目录中。(main.c中的start_ kernel函数是Linux内核启动的起点,即初始化内核的起点)
kernel:Linux内核核心代码在kernel目录中。
lib:公用的库文件
mm:内存管理的代码
scripts:与脚本相关的代码
security:与安全相关的代码
sound目录:与声音相关的代码
tools目录:与工具相关的代码
net:与网络相关的代码
readme:介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等
……

 

实验过程及截图

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

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

【MOOC EXP】Linux内核分析实验三报告

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

  • 启动实验的Linux系统MenuOS,实际上就是一个在Linux内核的基础上,再运行一个简单菜单命令行程序。
  • 在MenuOS>的提示符下输入help,看到其全部支持的命令:help、version、quit

【MOOC EXP】Linux内核分析实验三报告

3.使用gdb跟踪调试内核

qemu -kernel linux-3.18./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端口,则可以使用-gdb tcp:xxxx来取代-s选项

【MOOC EXP】Linux内核分析实验三报告

4.另开一个shell窗口

编译的目的就是生成自带内核中没有的符号表。符号是全局变量、函数名,符号表即名字与地址一一对应。

gdb
(gdb)file linux-3.18./vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote: # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

【MOOC EXP】Linux内核分析实验三报告

(gdb)file linux-3.18./vmlinux
# 在gdb界面中targe remote之前加载符号表
(gdb)target remote:
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel
# 在start_kernel函数入口处设置断点
(gdb)c
# 使得系统运行到start_kernel处停住
(gdb)list
# 显示当前行所在位置上下的代码

【MOOC EXP】Linux内核分析实验三报告

【MOOC EXP】Linux内核分析实验三报告

简单分析一下start_kernel

不管分析内核的哪一部分都会涉及到start_kernel,都会在init初始化。

1、全局变量init_task

手工创建的PCB,0号进程即最终的idle进程。

2、trap_init

涉及到中断,初始化一些中断向量

set_intr_gate:设置中断门set_system_trap_gate:系统陷阱门SYSCALL VECTOR

3、mm_init

内存管理模块初始化

4、sched_init

调用进程调度初始化

5、rest_init

kernel_init:创建1号进程第一个用户态进程:init_process,1号进程,找默认路径下的程序作为1号进程kthreadd:内核线程,用来管理系统资源

当系统没有进程需要执行时就调度idle进程,即0号进程,一直存在。

注意:init_process是一号进程。

 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289