《操作系统真象还原》——0.4 软件是如何访问硬件的

0.4 软件是如何访问硬件的

硬件是各种各样的,发展速度还是非常快的。各个硬件都有自己的个性,操作系统不可能及时更新各种硬件的驱动方法吧。比如,刚出来某个新硬件,OS开发者们便开始为其写驱动,这不太现实,会把人累死的。于是乎,便出现了各种硬件适配设备,这就是IO接口。接口其实就是标准,大家生产出来的硬件按照这个标准工作就实现了通用。

硬件在输入输出上大体分为串行和并行,相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与CPU通信,反过来也是,CPU通过串行接口与串行设备数据传输。并行设备的访问类似,只不过是通过并行接口进行的。

访问外部硬件有两个方式。

(1)将某个外设的内存映射到一定范围的地址空间中,CPU通过地址总线访问该内存区域时会落到外设的内存中,这种映射让CPU访问外设的内存就如同访问主板上的物理内存一样。有的设备是这样做的,比如显卡,显卡是显示器的适配器,CPU不直接和显示器交互,它只和显卡通信。显卡上有片内存叫显存,它被映射到主机物理内存上的低端1MB的0xB8000~0xBFFFF。CPU访问这片内存就是访问显存,往这片内存上写字节便是往屏幕上打印内容。看上去这么高大上的做法是怎么实现的,这个我们就不关心了,前面说过,计算机中处处是分层,我们要充分相信上一层的工作。

(2)外设是通过IO接口与CPU通信的,CPU访问外设,就是访问IO接口,由IO接口将信息传递给另一端的外设,也就是说,CPU从来不知道有这些设备的存在,它只知道自己操作的IO接口,你看,处处体现着分层。

于是问题来了,如何访问到IO接口呢,答案就是IO接口上面有一些寄存器,访问IO接口本质上就是访问这些寄存器,这些寄存器就是人们常说的端口。这些端口是人家IO接口给咱们提供的接口。人家接口电路也有自己的思维(系统),看到寄存器中写了什么就做出相应的反应。接口提供接口,哈哈,有意思。不过这是人家的约定,没有约定就乱了,各干各的,大家都累,咱们只要遵循人家的规定就能访问成功。

时间: 2024-12-25 08:34:15

《操作系统真象还原》——0.4 软件是如何访问硬件的的相关文章

《操作系统真象还原》——导读

**前言**想象一下,如果是爱因斯坦那样的天才给我们讲物理知识,我们会觉得物理更容易理解吗?肯定是不会的,因为在爱因斯坦眼中比较容易的内容也许对我们来说非常深奥,他用B解释A的时候也许会让我们更迷惑,因为B我们也不懂,这就是基础的问题了.幸运的是阅读本书时读者只要有C语言和部分汇编语言的基础就行了,涉及的其他方面的知识我都会详细介绍,并以更易懂的方式去解释技术难点,读者不必担心看不懂本书. 回忆一下学车的经历:教练让学员先踩离合器再挂档,然后再踩油门,车子就开动啦.如果学员总是学不会这些,有可能

《操作系统真象还原》——0.3 写操作系统,哪些需要我来做

0.3 写操作系统,哪些需要我来做 首先应该明确,在计算机中有分层的概念,也就是说,计算机是一个大的组合物,由各个部分组合成一个系统.每个部分就是一层功能模块,各司其职,它只完成一定的工作,并将自己的工作结果(也就是输出)交给下一层的模块,这里的模块指的是各种外设.硬件. 这样,各种工作成果不断累加,通过这种流水线式的上下游协作,便实现了所谓的系统.可见,系统就是各种功能组合到一起后,产生最终输出的组合物.就像人的身体,胃负责搅拌食物,将这些食物变食糜后交给小肠,因为小肠只能处理流食,所以上游的

《操作系统真象还原》——0.6 为什么称为“陷入”内核

0.6 为什么称为"陷入"内核 前面提到了用户进程陷入内核,这个好解释,如果把软件分层的话,最外圈是应用程序,里面是操作系统,如图0-1所示. 应用程序处于特权级3,操作系统内核处于特权级0.当用户程序欲访问系统资源时(无论是硬件,还是内核数据结构),它需要进行系统调用.这样CPU便进入了内核态,也称管态.看图中凹下去的部分,是不是有陷进去的感觉,这就是"陷入内核".

