Linux0.11 考古笔记

news2024/11/20 16:26:17

Linux0.11 考古笔记

最近读完《Linux 内核完全注释》和《品读 Linux0.11 核心代码》,大致理解下 Linux0.11 内核的全貌。在我理解这些属于计算机基础类的知识,所以在未来的工作场景不太可能会直接用到它们,如果用不到的话这些知识可能会随着时间的推进慢慢从我的记忆中消失,出于功利的角度我当然不希望学的东西过后就把它给忘记了,那岂不是白学了。

所以我希望能留下一些东西,趁着现在还有一点印象,我将找时间将这些知识重新梳理一遍,做成一份不完善的文档。做这件事情对我的好处:梳理的过程中可以加深对操作系统的理解;文档作为记忆的钥匙帮助我回忆这些知识(可能在未来的某个场景能用得上)。

学习像内核这样复杂的系统,我推测会经历几个重要的阶段:理解专业术语,掌握程序流程;理解设计理念,掌握程序思想;理解源码细节,掌握程序实现。目前大概在理解概念和理解设计思想这样的阶段,当然结合源码能促进我对设计者的理解,但应该还没有到达能实现的那个水平。现在最想做的事情是将内核诸多概念串成一个基本的图景,因此文档的侧重点在如何解决这个需求。

1 概念介绍

1.1 什么是操作系统?

这是一个容易引起歧义的概念,有一个比较狭隘的观点认为内核是操作系统,比如 Linux 内核;另一个比较泛在的观点是认为支持用户程序的基础软件,都可以理解为操作系统的一部分。

请添加图片描述

1.2 如何理解中断机制?

中断是一个过程:程序在执行中,被意外打断后转去处理这种突发状况,然后继续原先的执行。在介绍下中断的实现机制:从硬件的视角,在 80x86 组成的 PC 机中,采用了可编程中断控制芯片 8259A 进行中断源(产生中断信号的设备)管理,具体来说它支持编程(可进行初始化)和操作(可响应外部设备的中断请求)两种状态;从软件的视角,在 Linux0.11 构成的系统中,对中断信号的识别由一个 0 - 255 的数值(中断号)来完成,由一个叫做中断向量表的数据结构把中断向量(中断号)和中断处理程序做一个定向关联。

在这里插入图片描述

1.3 如何理解系统定时?

系统也由一个最小的时间单位,这个时间节拍就是系统运行的脉搏。从硬件的视角,PC 机使用可编程定时芯片 Intel 8253 时钟源;从软件的角度,在 Linux0.11 中设定这个定时芯片每隔 10ms 发出一个时钟中断信号,通过时钟中断处理程序,来累积系统滴答数、统计时间、轮转时间片等等。

在这里插入图片描述

1.4 如何理解进程控制?

程序是一个可执行的文件,而进程是一个执行中的程序实例。关于 Linux0.11 操作系统的进程设计,这里仅侧重理解几个比较重要的概念。

  • 分时技术:使得操作系统上同时运行多个进程,本质上是内核基于时间片进行进程调度;
  • 用户进程空间布局:包括代码区、数据区、堆栈区;
  • 进程隔离:系统隔离性包括进程与进程的隔离,使得进程只能执行进程自己的代码区和数据区和堆栈区;
  • 用户态和内核态:进程的运行时又分用户态和内核态,一般来说指用户态进程,如果进程执行执行系统调用接口会将进程状态短时间陷入内核态;
  • 进程通信:进程之间的通信也需要通过系统调用,就是在内核态中做;

在这里插入图片描述

1.5 如何理解内存管理?

为了高效的使用物理内存,Linux 内核有一套管理内存的方法。从硬件的视角,将物理内存按功能划分为不同的内存域,其中包括内核模块、高速缓冲区、虚拟盘、主内存区。从软件的视角,内核通过分段将进程逻辑地址变成CPU线性地址,再通过分页机制转换成物理内存地址,这样做的其中一个目的是让进程认为自己拥有独立的逻辑地址空间,达到空间的隔离性。

在这里插入图片描述

1.6 如何理解堆栈概念?

