从今天开始我们学习第四讲,主题聚焦于操作系统的接口(Interface) 。
操作系统启动相关回顾
操作系统的接口是操作系统的第二部分。此前我们探讨过系统的启动,它属于操作系统的第一部分。在系统启动时,操作系统的代码会从磁盘载入到内存,从零地址开始存储 。同时,会创建一些初始的数据结构,如gdt表(全局描述符表)、idt表(中断描述符表)以及用于管理内存的memmap(位图数据结构)等。至此,操作系统能够管理和控制硬件,而应用程序处于内存的上端,例如我们当下正在使用的PPT。
认识接口概念
我们先从生活常识来理解接口。
像电源插座,我们只需插上插头就能用电,无需了解火线、零线以及电压等背后的电路原理;踩下汽车油门,汽车就能获得供油从而行驶,普通用户也不用知道中间复杂的传动装置情况。
从专业层面来讲,接口的作用在于连接两个事物、进行信号转换并屏蔽细节。
对于操作系统接口而言,它连接上层用户(实际上更多是连接应用软件与操作系统),为用户提供便捷的使用方式,同时将底层复杂的实现细节进行屏蔽。
用户使用操作系统的方式
用户使用计算机主要有以下三种方式:
- 命令行:以Linux系统(如Ubuntu )为例,当我们编写一个像output这样的程序(代码示例为
#include <stdio.h> int main(int argc, char * argv[]) { printf("ECHO:%s\n", argv[1]); }
),并将其编译成命令后,在命令行中输入该命令,就能得到相应的执行结果。
实际上,命令就是一段程序,而执行命令的shell(例如/bin/sh )同样也是程序。在系统启动的最后阶段会执行shell程序,它是一个死循环,持续等待用户输入命令并执行。在执行过程中,会调用一些关键函数来实现对计算机硬件资源(如CPU、键盘、显示器等 )的调用。 - 图形按钮:在Windows系统中,这种方式极为常见,比如打开开始桌面、计算机等操作。图形按钮基于一套消息机制。
当鼠标点击或键盘按下时,硬件产生的输入会被送入系统消息队列,应用程序通过消息循环(例如GetMessage )来获取消息,然后依据不同的消息类型,执行相应的消息处理程序(例如WinProc ) 。例如在图形界面程序中,一个按钮的点击事件会触发特定的函数,进而执行相关操作,比如打开文件并写入内容。本质上,图形界面也是一个包含画图等功能的C程序。 - 应用程序:就像Microsoft Word,用户通过它进行文字编辑等操作,这也是一种常见的使用计算机的方式。
操作系统接口的本质
无论是命令行程序,还是图形界面的消息框架程序与消息处理程序,用户使用计算机都是通过程序(即应用软件 )。操作系统接口连接操作系统和应用软件,方式是通过C语言程序。普通C代码加上一些由操作系统提供的重要函数,这些重要函数就是操作系统接口,其表现形式为函数调用,也就是系统调用。
常见的系统调用有很多,例如printf函数,它在底层最终可能会调用write这个真正的系统调用 。此外,还有像open用于打开文件或目录、fork用于创建一个进程等。
在学习操作系统时,我们无需强行记住所有的系统调用,但要明确哪些属于系统调用,以及知晓从何处查询相关信息。比如POSIX标准就对一系列系统调用进行了定义,相关手册在网上可以下载,通过查阅该手册,我们能够了解操作系统应该为上层提供哪些功能和接口。
总之,操作系统接口就是系统调用,它由一些具体的函数构成。下一章我们将进一步探究这些函数在操作系统内部的具体运作方式,以及它们是如何实现相应功能的。