关于终端/命令行/中断/调用的一些关系

我用的是Mac电脑, 故这里说的"终端"就是Mac系统上的那个"终端软件", 然而, 我想知道的是它在OS中到底是一个什么角色, 因为:

  • 它这种让系统跑命令的软件让和觉得它和其它软件很不一样,
  • 我本身知道现在的终端是以前计算机的硬终端的延续, 这更加让我迷惑了,

故在此我分析一下现在这个终端软件的角色, 以便更好地理解它.

冯诺依曼体系结构

首先, 让我们先回顾一下"冯诺依曼"体系结构, 它提出的"存储程序结构"将它与那种传统形式的"打孔纸带"计算机区分了开来, 现在我们的计算机同时将程序和数据存储在了内存中, 这种形式是"冯诺依曼"结构的一种实现, 要不然, 我们的程序将会是"打孔纸带", 十分无法想象.

正因为如此, 现在计算机中遇到的算法, 各种排序方法, 一定程度上也是因为计算机是冯诺依曼体系结构的产物: 在算法中, 你得考虑数据结构, 时间/空间的复杂度, 等等问题. 所以, 算法本身是不值得讨厌的.

其次, 最初的C编译器是纯手工的产物(除非用B语言编译出适用Unix平台格式的C编译器), 在规定好Unix系统中文件的格式, 配合这个初级(功能不一定要很全)的C编译器, 用C编译器写Unix系统本身(内核)及其包含的工具/二进制程序的效率大大增加了(比如mkdir这样的命令), 就好像你要和一个人打招呼, 到底是说"Hello"方便(这个简单的C编译器), 还是"01000110"方便(假设这在汇编中就代表"Hello"的话, 而此时没有使用这个简单的C编译器)?!

从有了这个简单的C编译器开始, Unix(代表OS)及计算机(代表应用)的发展速度就大大大大提升了, 包括C编译器本身的进化也走上快车道(因为编译器和其它程序在"可执行程序"这个概念上, 并无二样), 有了C语言(和编译器), 我们有了Unix, 有了Unix, 我们还有了别的程序, 以及别的语言的和编译器.

从最根本的底层角度来理解"从开机到应用程序运行"的这个逻辑:

  • 首先是BIOS加载了Unix(内核), 尔后BIOS将CPU执行和控制权交给Unix内核的程序,
  • 由于内核程序也是C语言的程序(POSIX标准, 包含中断标准), 所以它应当与普通的应用程序在机器码的执行上没有区别, 但在执行权限, 内存区域等方面是有区别的, 由于此时内核已经从BIOS接管了计算机的控制权(内存区域等的限制), 故计算机有了内核态,
  • OS设计者在设计内核时, 会考虑生成各种注册表和文件(一类数据记录文件), 以使内核维护的信息得以保存(如内存映射表, 等),
  • 内核会启动一个pid=0init程序, 作为所有"桌面应用程序"(如Sublime, Chrome)的"父程序", 至此, 可以将这个时刻点理解成系统调用的开始点: 在此之后, 所有的应用程序的代码(二进制可执行程序)中如果包含中断的代码(如int 0x80, 或类似代码), 则应用程序"请求中断并申请"系统调用了,

以上只是关于"内核/系统调用/控制权/应用程序"之间的关系的不严谨论述, 目的是提出应用程序运行和OS关系的一点解惑性看法, 以及帮助理解下文.

Mac上的终端(Terminal)软件

终端是个什么角色

首先, 从视觉上来说, 终端是一个有GUI界面的软件, 这么说来它应该属于"应用程序/Application"类别, 但我们看得到的终端只能算是"大终端"的外观(GUI)部分, 而负责解释"脚本/命令行语句"的则是诸如"bash, sh, zsh, ksh"这样的"不可见终端"(shell内核, 负责解释shell语句).

举例: 我们有g++ demo.cpp这个命令行语句, 当我们按下回车时, 终端程序会将此语句交由bash解析, bash负责在系统环境中寻找g++这个可执行程序, 向OS内核申请执行g++这个程序的系统调用(程序切换: 控制权由bash切换到g++), 并将相关的参数(如demo.cpp)一并交给g++(其实是g++main()函数, 因为编译器g++也是一种**C/C++**程序, 连Unix操作系统本身也是).

另外, g++在执行过程中会有"标准输出/输入", (默认情况下)这些就是"终端屏幕/键盘", 等到g++返回(g++main()退出: 执行完毕或异常)后, 终端的使用权继续交由bash(即我们看到的命令行提示符).

上例中, 向OS内核申请系统调用是个什么过程? 可能的解释是在当前程序执行流中加入中断指令系统内核级别的接口(如内核级别的函数(系统C函数)), 由于有POSIX这样的编程标准的存在, 使得C编译器在编译C源码中的系统调用函数时会生成int 0x80这样的汇编/机器码级别的中断指令, 这使得程序由用户态转到内核态(即系统调用)成为可能.

硬件终端是个什么角色

以前的电脑还不是人手一台(不是Personal Computer), 也没有电脑桌面(Desktop), (硬件)终端大概就是这么用的: 多台显示器和键盘通过线缆连接到一台(大型)主机上, 供程序员和科研人员使用这台主机(那时候"电脑"还没有普及得这么多).

那么, 既然没有桌面, 这电脑该怎么用啊?! 就是我们现在软件终端的这种用法啊. 想想这是为什么: 假如现在的电脑中去掉了桌面, 那该怎么和电脑交互?! 只能是终端了.

电脑桌面是一种新的交互接口的设计, 是苹果和微软极大发展的必要因素, 是消费者能使用电脑的一大促进因素. 然而, 电脑要能给消费者用, 也要能给程序员用(要不然要轮到消费者去写程序了), 故这个硬件终端在桌面电脑中还是有保留的必须性的, 而它也是保留着的.

这种硬件终端的保留便成了软件终端, 这相当于保存了使用者与操作系统内核沟通的接口(也是必然的了, 要不然桌面也会失去依附而存在不了: 桌面只是程序的结果展示, 而不是程序和程序运行本身).

最后, 这么理解吧: 硬件终端是以前的终端, 软件终端是现在的终端.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值