读书笔记之应用程序与操作系统之间的关系——《操作系统之真相还原》

这个知识点很好的解释了为什么一些程序不能跨平台使用,比如windows与linux之间的应用程序一般不能通用,底层库不同,可执行程序的格式也不同,后面章节中作者也点明了这个问题。此问题可见知乎上的讨论:主要的原因是格式不同API不同,前者更重要一些。http://www.zhihu.com/question/24369805,另外有个东西也可以了解下wine——Wine (“Wine Is Not an Emulator” 的递归缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,Mac OSX 及 BSD 等)上运行 Windows 应用的兼容层。关于Wine的真正含义,有人对“Wine Is Not an Emulator”的说法表示质疑,认为”非模拟器“的解释不过是一种娱乐性的说法,Wine的真实意思应当是是Windows Environment的缩写,即WinE。

问题:应用程序是什么,和操作系统是如何配合到一起的?

应用程序是软件(似乎是废话,别急,往后看),操作系统也是软件。CPU会将它们一视同仁,甚至,CPU不知道自己在执行的程序是操作系统,还是一般应用软件,CPU只知道去cs:ip寄存器中指向的内存取指令并执行,它不知道什么是操作系统,也无需知道。

操作系统是人想出来的,为了让自己管理计算机方便而创造出来的一套管理办法。

应用程序要用某种语言编写,而语言又是编译器来提供的。其实根本就没有什么语言,有的只是编译器。是编译器决定怎样解释某种关键字及某种语法。语言只是编译器和大家的约定,只要写入这样的代码,编译器便将其翻译成某种机器指令,翻译成什么样取决于编译器的行为,和语言无关,比如说C语言的printf函数,它的功能不是说一定要把字符打印到屏幕上,这要看编译器对这种关键字的处理。

编译器提供了一套库函数,库函数中又有封装的系统调用,这样的代码集合称之为运行库。C语言的运行库称为C运行库,就是所谓的CRT(C Runtime Library)。

应用程序加上操作系统提供功能才算是完整的程序。由于有了操作系统的支持,一些现成的东西已经摆在那了,但这些是属于操作系统的,不是应用程序的,所以咱们平时所写的应用程序只是半成品,需要调用操作系统提供好的函数才能完整地做成一件事,而这个函数便是系统调用。

用户态与内核态是对CPU来讲的,是指CPU运行在用户态(特权3级)还是内核态(特权0级),很多人误以为是对用户进程来讲的。

用户进程陷入内核态是指:由于内部或外部中断发生,当前进程被暂时终止执行,其上下文被内核的中断程序保存起来后,开始执行一段内核的代码。是内核的代码,不是用户程序在内核的代码,用户代码怎么可能在内核中存在,所以“用户态与内核态”是对CPU来说的。

当应用程序陷入内核后,它自己已经下CPU了,以后发生的事,应用程序完全不知道,它的上下文环境已经被保存到自己的0特权级栈中了,那时在CPU上运行的程序已经是内核程序了。所以要清楚,内核代码并不是成了应用程序的内核化身,操作系统是独立的部分,用户进程永远不会因为进入内核态而变身为操作系统了。

应用程序是通过系统调用来和操作系统配合完成某项功能的,有人可能会问:我写应用程序时从来没写什么系统调用的代码啊。这是因为你用到的标准库帮你完成了这些事,库中提供的函数其实都已经封装好了系统调用,你需要跟下代码才会看到。其实也可以跨过标准库直接执行系统调用,对于Linux系统来说,直接嵌入汇编代码“int 0x80”便可以直接执行系统调用,当然要提前设置好系统调用子功能号,该子功能号用寄存器eax存储。

会不会有人又问,编译器怎么知道系统调用接口是什么,哈哈,您想啊,下载编译器时,是不是要选择系统版本,编译器在设计时也要知道自己将来运行在哪个系统平台上,所以这都是和系统绑定好的,各个操作系统都有自己的系统调用号,编译器厂商在代码中已经把宿主系统的系统调用号写死了,没什么神奇的。

来看下什么是用户态与内核态:

用户态(user mode)在计算机结构指两项类似的概念。在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。

只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序。

为什么会有用户态和内核态?

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态。

用户态与内核态的切换

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工作流程如下:

  1. 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
  2. 用户态程序执行陷阱指令
  3. CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
  4. 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
  5. 系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

前面提到了用户进程陷入内核,这个好解释,如果把软件分层的话,最外圈是应用程序,里面是操作系统,如图0-1所示。

..\15-1444 图\0001.tif

▲图0-1 陷入内核

应用程序处于特权级3,操作系统内核处于特权级0。当用户程序欲访问系统资源时(无论是硬件,还是内核数据结构),它需要进行系统调用。这样CPU便进入了内核态,也称管态。看图中凹下去的部分,是不是有陷进去的感觉,这就是“陷入内核”。





  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
连续系统的时域分析是信号与系统学习中的重要部分。时域分析研究的是信号在时间域内的变化规律,常用的分析方法包括冲激响应法、单位阶跃响应法和相应方程法。 1. 冲激响应法 冲激响应法是一种基于系统输入信号的冲激函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个冲激序列的加权和,然后计算出系统对每个冲激的响应,得到系统的冲激响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为冲激序列的加权和,从而得到系统对任何输入信号的响应。 2. 单位阶跃响应法 单位阶跃响应法是一种基于系统输入信号的单位阶跃函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个单位阶跃函数的加权和,然后计算出系统对每个单位阶跃函数的响应,得到系统的单位阶跃响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为单位阶跃函数的加权和,从而得到系统对任何输入信号的响应。 3. 相应方程法 相应方程法是一种基于系统微分方程的解析解来分析系统时域特性的方法。具体来说,根据系统微分方程的特性,可以得到系统的传递函数,然后通过拉普拉斯变换将输入信号和传递函数变换到频域内,最终通过反变换得到系统的时域响应。 以上三种方法都是分析连续系统时域特性的重要方法,各自适用于不同的情况。掌握这些方法可以帮助我们更好地理解和分析连续系统的时域特性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值