堆和栈是系统对内存管理的两种方式,在空间上表示为一个堆栈区。从硬件的角度,堆栈段寄存器和堆栈指针寄存器中设定的值表示当前所使用的堆栈;从软件的角度, Linux0.11 系统中的堆栈包括有:系统初始化的临时堆栈、内核程序的使用堆栈、任务的内核态堆栈、任务的用户态堆栈。

在这里插入图片描述

1.7 内核在源码中的体现?

wangjianfeng@dev:~/source/Linux-0.11$ tree -d  
.  
├── boot  
├── fs  
├── include  
│   ├── asm  
│   ├── linux  
│   └── sys  
├── init  
├── kernel  
│   ├── blk_drv  
│   ├── chr_drv  
│   └── math  
├── lib  
├── mm  
└── tools  
    └── bochs  
        └── bochsrc

1.8 如何理解系统调用?

系统调用是用户进程打开内核大门的钥匙,是内核层对外提供的一组访问内核的接口。

在这里插入图片描述

1.9 如何理解特权级?

特权模式支持操作系统的隔离性。从硬件的角度看,非特权级 ISA 允许用户态的进程执行普通权限的指令(比如加法减法指令,跳转指令)。特权级 ISA 允许内核态的进程执行特殊权限的指令(比如设置页表指令,关时钟中断指令)。从软件的角度,进程用户态是非特权模式,只有通过系统调用使进程暂时陷入内核态,让用户程序(非特权级)控制权转移到内核(特权级)。

2 流程分析

根据《品读 Linux0.11 核心代码》这个专栏,它是按照系统启动到运行的时间顺序结合 Linux0.11 源码来展开的,我根据专栏的内容进行二次整理。内容整体按照这个顺序:引导内核阶段、内核启动阶段、切换到用户态、用户程序运行、一个命令的执行。

2.1 引导内核阶段

在这里插入图片描述

1)BIOS 程序

机器上电后 CPU 自动进入实模式,开始从 0XFFF0 地址处自动执行固化在 ROM 中的程序,这段程序会进行系统自检并设置好中断向量,还会从硬盘引导扇区读程序到地址 0X7000 处并跳转到这个位置继续执行。

2)bootsect.s 程序

存放在硬盘引导扇区里的 bootsect 程序,是由 bootsect.s 源文件编译成的。在执行 bootsect 时,它首先将自身拷贝新的位置,然后读取磁盘其他扇区的内容。其中将 bootsect.s 搬到 0x9000 地址, setup.s 程序( 2~5 扇区)加载到 0x90200 地址,将 system 模块( 240 个扇区)加载到 0x10000 地址。最后跳转到 setup.s 程序继续执行。

3)setup.s 程序

setup.s 程序执行时,首先会通过 int 0x10 触发一个读磁盘的中断,通过 BIOS 的中断处理读取一些硬件参数到内存 0x9000 这个位置,然后将 system 模块重定位到 0x0000 地址,然后切换实模式到保护模式,最后跳转执行 system/head.s 程序。

4)head.s 程序

head.s 程序执行时,重新设置中断描述符表和全局描述符表,然后设置几个相关的段寄存器,然后启动内存管理的分页机制,最后跳转到 main 函数。

2.2 内核启动阶段

在这里插入图片描述

1)获取硬件参数并设置系统

2)系统初始化

3)新进程的诞生

2.3 init 进程启动

在这里插入图片描述

2.4 shell 命令执行

在这里插入图片描述

0)一条命令

[root@linux0.11] cat info.txt | wc -l  
3

1)敲击键盘

2)输出屏幕

3)shell 进程

3 源码解析

根据《Linux 内核完全注释》这本书,它是对 Linux0.11 源码的完全解析,其中有一部分讲得很不错,作为知识补充:内核代码、块设备驱动程序、字符设备驱动程序、文件系统、内存管理。另外我之前根据内容整理一个阅读笔记。

在这里插入图片描述

3.1 内核代码

N/A

3.2 块设备驱动程序

N/A

3.3 字符设备驱动程序

N/A

3.4 文件系统

N/A

3.5 内存管理

N/A

4 参考资料

  • 《Linux内核完全注释》| 豆瓣读书
  • Linux 0.11 实验环境 | 泰晓科技
  • 品读 Linux 0.11 核心代码 | sunym1993
  • Linux0.11 读书笔记 | 王建峰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本,那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年,Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项,总有一些值得期待的东西。 如果你想从 20…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

