linux内核分析学习笔记 ——第三章 MenuOS的构造


计算机的“三大法宝”和操作系统的“两把宝剑”

三大法宝

  • 程序存储计算机 即冯诺依曼体系结构,基本上是所有计算机的基础性的逻辑框架
  • 函数调用堆栈 高级语言可以运行的起点就是函数调用堆栈
  • 中断机制
  • 中断上下文 保存现场和恢复现场
  • 进程上下文 进程的调度

构建一个linux内核--MenuOS系统

linux内核源码几个重要的目录

  • arch目录

    • 是与体系结构相关的子目录列表,存放了许多CPU体系结构相关的代码
    • 该目录主要作用是使linux内核支持不同的CPU体系结构
  • init目录
    • 存放linux内核启动时的初始化代码
    • init目录下有main.c源文件,是整个linux内核启动的开始
  • kernel目录
    • 存放内核本身所需要的一些核心代码文件
    • 存放进程调度相关的代码
  • lib目录
    • 公用库文件
    • 在内核编程中不能使用C语言的标准库函数,lib目录就是用来替代那些标准库函数的

构造MenuOS系统

MenuOS系统由Linux内核镜像和根文件系统集成起来的

上图所示,在实验楼linux环境下,利用图示命令启动MenuOS系统。
  • qemu仿真kernel
  • bzImage是压缩的内核映像
  • 根文件系统一般包括内存根文件系统和磁盘根文件系统
    • 本系统中利用rootf.img只有一个init功能,用menu程序代替init。

相关概念

  • 文件系统和根文件系统

    • 文件系统:是对一个存储设备上的数据和元数据进行组织的机制,有利于用户和操作系统之间的交互。文件系统的用户只要知道所需文件的文件名,就可存取文件中的信息,而无需知道这些文件究竟存放在什么地方。
    • 根文件系统:也是一种文件系统,并且它是内核启动时,所挂载的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本和服务加载到内存中去运行。

文件系统和内核是完全独立的两个部分,linux启动第一个必须挂载根文件系统

  • 内核编译之后会生成两个文件,一个是Image,另一个是zImage,其中Image为内核映像文件,zImage为内核的一种映像压缩文件。其中bzImage适用于大内核,zImage适用于小内核。

跟踪调试linux内核的启动过程

使用gdb跟踪调试内核,使用两个参数,-s 和-S

- -s 是在1234端口上创建了一个gdb-server

- -S 是在CPU初始化之前冻结起来

利用target remote:1234建立连接,在start_kernel处建立断点,输入c继续执行,将会看到,系统开始启动执行,到start_kernel处停止。

再设置一个断点rest_init继续执行,停在断点处

linux内核启动过程分析

  • start_kernal()函数

    在位于init目录下的main.c文件中,有内核启动的起点函数start_kernal()在此函数调用之前,代码主要工作是完成硬件的初始化等。

    • 图中可以看到init_task是一个struct task_struct类型的变量。是进程描述符,使用宏INIT_TASK直接对其进行初始化。
    • task_struct就是内核线程,init_task就是0号进程,是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程,最后演变成idel进程
  • rest_init()函数

    • kernel_thread()函数作用是创建新的内核线程,除了0号进程,其余所有的内核线程都是由kernel_thread()这个接口产生的。下图所示是kernel_thread()的源代码。

    • kthreadd()函数的任务是管理和调度其他内核线程,可以看到在kthreadd()代码中,有一个while(1)循环执行,将进的内核线程加入到kthread_creat_list全局链表中。也就是当调用kernel_thread()创建的内核线程会被加入到链表中

针对于rest_init()函数来说,会启动三个进程,分别是idle(0号进程)、kernel_init(1号进程)、kthreadd(2号进程)

idle(0号进程) 由init_task进程创建后,调用cpu_idle()演变而成,

kernel_init(1号进程)由idle进程调用kernel_thread()创建,在内核空间完成初始化后, 演变成init程序,init进程是内核启动的第一个用户态进程。<font color="Tomato">kernel_init运行在内核空间,随后会完成从内核态向用户态的转变,变成init进程,运行在用户空间</font>在系统启动完成完成后,init将变为**守护进程**监视系统其他进程。

kthreadd(2号进程)由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理,也是大部分创建的内核进程的父进程。

下图所示,是linux内核启动的流程示意图:

参考资料:

内核启动阶段进程分析

Linux内核线程的总结与思考

Linux下1号进程的前世(kernel_init)今生(init进程)----Linux进程的管理与调度(六)

问题

线程与进程

在分析linux内核启动过程中,设计到了好几个进程的启动与转变,书上的描述方式是 内核线程 但是创建的又是进程,我就分不清楚内核线程和进程的关系,我就去找了些概念:

  • 进程:指在系统中能够独立运行并作为资源分配的基本单位,进程只能由父进程建立。
  • 线程:是进程中的一个实体,作为系统调度的基本单位
    • 进程的个体是完全独立的,而线程间是彼此依存的。
    • 多进程环境中,任何一个进程的终止,不会影响到其他进程。而多线程环境中,父线程终止,全部子线程被迫终止(没有了资源)。而任何一个子线程终止一般不会影响其他线程,除非子线程执行了exit()系统调用。任何一个子线程执行exit(),全部线程同时灭亡。

可以看出,进程和线程是包含的关系,对于书上内核线程的描述就更加迷惑了,又查找了关于linux系统下的进程与线程相关资料:

  • 内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也参与内核抢占。这个进程的特别之处有两点,第一、该进程没有前台。第二、永远在内核态中运行。
  • 内核线程类似于用户进程,通常用于并并发处理性质的任务,并且可以抢占调度。不同于用户进程,内核线程位于内核空间,并且可以访问内核函数和内核数据。

2018-2019-1 20189206 《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. 软工网络15团队作业4——Alpha阶段敏捷冲刺3.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺3.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  2. report源码分析——宏的执行

    uvm_info,uvm_error其实是对uvm_report_info,uvm_report_error的封装. 其中warning,error,fatal,macros默认都是定义为UVM_NO ...

  3. Nginx技术研究系列1-通过应用场景看Nginx的反向代理

    随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名. 这么多的WebApi站点这么多的域名,管理和维护成本很 ...

  4. 定时调度任务quartz

    依赖 <!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> < ...

  5. NSThread(II)

    非线程安全 //初始化火车票数量.卖票窗口(非线程安全).并开始卖票 - (void)initTicketStatusNotSave { // 1. 设置剩余火车票为 50 self.ticketSu ...

  6. win10 Xshell5连ubuntu服务器

    相当于ubuntu做服务器,win10远程访问,同一局域网下,完全参考度娘 教你怎么使用xshell远程连接linux服务器 ubuntu系统ifconfig -a查看ip地址,添加到主机那里,连接时 ...

  7. ★★★kalinux 常用命令

    1.修改密码: sudo  passwd  root 2.重启:reboot ====================================== arch 显示机器的处理器架构(1) una ...

  8. 关于 redis、memcache、mongoDB 的对比 转

    从以下几个维度,对 redis.memcache.mongoDB 做了对比.1.性能都比较高,性能对我们来说应该都不是瓶颈.总体来讲,TPS 方面 redis 和 memcache 差不多,要大于 m ...

  9. 输入输出无依赖型函数的GroovySpock单测模板的自动生成工具(上)

    目标 在<使用Groovy+Spock轻松写出更简洁的单测> 一文中,讲解了如何使用 Groovy + Spock 写出简洁易懂的单测. 对于相对简单的无外部服务依赖型函数,通常可以使用 ...

  10. Ant打包可运行的Jar包(加入第三方jar包)

    本章介绍使用ant打包可运行的Jar包. 打包jar包最大的问题在于如何加入第三方jar包使得jar文件可以直接运行.以下用一个实例程序进行说明. 程序结构: 关键代码: package com.al ...