【计算机操作系统:三、操作系统的用户接口】
第3章 操作系统的用户接口
3.1 用户工作环境
3.1.1 操作系统提供的环境
操作系统为用户提供了一种友好、直观的工作环境,使用户能够方便地访问硬件资源并运行各种应用程序。
-
命令行界面(CLI):
-
用户通过键入命令与系统交互。
-
特点:轻量、高效,但学习成本较高。
-
-
图形用户界面(GUI):
-
提供窗口、图标和菜单等可视化操作元素。
-
优点:操作直观,适合普通用户。
-
-
移动操作环境:
- 针对智能设备优化的用户环境,例如触摸屏和语音输入支持。
3.1.2 操作系统的生成和系统初启
操作系统的生成和启动是系统初始化的重要步骤。
-
操作系统生成:
-
通过编译源代码生成可执行内核映像文件。
-
包括内核配置、模块编译和链接。
-
-
系统初启过程:
-
引导加载程序(Bootloader):加载内核至内存并启动。
-
内核初始化:设置硬件、初始化内存管理和设备驱动。
-
用户空间初始化:启动系统服务和登录界面。
-
3.1.3 应用程序的处理
操作系统负责加载、运行和管理应用程序。
-
加载程序:将可执行文件加载到内存。
-
进程管理:分配CPU时间、内存资源并提供进程间通信。
-
异常处理:处理应用程序执行过程中出现的错误或中断。
3.2 用户接口
3.2.1 用户接口的定义
用户接口是操作系统与用户之间的交互媒介,允许用户发出指令并接收反馈。
-
功能:
-
提供用户操作系统资源的入口。
-
显示系统状态和反馈结果。
-
-
类型:
-
CLI:基于文本的接口。
-
GUI:基于图形的接口。
-
3.2.2 操作系统提供的用户接口
操作系统为用户提供多种类型的接口以满足不同需求。
-
文件管理接口:
- 提供文件浏览、创建、修改和删除功能。
-
进程管理接口:
- 提供任务管理器、终端窗口等。
-
网络管理接口:
- 提供网络连接、配置和监控功能。
3.3 系统功能调用
3.3.1 系统功能调用的定义
系统功能调用(System Call)是应用程序向操作系统内核请求服务的接口。
-
作用:
- 使用户程序可以访问内核提供的底层功能。
-
常见服务:
-
文件操作:打开、读取、写入文件。
-
进程控制:创建、终止进程。
-
设备管理:访问硬件设备。
-
3.3.2 系统功能调用的实现
系统调用通过特定的中断或陷入指令将控制权从用户态切换到内核态。
-
调用过程:
-
用户程序发出系统调用请求。
-
系统调用号通过寄存器传递至内核。
-
内核执行相应的服务。
-
3.3.3 应用程序的编程接口
应用程序通过API间接使用系统调用。
-
库函数:
- 提供更高级别的封装,例如C标准库中的
fopen
。
- 提供更高级别的封装,例如C标准库中的
-
优势:
-
隐藏系统调用的复杂性。
-
提高程序的可移植性。
-
3.4 UNIX系统功能调用
3.4.1 UNIX系统调用的分类
UNIX系统提供了一组功能丰富的系统调用。
-
文件系统相关:
- 打开文件(open)、关闭文件(close)。
-
进程管理相关:
- 创建进程(fork)、执行程序(exec)。
-
通信相关:
- 管道(pipe)、信号(signal)。
3.4.2 UNIX系统调用的实现
UNIX系统调用通过陷入指令切换到内核态,并根据调用号执行相应的功能。
-
陷入机制:
- 用户态程序使用
int
或syscall
指令触发。
- 用户态程序使用
-
系统调用表:
- 内核维护系统调用号与功能的映射表。
3.5 Linux系统功能调用
3.5.1 Linux系统功能调用的过程
Linux的系统调用过程与UNIX类似,但提供了更灵活的机制。
-
用户态到内核态的切换:
- 使用
syscall
指令或软中断触发。
- 使用
-
参数传递:
- 通过寄存器或堆栈传递调用参数。
3.5.2 Linux系统功能调用的实现机制
Linux内核对系统调用的实现机制进行优化,支持动态加载模块。
-
系统调用号分配:
- 内核为每个系统调用分配唯一编号。
-
中断处理程序:
- 处理用户态程序发出的系统调用请求。
3.5.3 增加一个新的系统调用的方法
Linux允许开发者添加新的系统调用以扩展功能。
-
步骤:
-
修改系统调用表。
-
编写实现函数并重新编译内核。
-
3.5.4 从用户空间访问新的系统调用
用户程序可以通过直接调用新系统调用的编号访问。
-
使用
**syscall**
库函数:- 直接传递系统调用号和参数。
-
测试与验证:
- 确保新增系统调用的功能正确执行。