《操作系统真象还原》——1.2 我们需要哪些编译器

1.2 我们需要哪些编译器 C语言虽然不是为设计大型软件而生的,但其却被用来开发大型软件. 现代操作系统基本上是用C语言再结合汇编语言开发的,所以C语言编译器,我们选择的是gcc.而汇编语言编译器,我们选择的是nasm.为什么选择这两个,首先因为它们都是开源软件,其次其强大的功能不亚于同类的商业软件. 1.2.1 世界顶级编译器GCC 秉着简单至上的原则,我们在开发过程中,能用简单的工具就不用复杂的.所以我们的系统,绝大部分是C语言实现的,而且并不需要多么高深的算法及数据结构功底. 另外我们在L

《操作系统真象还原》——0.25 指令集、体系结构、微架构、编程语言

0.25 指令集.体系结构.微架构.编程语言 指令集是什么?表面上看它是一套指令的集合.集合的意思显而易见,那咱们说说什么是指令. 在计算机中,CPU只能识别0.1这两个数,甚至它都不知道数是什么,它只知道要么"是",要么"不是",恰好用0.1来表示这两种状态而已. 人发明的东西逃不出人的思维,所以,先看看我们人类的语言是怎么回事. 不同的语言对同一种事物有不同的名字,这个名字其实就是代码.比如说人类的好朋友:狗,咱们在中文里称之为狗,但在英文中它被称为dog,虽然

《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗

0.8 代码中为什么分为代码段.数据段?这和内存访问机制中的段是一回事吗 首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美.就像用饭盒装饭菜一样,完全可以将很多菜和米饭混合在一起,或者搅拌成一体,哈哈,但这样可能就没什么胃口啦.如果饭盒中有好多小格子,方便将不同的菜和饭区分存放,这样会让我们胃口大开增加食欲. x86平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址.我们这里讨论的程序代码中的段(用section或segme

《操作系统真象还原》——0.15 局部变量和函数参数为什么要放在栈中

0.15 局部变量和函数参数为什么要放在栈中 局部变量,顾名思义其作用域属于局部,并不是像static那样属于全局性的.全局的变量,意味着谁都可以随时随地访问,所以其放在数据段中.而局部变量只是自己在用,放在数据段中纯属浪费空间,没有必要,故将其放在自己的栈中,随时可以清理,真正体现了局部的意义.这个就是堆栈框架,提到了就说一点吧,栈由于是向下生长的,堆栈框架就是把esp指针提前加一个数,原esp指针到新esp指针之间的栈空间用来存储局部变量.解释一个概念,堆是程序运行过程中用于动态内存分配的内

《操作系统真象还原》——0.5 应用程序是什么,和操作系统是如何配合到一起的

0.5 应用程序是什么,和操作系统是如何配合到一起的 应用程序是软件(似乎是废话,别急,往后看),操作系统也是软件.CPU会将它们一视同仁,甚至,CPU不知道自己在执行的程序是操作系统,还是一般应用软件,CPU只知道去cs:ip寄存器中指向的内存取指令并执行,它不知道什么是操作系统,也无需知道. 操作系统是人想出来的,为了让自己管理计算机方便而创造出来的一套管理办法. 应用程序要用某种语言编写,而语言又是编译器来提供的.其实根本就没有什么语言,有的只是编译器.是编译器决定怎样解释某种关键字及某种

《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的

0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的 首先肯定的是先有的编程语言,哪怕这个语言简单到只有一个符号.先是设计好语言的规则,然后编写能够识别这套规则的编译器,否则若没有语言规则作为指导方向,编译器编写将无从下笔. 第1个编译器是怎么产生的?这个问题我并没有求证,不过可以谈下自己的理解,请大伙儿辩证地看. 这个问题属于哲学中鸡生蛋.蛋生鸡的问题,这种思维回旋性质的本源问题经常让人产生迷惑.可是现实生活中这样的例子太多了. (1)英语老师教学生英语,学生成了英语老师后又可以教