9.4操作系统和高级编程语言使硬件抽象化
通过使用操作系统提供的系统调用,程序员就没必要编写直接控 制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。这是个非常了不起的处理。
下面就让我们来看一下硬件抽象化的具体实例。代码清单 9-2 是用 C语言编写的往文件中写人字符串的应用。fopen()是用来打开文件的函数,fputs()使用来往文件中写入字符串函数,fclose()是用来文件的函数。
该应用在编译运行后,MyFile.txt 文件中就会被写人“你好”字符串。文件是操作系统对磁盘媒介空间的抽象化。就如第5章中介绍的那样,作为硬件的磁盘媒介,就如同树木的年轮一样,被划分为了多个扇区,并扇区为单位对磁盘进行读写。如果直接对硬件进行操作的话,那就变成了通过向磁盘用的I/O指定扇区位置来对数据进行读写了。
但是,在代码清单 9-2 的程序中,扇区根本没有出现过。传递给 fopen()函数的参数,是文件名"MyFile.txt"和指定文件写人的"w"。传递给 fputs()的参数,是往文件中写人的字符串"你好"和 fp。传递给 fclose 的参数,也仅仅是 fp。也就是说,磁盘媒介的读写采用了文件这个概念,将整个流程抽象化成了打开文件用的 fopenO、写人文件用的fputs()、关闭文件用的fclose()(图9-7)。
下面让我们来看一下代码清单 9-2 中变量fp的功能。变量 fp 中被赋予的是 fopen()函数的返回值。该值称为文件指针。应用打开文件后,操作系统就会自动申请分配用来管理文件读写的内存空间。这个内存空间的地址可以通过 fopen( 函数的返回值获得。用 fopen()打开文件后,接下来就是通过指定文件指针来对文件进行操作。正因为如此, fputs()及fclose()的参数中都指定了文件指针(变量fp)。
至于用来管理文件读写的内存空间的内容实际在哪里,程序员则没必要关注。只要能意识到“用来操作磁盘媒介的某些信息在某个地方存储着”,就可以制作应用了。