📄 linuxkernel.htm
字号:
<P ALIGN="JUSTIFY">第一条语句(第一行)将寄存器</FONT><FONT SIZE=3>15</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>指定的地址中的内容加载到寄存器</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中。第二条指令将紧接着的内存中的内容加载到寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中。第三行比较寄存器</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,如果相等,分支到标号</FONT><FONT SIZE=3>100</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,否则,继续执行第四行,将寄存器</FONT><FONT SIZE=3>17</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的内容存到内存中。如果内存中的数据相同,就不必存储数据。编写汇编级的程序需要技巧而且十分冗长,容易出错。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>系统的核心很少的一部分是用汇编语言编写,而这些部分之所以使用汇编语言只是为了提高效率,并且和具体的微处理器相关。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.1.2 The C Programming Language and Compiler (C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言和编译器</FONT><FONT SIZE=3>)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">使用汇编语言编写大型程序十分困难,消耗时间,容易出错而且生成的程序不能移植,只能束缚在特定的处理器家族。更好的选择是使用和机器无关的语言,例如</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>允许你用逻辑算法描述程序和要处理的数据。被称为编译程序(</FONT><FONT SIZE=3>compiler</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)的特殊程序读入</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序,并将它转换为汇编语言,进而产生机器相关的代码。好的编译器生成的汇编指令可以和好的汇编程序员编写的程序效率接近。大部分</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心是用</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言编写的。以下的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>片断:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">if (x != y)</P>
<P ALIGN="JUSTIFY"> x = y;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">执行了和前面示例中汇编代码完全一样的操作。如果变量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的内容和变量</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的内容不一样,变量</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的内容被拷贝到变量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>代码用例程(</FONT><FONT SIZE=3>routine</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)进行组合,每一个例程执行一项任务。例程可以返回</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所支持的任意的数值或数据类型。大型程序比如</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心分别由许多的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言模块组成,每一个模块有自己的例程和数据结构。这些</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>源代码模块共同构成了逻辑功能比如文件系统的处理代码。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>支持多种类型的变量。一个变量是内存中的特定位置,可用符号名引用。上述的</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>片断中,</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>y</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>引用了内存中的位置。程序员不需要关心变量在内存中的具体位置,这是连接程序(下述)必须处理的。一些变量包含不同的数据例如整数、浮点数等和另一些则包含指针。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">指针是包含其它数据在内存中的地址的变量。假设一个变量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,位于内存地址</FONT><FONT SIZE=3>0x80010000</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>你可能有一个指针</FONT><FONT SIZE=3>px</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,指向</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3> Px</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可能位于地址</FONT><FONT SIZE=3>0x80010030</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</FONT><FONT SIZE=3>Px</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的值则是变量</FONT><FONT SIZE=3>x</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的地址,</FONT><FONT SIZE=3>0x80010000</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>允许你将相关的变量集合成为结构。例如:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Struct {</P>
<P ALIGN="JUSTIFY">Int I;</P>
<P ALIGN="JUSTIFY">Char b;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">}</FONT><FONT SIZE=3> my_struct;</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">是一个叫做</FONT><FONT SIZE=3>my_struct</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的数据结构,包括两个元素:一个整数(</FONT><FONT SIZE=3>32</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位)</FONT><FONT SIZE=3>I</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和一个字符(</FONT><FONT SIZE=3>8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位数据)</FONT><FONT SIZE=3>b</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.1.3 Linkers</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(连接程序)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">连接程序将几个目标模块和库文件连接在一起成为一个单独的完整程序。目标模块是汇编程序或编译程序的机器码输出,它包括机器码、数据和供连接程序使用的连接信息。比如:一个目标模块可能包括程序的所有数据库功能,而另一个目标模块则包括处理命令行参数的函数。连接程序确定目标模块之间的引用关系,即确定一个模块所引用的例程和数据在另一个模块中的实际位置。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心是由多个目标模块连接而成的独立的大程序。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2 What is an Operating System</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(什么是操作系统?)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">没有软件,计算机只是一堆发热的电子元件。如果说硬件是计算机的心脏,则软件就是它的灵魂。操作系统是允许用户运行应用程序的一组系统程序。操作系统将系统的硬件抽象,呈现在用户和应用程序之前的是一个虚拟的机器。是软件造就了计算机系统的特点。大多数</FONT><FONT SIZE=3>PC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以运行一到多个操作系统,而每一个操作系统从外观和感觉上都大不相同。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>由不同功能的部分构成,这些部分总体组合构成了</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作系统。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>最明显的部分就是</FONT><FONT SIZE=3>Kernel</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>自身,但是如果没有</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>libraries</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一样没有用处。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">为了了解什么是操作系统,看一看在你输入最简单的命令时发生了什么:</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">$ls</P>
<P ALIGN="JUSTIFY">Mail 	c	images	perl</P>
<P ALIGN="JUSTIFY">Docs	tcl</P>
<P ALIGN="JUSTIFY">$</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这里的</FONT><FONT SIZE=3>$</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是登录的</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>输出的提示符(此例是</FONT><FONT SIZE=3>bash</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>):表示</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在等候你(用户)输入命令。输入</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>引发键盘驱动程序识别输入的字符,键盘驱动程序将识别的字符传递给</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>去处理。</FONT><FONT SIZE=3>shell</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>先查找同名的可执行映象,它找到了</FONT><FONT SIZE=3>/bin/ls, </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>然后调用核心服务将</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>执行程序加载到虚拟内存中并开始执行。</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>执行程序通过执行核心的文件子系统的系统调用查找文件。文件系统可能使用缓存的文件系统信息或通过磁盘设备驱动程序从磁盘上读取文件信息</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>也可能是通过网络设备驱动程序同远程主机交换信息而读取本系统所访问的远程文件的详细信息(文件系统可以通过</FONT><FONT SIZE=3>NFS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>网络文件系统远程安装)。不管文件信息是如何得到的,</FONT><FONT SIZE=3>ls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>都将信息输出,通过显示驱动程序显示在屏幕上。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">以上的过程看起来相当复杂,但是它说明了即使是最简单的命令也是操作系统各个功能模块之间共同协作的结果,只有这样才能提供给你(用户)一个完整的系统视图。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.1 Memory management</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(内存管理)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">如果拥有无限的资源,例如内存,那么操作系统所必须做的很多事情可能都是多余的。所有操作系统的一个基本技巧就是让少量的物理内存工作起来好像有相当多的内存。这种表面看起来的大内存叫做虚拟内存,就是当软件运行的时候让它相信它拥有很多内存。系统将内存分为容易处理的页,在系统运行时将这些页交换到硬盘上。而应用软件并不知道,因为操作系统还使用了另一项技术:多进程。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.2 Processes (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>进程</FONT><FONT SIZE=3>)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">进程可以看作一个在执行的程序,每一个进程都是正在运行的特定的程序的独立实体。如果你观察一下你的</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>系统,你会发现有很多进程在运行。例如:在我的系统上输入</FONT><FONT SIZE=3>ps </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>显示了以下进程:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">$ ps</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -