这部分将讲解上层应用软件如何与操作系统交互,理解操作系统到底发生了什么事情,理解操作系统工作原理,为以后扩充操作系统、设计操作系统铺垫。
参考资料:
- 课程:哈工大操作系统(本部分对应 L4 && L5)
- 实验:操作系统原理与实践_Linux - 蓝桥云课 (lanqiao.cn)
- 笔记:操作系统学习导引 · 语雀 (yuque.com)
0815这部分听的比较折磨,反复听了几次,终于基本理解了整个过程。
1. 接口
- 生活中的接口有:电源插座、油门阀......
- 总结一下,连接两个东西;进行信号转换、屏蔽细节;特点:上层使用接口非常方便,不必在意接口背后做了什么;而接口内部需要进行转化。
学习操作系统接口,不仅要关注如何调用接口,还要理解接口内部的工作原理。
2. 操作系统接口
正如生活中的接口,对于上层来讲,接口的存在是十分自然的,当我们有某项需求,才会使用响应接口
如使用电的需求,才会用到插座
我们如何使用操作系统呢?
-- 比如
- 我们终端键入一个命令
- 操作系统内部进行处理
- 屏幕上就显示出来相应内容
- 也不一定都是命令
- 操作系统接口大致有3种
- 命令行、图形按钮、应用程序
2.1 命令行
命令行是什么?即输入命令后发生了什么?
- 命令就是一段程序
- 举个例子,程序编译后变成可执行程序,就可以在命令行以命令的方式执行(如下图),这些程序中包含一些语句,就是对操作系统接口的调用
- 操作系统启动到最后,打开一个桌面 / shell,打开桌面和shell是一回事
- 现在我们常见的是打开桌面。而一些服务器启动后就是shell,没有桌面。
- shell也是一段程序,在main.c中一系列的初始化之后,会执行/bin/sh,这个文件可以自己写。
- shell 程序的主体:
- hide codeint main(int argc,char *argv[]){ char cmd[20]; while(1){ scanf("%s",cmd); if(!fork()){exec(cmd);} else{wait();} }//while(1) }
- 可见shell 是一段死循环,会用if(!fork()){exec(cmd);} 来执行用户输入的命令。
- 其中fork和exec是真正的操作系统接口,这涉及进程管理(CPU管理)。
- 现在回头看一下上图的过程:
- 系统启动到最后执行shell,如上面程序
- shell 调用scanf 打出cst:/home/lizhijun#
- 正好20个字符
- 通过 fork()以及 wait() 申请CPU,让其执行左上角的代码
- 通过printf() 打出 ECHO:hello
- 除了 fork() 和 wait() 调用CPU 以外:
- scanf也是真正的操作系统接口,可以实现从键盘读入信息,调用了键盘输入
- 另外printf也是,可以调用显示器
- 可见命令行就是一些程序,通过一些函数实现对计算机硬件的使用。
2.2 图形按钮
图形按钮基于一套消息机制。
说明:
linux0.11只有命令行,而没有图形界面linux 有图形界面是比较新的版本如ubuntuWindows也有可以尝试在linux0.11上实现图形界面
如何实现?
- 当鼠标点击、键盘按下后,通过中断,这一事件被放到消息队列中
- 而应用程序需要写一个系统调用getmessage(),从操作系统内核中把消息队列中的消息取出
- 而应用程序是一个不断从消息队列中取消息的循环,这就是消息机制。
- 根据拿出的消息执行对应的函数
- 以上图程序为例,做了一件什么事情:
- 硬件输入
- 放入消息队列
- 应用程序的消息循环取出消息
- 这里是应用程序调用了操作系统的接口
- 判断消息类型(右侧函数)
- 下方函数中,打开一个文件,写入字符串
- 这里使用了调用磁盘的函数
应用程序接口先不讲。
2.3 总结
从上面可以知道,命令行和图形按钮都是一些程序,就是普通的C程序,只是在C的基础上使用了一些重要的函数,这些函数可以进入操作系统、使用硬件
可见,这些函数就是电源插座,就是操作系统的接口。
<