现代操作系统的组成

1. 适用于实现协调各部件之间速度不协调而有意设定的。
ROM(read only memory)
RAM(random access memory)
RAM和ROM一起组成当前主机上的物理内存地址空间。CPU能够寻址多少内存取决于字长,32位就能够寻址2的32次方个存储单元。操作系统的寻址能力取决于CPU的寻址能力,在64位硬件上装32位的操作系统,程序也是32位的。


2. 计算机。其硬件部分由五大功能部件组成:输入设备,输出设备,运算器,控制器,存储器。

  • 计算机启动,CPU就会跳到ROM中去执行一些指令(一些内置的健康状态检测程序)
  • 不管怎么讲,计算机数据必须经过RAM,并不意味着数据始终在RAM中存放,根据制造工艺,RAM是易失性的存储器,所以许多数据需要存放在web服存储上,也有可能跟用户进行交互,这就需要大量的I/O设备,称为输入输出,这也是五大部件中的两个部件,输入输出设备有很多,他们不会连接在CPU总线上,是通过当前主板上一些芯片,将这些总线汇总起来以后,连入当前CPU的总线当中来,有高速芯片和低速芯片,离CPU比较近的那个芯片通常速度比较快,将他称之为北桥,离得比较远的那个是低速总线,用来汇总低速I/O设备,并连入北桥的,而PCI-E就在北桥上,像AGP有些是在低速总线上的。这就是所谓的两个重要的芯片,两个芯片本身要汇总各I/O设备的线缆并连入CPU的总线。各硬件设备它本身的电器特性可能各不相同,本身的工作机制是有这巨大差别的,所以每一种电器都需要有一种办法将本身的电器信号转化成当前主机能够识别的电器信号,所以他们通常需要一个I/O控制器或者适配器,这些设备就通过这些控制器或适配器连入当前的I/O总线上或者I/O控制器上,也可以称为桥接芯片上,


3. 有许多的I/O设备,在某一时间点,哪个I/O设备有事件发生,必须让CPU在第一时间得知,
是两种用于实现让CPU得知中断或者得知硬件设备上I/O设备商有事件产生的两种方式有两种方式:

  • 轮循,CPU不断的去轮循,始终监听着那个设备,很低效
  • 中断,当其中任何一个I/O设备有事件发生,像敲击键盘,这个设备会立即通过中断控制器通知CPU,CPU在某个针脚上发现中断控制器有事件产生,然后通过去与中断控制器去交互,从而得知到底是哪个硬件设备发生了中断。但是某一个硬件设备如何与硬件设备进行数据通信,假如某个网卡,有数据传入了,有人ping我们,我们必须哟啊把这个数据包接进来,那我们应该从什么地方去读入数据,I/O总线是汇总的,是一个总线,通过I/O端口去找这个硬件设备,

事实上,还有其他机制,像DMA,一种辅助机制,

4. 硬件本身提供了运算能力,但是它本身并不做具体工作,如果要做工作需要应用程序,应用程序为了使用这个硬件,1.这个程序要能驱动CPU,2.驱动内存,驱动I/O设备,底层的细节过于复杂,每个程序员在开发的时候还要关注底层的细节,太麻烦了,因此应该将这些细节隐藏,并使用一个统一的接口输出出来。

  • 不管你的CPU是Intel还是AMD,不管是哪一种,使用一层机制把这些细节隐藏起来,将一个规范的统一的接口提供出来,就不用关心CPU是什么类型的,只用关心这个操作系统本身是什么样子的,其实就是关心这个中间层是什么样子的,就可以了,这就是操作系统的意义所在。
  • 这个中间层为了能够识别每一个硬件,他可能需要安装驱动, 但是这个驱动是由中间层来完成的,不需要应用层序自身来管理的,
  • 中间层使用一些机制,将细节隐藏之后,使用一个统一的借口,将它的运算能力输出出来,这些输出我们通常称为系统调用。
  • 程序在编程的时候要完成一个复杂的逻辑复杂的功能,他需要多方面的整合系统调用,而有些复杂功能有些软件也可能用到,如果能将这些复杂功能在整合起来做成模块,应用程序需要的时候就直接调用,这是通过库来实现的,这个库可以理解成二次封装的系统调用,一个库可能没有一个系统调用,
  • 有了库,有了系统调用,用户在编写程序时,必要时,如果库中有,可以直接调用功能,如果没有,可以自己使用系统调用组合那个功能。


5. 我们的应用程序在开发的时候是基于库来进行的。

  • 对于不同的操作系统如果想要让库兼容,这个库本身叫做(应用编程接口),如果两个系统的APi能够兼容或者一致,遵循一个规范(POSIX规范)。
  • POSIX规范其实只用POS(可移植操作系统接口)(Portable Operating System interface),是为了移植应用程序的。
  • 在windows研发的基于ANSI C所研发的程序在linux也是可以编译(仅仅是编译没问题), 因为API只是编程接口,程序真正执行还要有一个ABI接口,ABI是与内核所支持的程序执行机制,执行格式或者二进程序本身的格式相关的。
  • 二进制程序在windows是.exe,在linux是.elf, 所以windows编译的程序,在linux中是跑不起来的,反之亦然。
  • IDE主要是为了便于用户开发完应用程序,能够便于调试的一种环境,IDE也是一种具体的应用程序。 ,

 

6.

  • 服务进程或守护进程:为了系统的正常功能能够提供运行的进程,它们工作在后台。

 

  • 想让某个应用程序启动,怎么控制操作系统启动那个应用程序,我们需要一个能够与计算机进行交互的接口,这就是外壳(shell),shell也是应用,谁来启动shell?
  • 所以一个操作系统在启动后,最根本的启动内核,然后启动shell。内核应用在内部模式,而应用程序都运行在用户模式,用户模式所占用的CPU量应该要足够大才好,所以操作系统启动之后,内核应该退出(不是不运行而是不被调用,不处理一些特权及的事物时就不再运行了,而后大多数都是用户空间中的应用程序在运行,或者由用户空间发生系统调用时内核才启动,内核本身就已经处于后台了,应用程序才负责具体工作的)。
  • init是内核运行后的第一个进程,用来负责生成其他的必要的应用进程,用来做所有进程的祖宗进程,它是在用户空间启动的第一个用户进程,主要用来协调其他用特定意义的进程,凡是涉及到用户空间中的进程管理,不是内核,而是init负责。

 

posted @ 2016-08-29 22:18  芬乐  阅读(784)  评论(0编辑  收藏  举报