胡言乱语计算机一

📅 2026/7/4 18:00:14
胡言乱语计算机一
操作系统是连接硬件和应用软件之间的纽带。至少目前是这样的。而操作系统这门课也是计算机专业的必修课之一。无奈当时混沌。并没有真正的上好这一门课之所以叫胡言乱语。是因为这里面的水对我来说实在是太深了。任何一个小的问题背后都是一个深渊。所以第一篇从最初的大学课程最初开始讲起。8086应该是学计算机最开始的地方。可以说是我们现在x86系列的最简单最基础的实现。里面的设计都或多或少的影响到了后面系列的实现。所以学校从这里开始的确是非常明智的虽然当时我不这么认为。但是想要了解或是明白8086的设计那么也就要带出另外的那些更为底层的计算机指令集机器语言引脚门电压等等。当然我不是说这些不重要但是如果有这些基础的确可以加快加深8086以及其他系列的一些知识的理解。这里就略过这些东西。一是自己能力不足二是我觉得现在谈这个真的不是很重要。想想这2个原因其实也就一个 )。存储器是计算机的核心部件。现在的计算机围绕存储器来构建所以必须从存储器开始。在CPU眼中存储器保存的东东。只有2种指令和数据。当然退而求其次存储器中没有指令和数据之分只有0和1。这个世界的确是非常的和谐简单。那么CPU是如何分别这2种东东呢。这完全取决于CPU自己。当遇到二进制信息如1000100111011000时CPU可以把他看成大小为89D8H的数据处理也可以看做是指令mov ax bx来执行。存储器被划分为若干个存储单元一般来说一个存储单元大小为一个Byte。一个拥有128个存储单元的存储器。容量为128个字节。那么存储器被划分为了多个存储单元从0开始排序。CPU从内存中读取数据首先需要的就是存储单元的地址也就是CPU需要知道读取哪一个存储单元中数据。当然CPU不仅仅需要知道地址还需要告诉存储器要做什么操作是读还是写而且在计算机中也不仅仅只有一个存储器也不仅仅只有一种设备需要去操作。还需要指明对哪一个设备操作。所以。CPU对数据的读写需要以下的基本信息。存储单元地址地址设备选择读写命令控制读写的数据数据那么CPU通过什么来将这些信息传递给设备呢CPU计算机中的这些设备处理传输信息都是电信号,连接这些设备的导线为总线。总线根据传送信息不同分为地址总线控制总线数据总线。CPU从3号单元中读取数据过程CPU通过地址线将地址信息3发出CPU通过控制线发出读命令选中存储器通知到读数据将3号单元中的数据8通过数据线交给CPU既然知道了CPU读取数据的流程那么CPU能够找到多少个这样的地址是我们遇到的下面的问题。显然地址总线上能传递多少种不同的地址那么CPU就可以找到多少个存储单元的地址。如果CPU有10根地址总线1根能够提供2种信号1、0。那么10根就能提供2^10个也就是1024种。那么我们就说CPU的寻址大小为1K。或这个CPU的地址空间为1K。CPU与各个设备之间传递数据是通过数据总线进行。所以数据总线的宽度决定了CPU和外界数据传递的速度。我们很容易想到16根数据线可以一次传递2个字节。同样类似的。控制总线的宽度也决定了CPU对外部的控制种类。所以决定了CPU对外部的控制能力。当我们买电脑的时候。除了考虑CPU以外还需要搞定一个好的主板。当我们打开电脑之后看到的首先也是这个大家伙。而且如果你的电脑主板被烧坏的话那么基本上这个电脑主机也就完蛋了。可见主板在现在计算机中的地位。主板最基本的作用就是通过它把计算机的核心部分通过总线地址、控制、数据总线相连并且还需要为扩展预留接口。当我们买到一个主板时会看到有非常多的接口卡槽而事实上CPU控制这些设备就是通过总线去控制这些接口卡来进行的。上面的那些东东不管是显卡声卡网卡。都有两点相同。都和CPU总线相连CPU进行读写操作是都是通过控制线发出内存读写命令。也就是说CPU操作他们的时候都把他们当做内存来对待。把这些不同的设备组成一个大的逻辑存储器。这个逻辑存储器就是我们的地址空间。在上面这个图中所有的物理存储器都被看作一个由许多存储单元构成的逻辑存储器每一个都有一个地址段也就是一段地址空间。CPU往这段空间中读写数据其实就是读写了物理存储器。那么我们可以看出。CPU的地址总线宽度是在是太重要了。在我们的8086中地址总线宽度为20也就是可以搞定2^20个不同的地址。也就是说8086的地址空间大小为1MB。不同的计算机系统的地址空间分配是不同的。如下是8086的看到这幅图那么我们就可以从容的写一个HelloWorld程序输出到我们的屏幕上。因为我们可以直接在A0000~BFFFF中写数据而这些数据会跑到显卡中最后跑到屏幕上。那么我们现在明白了。CPU访问内存单元时需要给出这个内存单元的地址所有的内存单元构成存储空间是一个一维线性空间。每一个内存单元在这个空间中都有唯一地址这个唯一的地址就是物理地址。CPU通过地址总线送入存储器的。必须是一个内存单元的物理地址。同样这个地址在CPU内部中必须搞定这个地址再发送到地址总线之前。不同的CPU形成物理地址的方式也不同。而我们现在所考虑的就是8086是如何搞定这个物理地址的。那么我们又必须要了解些其他知识。8086是16位结构的CPU。那么他的意思是运算器一次最多处理16为数据寄存器最大宽度16位寄存器和运算器之间的内部线为16位。也就是说8086一次只能处理传输存储寄存器16位的地址。从我们大多数人的思维一个地址也就是一个指针最好和一个整数的长度一致。但是我们知道8086的地址总线为20位。达到了1MB的寻址。为什么会是这样的呢在很久很久以前当CPU的技术从8位发展到16位的时候地址总线本来也应该是16位也就是64K。但是大家发现这个太小了。然后intel决定采用1M。这个在当时的确是非常的大而盖茨甚至还有“无论对谁来说,640K内存都足够了”的言论。当然。这里并没有不敬在里面。只能说计算机的发展实在是太迅速了。所以地址总线的宽度为20位。但是这个带来了一个问题。面对16位的ALU如何来填补这个呢Intel设计了一种在当时看来一个非常巧妙的方法。也就有了我们现在看到的8086地址翻译。16位段地址16位偏移来形成这个20位的地址。随着计算机的发展我们越来越的希望计算机能够处理更多的事情伴随着CPU运算能力的提升。整个计算机的性能主要是卡在了CPU利用率上。面对“优秀”的CPU我们并没有充分的利用它实在是暴殄天物。所以我们希望我们的CPU能够给我们做更多的事情最好不要停。就像老早的资本家总是希望工人天天干活一样。不幸的是在当时的DOS操作系统下面。是单任务的。并不支持多任务。我们不能在听音乐的时候打开文本文档编辑。那么构造计算机的那些老前辈们想到的一个招数是时间片。每个程序都有机会获得这些时间片通过不断的轮询只要这个时间足够短那么人类是无法觉察出来。我们会有这个错觉好多的程序再一起执行。虽然我们在DOS可以利用内存驻留的技术实现类似的体验但是这个却并不是安全的。因为我们往往是通过修改中断向量表来做。我们无法保证其他程序是否正确修改中断向量表。而且如果我们的程序通过这里修改并成为我们程序的一部分时也就意味着其他的程序也能这么做。那么我们很难保证计算机中的各个程序能够互不影响。同样包括操作系统。这也就意味着我们无法构建一个安全的环境让我们的操作系统以及各个程序不互相影响制约。同样当我们将CPU时间片分给那些程序的时候。在一开始的初期并不是我们这样的多任务。而是一种叫做协作式多任务。操作系统控制CPU的时间片而每个程序形成一个队列。每个程序在获得CPU时间后必须归还CPU。注意这里的归还是程序本身的事情而不是操作系统的事情。也就是说如果有一个程序不想归还时间片或是他不小心陷入一个死循环那么别的程序也就无法执行甚至包括操作系统自己本身。因为他自己也在那个队列里面傻等。那么这整个世界也就变得混沌不堪了。因为操作系统并不能识别哪一个程序是不良的程序。造成这些问题的根本原因在于我们并没有等级的概念。也就是说整个硬件资源对我们的每一个程序都是平等的。事实上8086下我们看到了任何一个程序都可以通过段偏移来实现访问整个地址空间。甚至是中断向量表还有硬件。所以在这个原始社会下。我们达到了真正意义上的公平但是也验证了低下生产力的现实。所以为了实现这些功能。必须有硬件的支持。那么80386也就跳入了我们的视野。事实上他就是为了支持我们的想法实现多任务实现各个任务互不影响而诞生的。在开始介绍80386之前。我们好好思考一下我们需要实现的功能。实现等级观念有些程序需要有特权。执行一些系统的核心部分而一些程序必须在一些限制上运行。具体的讲则是有些地址空间不能访问有些寄存器不能读取或是修改。需要提供一个复杂的内存管理来帮助我们实现各个任务的独立的地址空间。这样可以保证一个任务不会随意修改另一个任务的数据。其实让我们说到根上。其实我们需要实现针对地址空间的保护。只有实现了这种保护机制我们才能保护操作系统的代码维护操作系统的特权。而有了操作系统的支持下我们才能继续去谈内存管理和保护操作系统之上的各种程序之间不互相影响。搞定了这些之后我们就不难理解8086的缺陷以及80386为什么要实现这些功能了。当然。这个过程肯定不会像8086那样平滑。因为这完全是一个不同的设计思路思想。即使他披着一张似乎有着段加偏移量的一层皮。好吧让我扯的远一点。随着生产力的发展有一个超牛B的程序他想做其他程序的老大。让他们乖乖听话。而这个程序就是操作系统。可惜啊在原始社会生产力不足。并不能让所有的人都听话。让我们暂时告别原始社会我们来到了奴隶社会。其实计算机发展也和人类社会一样。我们出现了阶级让我们仔细看看这个维持统治阶级工具的核心——80386体系结构。80386以后CPU历经多种改进虽然速度提高了几个量级功能上也有很多改进。但并没有重大的质的改变。所以统称为i386结构如果除去大量的3D密集型图形图像运算并行等之后。其实只是相当于一个更更快速80386而已。80386是32位的CPU。也就是ALU数据总线是32位。这里我们终于在地址总线和数据总线一致了。都是32位。当面对地址总线的宽度达到32位。也就是CPU的寻址能力达到了2^32 4G。这的确是一个相当大的空间。为了保证这个空间的和谐。80386增加了一个叫做保护模式的一个名词。但是为了和之前的8086体系兼容又有了实模式和虚拟86模式。这里只是简单的介绍。实模式没有什么其他的意义。只是比原来的8086寄存器大了。CPU快了。一些指令和操作更加方便容易了。保护模式则是重点。事实上没有保护模式现代操作系统是无法构建的在x86下。既然我们有了这么大的一个空间那么该如何分配呢很容易的想法是我们可以把地址空间平均分给各个任务。那么他们都有了各自的地址他们只要在各自地方做就好了。但是这个同样假设这各个程序都是善良的。而且对于各种各样的硬件又该如何做呢他们所映射的CPU地址空间该如何保护而且当我们真正的运行着相当多的任务的时候我们的内存是否还能经得住呢而这些问题归根到底是因为CPU的地址空间每一个任务都是可见的那么就想通过各种各样的渠道来搞破坏。所以为了构建操作系统的核心地位以及各个任务之间的互不干涉。操作系统中最重要的概念登场了——虚拟存储技术。其实这是一个很简单的道理。统治阶级操作系统为了维持他的权威他把珍贵的核心资源CPU地址空间和被统治阶级用户程序之间加了一个中间层从而核心资源CPU地址空间对被统治阶级用户程序是透明的而统治阶级操作系统所独占。然后他又对所有的被统治阶级用户程序整了一个弥天大谎:“你们有整个4G的CPU地址空间。而且你们在跑的时候程序运行是独占所有资源的”。然后被统治阶级用户程序就在这个统治阶级操作系统下勾画的这个美丽的世界下安分的生活下去了至少是绝大多数。这里的表达不准确这里的用户程序其实我的意思是任务或是说在普通程序我们可以写这么一个地址在高地址空间上只是如果我们去操作他操作系统不让我们这么做。但是我们还是能“看”到的。感觉还是不合适这段可以去掉)OK。操作系统给这个世界整个一个这么大的谎言。现在计算机的核心资源都在他的掌握下了他的目的终于达到了。但是就和再苛刻的资本家也得给工人发工资一样。如果没有了被统治阶级统治阶级还有什么存在意义呢所以操作系统也必须给用户程序一个高效的获得CPU资源的方式。也就是要给用户