《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日

最新文章

  1. java -version 问题
  2. 用户故事驱动的敏捷开发 – 2. 创建backlog
  3. LVM逻辑卷的创建及使用
  4. PL301 matrix内部模块
  5. Python之路【第十五篇】:Web框架
  6. 基于Jquery+Ajax+Json+高效分页
  7. Haskell递归
  8. LeetCode OJ 75. Sort Colors
  9. Windows server 2008 r2 开启Aero
  10. 模拟生产搭建Standby RAC实验环境(11.2.0.4 DG)
  11. Window2008 R2(64位)使用codesmith连接Sqlite
  12. Cisco Packet Tracer 6.0 实验笔记
  13. cmake 入门实战
  14. lower_bound函数与upper_bound函数
  15. vue---分页搜索功能
  16. python2中在sqlite3中插入中文
  17. MySQL--InnoDB并发线程控制
  18. /usr/bin/ld: i386:x86-64 architecture of input file `command.o' is incompatible with i386 output
  19. CF1143F/1142C U2
  20. Css权重解析

热门文章

  1. Linux操作系统及调用接口
  2. udev规则,部署Multipath
  3. LARAVEL快速入门
  4. 学习《深入应用c++11》1
  5. C++线性表的链式存储结构
  6. VM卸载不完全,重装的一个下午
  7. 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!
  8. 数据结构和算法(Golang实现)(2)简单入门Golang-包、变量和函数
  9. Java创建线程的三种形式的区别以及优缺点
  10. 让图片适合在静态文本控件窗口大小 MFC