Linux0.11 内核体系结构
Posted Liuqz2009
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux0.11 内核体系结构相关的知识,希望对你有一定的参考价值。
系列文章目录
Linux 0.11启动过程分析(一)
Linux 0.11 fork 函数(二)
Linux0.11 缺页处理(三)
Linux0.11 根文件系统挂载(四)
Linux0.11 文件打开open函数(五)
Linux0.11 execve函数(六)
Linux0.11 80X86知识(七)
Linux0.11 内核体系结构(八)
文章目录
一、Linux 对内存的管理和使用
虚拟地址 通过分段机制映射到 线性地址(4G 寻址空间),然后是 线性地址 到 物理地址 的变换。
下图列出了 GDT 和 LDT 描述符信息图:
下图显示了分页变换的过程:
对于 Linux 0.11 系统,内核设置全局描述符表 GDT 中的段描述符项数最大为 256,其中 2 项空闲、2 项系统使用,每个进程使用两项。因此,此时系统可以最多容(256-4)/ 2 = 126 个任务,并且虚拟地址范围是 ((256-4)/ 2)* 64MB 约等于 8G。但 0.11 内核中人工定义最大任务数 NR_TASKS = 64 个,每个任务逻辑地址范围是 64M,并且各个任务在线性地址空间中的起始位置是(任务号)* 64MB。因此全部任务所使用的线性地址空间范围是 64MB*64 =4G,见图 5-10 所示。图中示出了当系统具有 4 个任务时的情况。内核代码段和数据段被映射到线性地址空间的开始 16MB 部分,并且代码和数据段都映射到同一个区域,完全互相重叠。而第 1个任务(任务 0)是由内核"人工"启动运行的,其代码和数据包含在内核代码和数据中,因此该任务所占用的线性地址空间范围比较特殊。任务 0 的代码段和数据段的长度是从线性地址 0 开始的 640KB 范围,其代码和数据段也完全重叠,并且与内核代码段和数据段有重叠的部分。实际上,Linux 0.11 中所有任务的指令空间 I(Instruction)和数据空间 D(Data)都合用一块内存,即一个进程的所有代码、数据和堆栈部分都处于同一内存段中,也即是 I&D 不分离的一种使用方式。
任务 1 的线性地址空间范围也只有从 64MB 开始的 640KB 长度。它们之间的详细对应关系见后面说明。任务 2 和任务 3 分别被映射线性地址 128MB 和 192MB 开始的地方,并且它们的逻辑地址范围均是 64MB。由于 4G 地址空间范围正好是 CPU 的线性地址空间范围和可寻址的最大物理地址空间范围,而且在把任务 0 和任务 1 的逻辑地址范围看作 64MB 时,系统中同时可有任务的逻辑地址范围总和也是 4GB,因此在 0.11 内核中比较容易混滑三种地址概念。
如果也按照线性空间中任务的排列顺序排列虚拟空间中的任务,那么我们可以有图 5-11 所示的系统同时可拥有所有任务在虚拟地址空间中的示意图,所占用虚拟空间范围也是 4GB。其中没有考虑内核代码和数据在虚拟空间中所占用的范围。另外,在图中对于进程 2 和进程 3 还分别给出了各自逻辑空间中代码段和数据段(包括数据和堆栈内容)的位置示意图。
请还需注意,进程逻辑地址空间中代码段(Code Section)和数据段(Data Section)的概念与 CPU 分段机制中的代码段和数据段不是同一个概念。CPU 分段机制中段的概念确定了在线性地址空间中一个段的用途以及被执行或访问的约束和限制,每个段可以设置在 4GB 线性地址空间中的任何地方,它们可以相互独立也可以完全重叠或部分重叠。而进程在其逻辑地址空间中的代码段和数据段则是指由编译器在编译程序和操作系统在加载程序时规定的在进程逻辑空间中顺序排列的代码区域、初始化和未初始化的数据区域以及堆栈区域。进程逻辑地址空间中代码段和数据段等结构形式见图所示。有关逻辑地址空间的说明请参见内存管理一章内容。
二、使用步骤
1、引入库
代码如下(示例):
import numpy as np
2、Linux
3、C++
4、Java
5、Spring
6、Qt
7、android
8、Docker
9、Web
10、Windows
11、Python
12、深度学习
13、Go
14、大数据
15、音频
16、视频
三、补充配置
1、空格
  为“全角空格”
  为“全角空格”