【Java 数据结构】-二叉树OJ题

作者:学Java的冬瓜 博客主页:☀冬瓜的博客🌙 专栏:【Java 数据结构】 分享:宇宙的最可理解之处在于它是不可理解的,宇宙的最不可理解之处在于它是可理解的。——《乡村教师》 主要内容:二叉树的…

离职时,是在公司群里大方告别,主动退群?还是一言不发,默默退出?

离职时怎么体面退出工作群?一位网友说,自己公司的同事离职那天,在公司群里发了一大段感谢的话,大大方方挥手告别后主动退了群。有同事夸这个离职的人情商高,这样告别大方得体,是离职的好表率。但楼主觉得&a…

SAP UI5 加载本地并不存在的 PDF 文件的错误处理

这个 _onLoadListener 函数什么时候注册的呢? iframe 完成加载之后,就触发这个 load 事件注册的处理函数: PDFViewer.prototype.onAfterRendering function () {var fnInitIframeElement function () {// cant use attachBrowserEvent be…

vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能 可直接使用

富文本编辑器功能实现详细过程 目录 富文本编辑器功能实现详细过程 1.安装富文本插件 2.实现效果 3.实现详细过程 可直接使用 全局引入 局部引入 配置option 扩展需求 自定义配置文字大小 1.安装富文本插件 npm install vue-quill-editor --save //或者 yarn add vu…

Android电源管理介绍

一、电源管理基础知识1.1电源管理的几种状态Android kernel源码中,定义了三种电源状态,在kernel/power/suspend.c中:对应的宏定义/include/linux/suspend.h1.2 电源管理状态的介绍:PM_SUSPEND_ON设备处于正常工作状态PM_SUSPEND_S…

VsCode搭建C语言运行环境以及终端乱码问题解决

在VsCode中搭建C/C运行环境需要先安装以下插件 1、安装c/c插件 2、安装code runner插件 当然也可以安装一些其他的美化插件根据个人习惯,但是以上这两个是必装的。 安装好插件后来到插件主页点击卸载旁边的小齿轮选择扩展设置 找到扩展设置中的下图选项并打上勾即可…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

LeetCode HOT 100 —— 560. 和为 K 的子数组

题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 思路 首先,要明白本题不能使用双指针或者滑动窗口,因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代,确定窗口的收缩方…

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效,像Diablo II中的魔法效果的实现,幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合,接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的: https://github.com/sayajin-labs/kakarot(ZK-EVM type 3 written in Cairo, leveraging STARK proof system.) Kakarot提供了相应的playground: https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作,也有几个现成的库能实现我需要的功能,但用起来总是感觉不顺手。 于是便抽了两天时间,在aaz.libxl库的基础上,按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址:http://che…

基于docker部署nexus并创建发布npm包

1. nenus部署 1.1 搜索镜像 [rootsurpass ~]# docker search nexus INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/sonatype/nexus3 …

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况,一个用户拿着无线移动设备在一个Wi-Fi服务区内走动,并且边…

【Django】第一课 基于Django超市订单管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径,并使用创建django项…

UDP通信

目录 一.预备知识 1.1IP与MAC 1.2端口号 1.3TCP与UDP协议 2.4网络字节序 二.socket编程接口 2.1socket常见API 2.2sockaddr结构 3.UDP网络程序 3.1服务端 3.1.1服务端创建套接字 3.1.2绑定服务端 3.1.3recvfrom 3.2客户端 3.2.1客户端创建套接字 3.2.2客户端绑…

目标检测之Faster RCNN分析

基本流程 图像输入网络得到特征图使用RPN生成候选框,将候选框投影到特征图获得特征矩阵对特征矩阵使用ROI pooling得到特征图并展平,得到预测结果 重点解析 RPN在网络中的位置 在上图中,从feature map层来看,有两个指向上层的箭头…

善用数据框,让你的工作更严谨统一,让你的地图更优雅、更专业

前言:数据框,一个经常被忽略的东西,只有偶尔才被想起。善用数据框能更好的管理我们的投影,更能轻松的控制图层的范围,甚至利用裁剪数据框更能让我们的地图好看...什么是数据框 好吧,这个很基础,但是我还是要提一下,可能有的读者确实不知道,毕竟它的中文译名就很奇怪。…