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

2019-2020-1 20199329《Linux内核原理与分析》第四周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 20169219linux 内核原理与分析第四周作业

    系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. elasticsearch在linux上的安装,Centos7.X elasticsearch 7.6.2

    本文环境:Elasticsearch7.6.2目前最先版本   centos7.X     JDK1.8 elasticsearch介绍 官网:https://www.elastic.co/cn/pr ...

  2. IE,Google Chrome等浏览器,调试模式在控制台可以手动调用页面的方法来调试

    IE,Google Chrome等浏览器,调试模式在控制台可以手动调用页面的方法来调试,这种方式也可以进断点.

  3. MySQL 同步复制及高可用方案总结

    1.前言 mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用.必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的 ...

  4. Java项目集成Redis

    1.项目pom.xml中添加Jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId ...

  5. 记一次Windb死锁排查

    正在开会,突然线上站点线程数破千.然后一群人现场dump分析. 先看一眼线程运行状态 !eeversion 发现CPU占用并不高,19%,937条线程正在运行. 看看他们都在干什么. ~* e !cl ...

  6. 认识STM32芯片

    STM32中的ST指的是意法半导体,M是Microelectronics的缩写,32表示32位,即意法半导体公司开发的32位微控制器 ST官网:https://www.st.com/content/s ...

  7. 1044 Shopping in Mars (25分)(二分查找)

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  8. Java 中为什么不能创建泛型数组?

    之前只是知道在 Java 中不能创建泛型数组,今天翻看 <Effective Java>其中对这个部分有讲解,记录一下. 现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情 ...

  9. python CGI 编程实践

    文章更新于:2020-03-05 注1:安装 python 参见: python 的安装使用和基本语法 注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务 ...

  10. Centos7如何安装MySQL

    参考博文: 1.安装 https://blog.csdn.net/qq_36582604/article/details/80526287 2.改密码 https://blog.csdn.net/we ...