为“不换行空格”
2、文字颜色
浅红色文字:<font color="#dd0000">浅红色文字:</font><br />
深红色文字:<font color="#660000">深红色文字</font><br />
浅绿色文字:<font color="#00dd00">浅绿色文字</font><br />
深绿色文字:<font color="#006600">深绿色文字</font><br />
浅蓝色文字:<font color="#0000dd">浅蓝色文字</font><br />
深蓝色文字:<font color="#000066">深蓝色文字</font><br />
浅黄色文字:<font color="#dddd00">浅黄色文字</font><br />
深黄色文字:<font color="#666600">深黄色文字</font><br />
浅青色文字:<font color="#00dddd">浅青色文字</font><br />
深青色文字:<font color="#006666">深青色文字</font><br />
浅紫色文字:<font color="#dd00dd">浅紫色文字</font><br />
深紫色文字:<font color="#660066">深紫色文字</font><br />
3、文字大小
size为1:<font size="1">size为1</font><br />
size为2:<font size="2">size为2</font><br />
size为3:<font size="3">size为3</font><br />
size为4:<font size="4">size为4</font><br />
size为10:<font size="10">size为10</font><br />
4、字体
<font face="黑体">我是黑体字</font>
<font face="宋体">我是宋体字</font>
<font face="微软雅黑">我是微软雅黑字</font>
<font face="fantasy">我是fantasy字</font>
<font face="Helvetica">我是Helvetica字</font>
5、背景色
<table>
<tr>
<td bgcolor=#FF00FF>背景色的设置是按照十六进制颜色值:#7FFFD4</td> </tr>
</table>
<table>
<tr>
<td bgcolor=#FF83FA>背景色的设置是按照十六进制颜色值:#FF83FA
</td>
</tr>
</table>
<table>
<tr>
<td bgcolor=#D1EEEE>背景色的设置是按照十六进制颜色值:#D1EEEE
</td>
</tr>
</table>
<table>
<tr>
<td bgcolor=#C0FF3E>背景色的设置是按照十六进制颜色值:#C0FF3E
</td>
</tr>
</table>
<table>
<tr>
<td bgcolor=#54FF9F>背景色的设置是按照十六进制颜色值:#54FF9F
</td>
</tr>
</table>
<table>
<tr>
<td bgcolor=DarkSeaGreen>这里的背景色是:DarkSeaGreen,此处输入任意想输入的内容
</td>
</tr>
</table>
6、文章转载
文章作者(任意想输入的汉字), <a href="转载文章的网址">转载文章的名称</a>
7、代码片
名称 | 关键字 | 调用的js | 说明 |
---|---|---|---|
AppleScript | applescript | shBrushAppleScript.js | |
ActionScript 3.0 | actionscript3 , as3 | shBrushAS3.js | |
Shell | bash , shell | shBrushBash.js | |
ColdFusion | coldfusion , cf | shBrushColdFusion.js | |
C | cpp , c | shBrushCpp.js | |
C# | c# , c-sharp , csharp | shBrushCSharp.js | |
CSS | css | shBrushCss.js | |
Delphi | delphi , pascal , pas | shBrushDelphi.js | |
diff&patch | diff patch | shBrushDiff.js | 用代码版本库时,遇到代码冲突,其语法就是这个 |
Erlang | erl , erlang | shBrushErlang.js | |
Groovy | groovy | shBrushGroovy.js | |
Java | java | shBrushJava.js | |
JavaFX | jfx , javafx | shBrushJavaFX.js | |
javascript | js , jscript , javascript | shBrushJScript.js | |
Perl | perl , pl , Perl | shBrushPerl.js | |
php | php | shBrushPhp.js | |
text | text , plain | shBrushPlain.js | 就是普通文本 |
Python | py , python | shBrushPython.js | |
Ruby | ruby , rails , ror , rb | shBrushRuby.js | |
SASS&SCSS | sass , scss | shBrushSass.js | |
Scala | scala | shBrushScala.js | |
SQL | sql | shBrushSql.js | |
Visual Basic | vb , vbnet | shBrushVb.js | |
XML | xml , xhtml , xslt , html | shBrushXml.js | |
Objective C | objc , obj-c | shBrushObjectiveC.js | |
F# | f# f-sharp , fsharp | shBrushFSharp.js | |
xpp | xpp , dynamics-xpp | shBrushDynamics.js | |
R | r , s , splus | shBrushR.js | |
matlab | matlab | shBrushMatlab.js | |
swift | swift | shBrushSwift.js | |
GO | go , golang | shBrushGo.js |
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )
文章目录
一、下载 Linux 内核源码
参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ;
- 5.x 内核源码下载地址 : https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/
- Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.gz
下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 , 参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;
不同版本的 Linux 内核 区别 :
- 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ;
- 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ;
二、使用 VSCode 阅读 Linux 内核源码
参考 【开发环境】安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Visual Studio Code ) 博客 , 安装 VSCode 软件 ;
打开 VSCode , 选择 " 菜单栏 / 文件 / 打开文件夹 " 选项 ,
选择 Linux 内核源码目录 , 点击 " 选择文件夹 " 按钮 ,
此时就可以在 VSCode 中阅读 Linux 内核源码 ;
以上是关于Linux0.11 内核体系结构的主要内容,如果未能解决你的问题,请参考以下文章