2019-2020-1 20199329《Linux内核原理与分析》第四周作业
2024-08-25 17:04:04
《Linux内核原理与分析》第四周作业
一.上周问题总结:
- 虚拟机环境缺少部分库文件
- 书本知识使用不够熟练
二.本周学习内容:
1.实验楼环境使用gdb跟踪调试内核
1.1 在该环境下输入如下命令启动menuos:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
实践截图如下:
1.2 使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
另开shell窗口,进入Linuxkernel目录下输入gdb,在gdb下设置断点
file linux-3.18.6/vmlinux #加载符号表
target remote:1234 #建立gdb和gdbserver之间的连接
break start_kernel #设置断点
c #让qemu上的linux继续运行
break rest_init #设置另一个断点
c #继续执行
操作步骤截图如下:
结果如下:
2.分析start_kernel函数的执行过程
start_kernel( )函数完成了Linux内核的初始化工作。每个内核部件都是用这个函数进行初始化的。
- 调用sched_init()函数来初始化调度程序
- 调用build_all_zonelists()函数俩初始化内存管理
- 调用page_alloc_init()函数来初始化伙伴系统分配程序
- 调用trap_init()函数和init_IRQ()函数以初始化IDT
- 调用softing_init()函数初始化TASKLET_SOFTIRQ和HI_SOFTIRQ(软中断)
- 调用time_init()初始化系统日期时间
- 调用kmem_cache_init()函数初始化slab分配器(普通和高速缓存)
- 调用calibrate_delay()函数用于确定CPU时钟(延迟函数)
- 调用kernel_thread()函数为进程1创建内个线程,这个内核线程又会创建其他的内核线程并执行/sbin/init程序
- 在start_kernel()开始执行之后会显示linux版本,除此之外,在init程序和内核线程执行的最后阶段还会显示很多其他信息。最后,就会在控制台上出现熟悉的登陆提示,通知用户Linux内核已经启动正在运行。
代码如下图:
3.Linux内核源码目录
- arch:用于存放CPU体系结构的相关代码。
- block:存放Linux存储体系中关于块设备管理的代码。
- crypto:存放常见的加密算法的C语言代码。
- Documentation:存放一些文档。
- drivers:驱动目录,分类别存放了Linux内核支持的所有硬件设备的驱动源代码。
- firmware:固件。
- fs:文件系统,存放了Linux支持的各文件系统的实现。
- include:头文件目录,存放公共的头文件。
- init:存放Linux内核启动时的初始化代码。
- lib:存放Linux的共用库文件。
- mm:存放内存管理。
- net:存放Linux网络的相关代码。
- README:内核文件解读文档。
三.总结与疑难
Linux内核启动过程为:最初执行的进程即是0号进程init_task,它是在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程,进程0在创建1号内核线程kernel_init后,调用cpu_idle()成为idle进程,而idle进程就是当系统没有进程需要执行的时候来调度用的。
1号内核进程负责执行内核的部分初始化工作及进行系统配置,然后使用kernel_thread(kernel_init, NULL, CLONE_FS)函数(也就是fork方式)建立了pid=1的1号进程,也叫init进程(用户态1号进程),成为系统中的其他所有进程的祖先,当调度程序选择到init进程时,init进程继续完成剩下的初始化工作。然后调用kernel_thread执行kthreadd,创建PID为2的内核线程,这一进程始终运行在内核空间,负责所有内核线程的调度和管理。
QUSTION:
- 如何使用虚拟机环境配置和编译内核
四.下周计划
- [ ] 完成书本上的课后习题
- [ ] 尝试使用虚拟机环境研究内核
2019 年 10月 4日
最新文章
- java -version 问题
- 用户故事驱动的敏捷开发 – 2. 创建backlog
- LVM逻辑卷的创建及使用
- PL301 matrix内部模块
- Python之路【第十五篇】:Web框架
- 基于Jquery+Ajax+Json+高效分页
- Haskell递归
- LeetCode OJ 75. Sort Colors
- Windows server 2008 r2 开启Aero
- 模拟生产搭建Standby RAC实验环境(11.2.0.4 DG)
- Window2008 R2(64位)使用codesmith连接Sqlite
- Cisco Packet Tracer 6.0 实验笔记
- cmake 入门实战
- lower_bound函数与upper_bound函数
- vue---分页搜索功能
- python2中在sqlite3中插入中文
- MySQL--InnoDB并发线程控制
- /usr/bin/ld: i386:x86-64 architecture of input file `command.o' is incompatible with i386 output
- CF1143F/1142C U2
- Css权重解析