设备驱动、虚拟地址

1.为什么要引入设备驱动

     操作系统作为硬件的上层,它是对硬件的管理和抽象。对于操作系统上面的运行库和应用程序来说,它们希望看到的是一个统一的硬件访问模式。我们不希望在开发应用程序的时候直接读写硬件端口、处理硬件中断等这些复杂的事情,由于硬件之间千差万别,它们的操作方式和访问方式都有区别。比如我们再写一个画直线 的程序,我们希望不管我们使用 的是何种显示器、什么显卡,有多大分辨率,我们都只要调用一个统一的LineTo()函数,具体的实现由操作系统来完成。试想:如果一个程序员要关心具体的硬件,那么结果会是:对于A 型号的显卡来说要往I/O端口0X1001写一个命令0X1111,然后在端口0X1002里面读取一个4字节的显存地址,然后逐个地在显存上面画点……如果是B型号的显卡,可能是另一种方式。这简直就是灾难。不过在操作系统成熟之前,的确存在这样的情况,就是应用程序的程序员要直接跟硬件打交道。

        当操作系统成熟后,硬件逐渐被抽象成一系列概念。在UNIX里面,硬件设备的访问形式和普通文件一样。WINDOWS里面图像硬件被抽象成GDI,声音和多媒体设备被抽象成DirectX对象,等等。程序员逐渐从硬件细节中解放出来,可以更多关注应用程序本身开发。这些繁琐的硬件细节全部交给操作系统来完成,即是操作系统的硬件驱动程序(Device Driver)来完成。硬件驱动程序可以看作是操作系统的一部分,运行在特权模式下。因为PC的硬件很多,所以操作系统开发者不可能为每种硬件都写一个驱动程序,这些驱动程序的开发通常由硬件开发者来完成。操作系统开发者为硬件生产商提供一系列框架和接口,只要按照这种接口和框架开发的驱动程序都可以在该操作系统上使用。


2.为什么要用虚拟内存

   *地址空间的隔离

   *程序运行的地址不确定 

      因为程序每次需要装入运行时,我们都要给它从内存分配一块足够大的空闲区域,这个空闲区间位置的不确定性,给程序的编写造成了一定的麻烦,因为程序在编写的时候访问数据和指令跳转时的目标地址很多都是固定的。


    我们的解决办法是:增加中间层。即使用一种间接的地址访问方法。整个想法是这样的:我们把程序给出的地址看成是虚拟地址(Virtual Address ),然后通过某种映射的方法,将这个虚拟地址转化成实际的物理地址,这样,只要我们能够处理好这个映射过程,就可以保证任意一个程序所能访问的物理空间和另一个程序相互不重叠,以达到地址空间相隔离的效果。


3. 分段和分页

     分段的思想是把程序所需要的内存空间大小的虚拟空间映射到某个地址空间。虚拟空间段大小和物理空间大小相同。















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章