调用
内核为用户进程提供的交互插口,可以为用户进程提供受限制地访问硬件设备、申请操作系统资源以及创建进程和进程通讯等能力。linux中的每位系统调用都对应一个系统调用号,调用号用于指明具体那个系统调用。
应用编程插口API
实际上应用程序通常会使用用户空间实现的应用编程插口来间接调用系统调用,API可以通过一个或若干个系统调用来实现一个插口,并且能屏蔽不同操作系统的差别,为应用程序提供相同的插口,例如常用的C库。据悉,POSIX标明给出了API和系统调用之间的关系,不同的操作系统提供与POSIX兼容的库能够让应用程序实现统一的插口。
对硬件的管理
操作系统内核的核心任务包括对计算机扩充的硬件进行管理,例如硬碟、键盘、鼠标及其他扩充硬件。内核必需要才能与它们互相通信,但通讯过程有个很关键的问题须要关注,就是速率问题。CPU的速率十分快,但向硬件发起一个恳求并接到其响应的速率是相当慢的,怎么有效让它们协同工作是硬件管理的核心问题,由于这个问题很可能会严重影响整体性能。
有两种实现方:寻址机制和中断机制。寻址机制是让内核定期对硬件设备进行查询,看是否须要处理,假如须要则处理,这些情况可能会让内核做好多无用功。中断机制则反过来,让硬件主动来发送讯号,当硬件有风波发生时则向内核发出讯号,之后内核再介入处理。内核通常也是使用中断机制来管理硬件。
关于中断
中断机制让硬件能发通知给CPU,中断本质是一个特殊的联通号,处理器接收到中断后会马上告知内核。例如点击下键盘时键盘控制器都会发送一个中断通知,处理器一旦监测到中断讯号便中断自己当前的工作转而处理中断,之后通知操作系统键盘形成了中断,内核得悉键盘被按下了,之后内核负责处理风波。
不同设备的中断不同,通过一个惟一的数字作为标示,也就是键盘、键盘、硬盘的中断值都不同,操作系统对不同的中断进行处理。中断值称作中断恳求线(IRQ),每位IRQ都对应一个数值,例如PC上0位时钟中断、1位按键中断。其实,也可能是动态分配中断值。
中断由硬件打断操作系统,为硬件与操作系统提供了通讯机制。
中断处理程序
内核在响应每位特定的中断时就会执行指定的一个函数,该函数为中断处理程序。每位硬件有一个相应的中断处理程序,他属于设备驱动的一部份。在linux中,中断处理程序是一个C函数,这种C函数根据一定的类型申明,之后内核就可以以标准的形式调用。中断处理程序被内核调用来响应中断,它们运行在中断上下文中,在该上下文中执行的代码不能否阻塞。
中断讯号随时可能发生,所以中断处理程序随时可能被运行,必须保证它快速被执行,能够快速恢复中断代码的执行。理想状态是中断能快速被响应,并且中断处理程序能快速被执行完。但中断程序要处理的工作常常有好多,例如对于网路而言,中断处理程序要将网卡的数据包拷贝得到内存中,并且还要对其进行处理后才交给合适的合同栈linux 内核定时器,最终再告知硬件已处理中断讯号。
中断的上半部和下半部
我们想要快速的中断响应,同时又想要在中断处理程序中完成更多的工作,这是一个矛盾体。为了解决这个问题,中断处理被分为上半部和下半部。上半部用于执行有严格期限的工作,例如应答硬件。而下半部用于处理才能推迟处理的工作。上半部和下半部似乎就是一种异步化处理思想,这样既才能保证响应速率linux查看操作系统,又能否完成大工作量的处理。
对于网卡来说,它的缓存大小是固定的,一旦网卡接收到数据后内核必须马上将它们拷贝到显存中,不然将可能造成网卡的缓存爆满而数据包被遗失。鉴于这些情况,对于网卡的中断讯号处理应当快速将网卡数据包拷贝到显存中,这就是上半部的工作,快速执行完后马上结束中断处理,将处理器交还给中断前的程序。而历时的数据包处理操作则放在下半部中,这部份可以稍后一点再处理,没有很强的时效性。
每位设备都有自己的驱动程序,驱动程序可以通过request_irq()函数来注册中断处理程序。
中断上下文
中断上下文是指内核在执行一个中断处理程序时所处的上下文,在该上下文中不能睡眠,也不能调用个别函数。中断处理程序时打断了其它正在执行的代码,所以它必需要快速简练地执行完毕,中断处理程序有自己的栈。
linux中断过程
硬件形成了一个中断讯号,它通过总线将联通号发送给中断控制器,中断控制器会将中断讯号发往处理器。处理器会立刻停止正在做的事情,之后关掉中断系统并跳到预定义的位置开始执行代码,这个预定义的代码就是由内核设置的中断处理程序入口。对于每位中断线,处理器就会跳转到对应一个惟一的入口位置。内核执行do_IRQ()函数对所接收到的中断进行响应。
系统定时器
内核大量函数都是基于时间驱动的,例如有些函数周期性地执行,这种就须要定时器来支持。系统定时器是一种可编程硬件芯片,它以固定频度形成中断,即定时器中断linux培训学校,它对应的中断处理程序负责更新系统时间,同时也负责执行周期性任务。定时器和时钟中断处理程序是linux内核管理机制的中枢。
定时器是管理内核流逝时间的基础,使用定时器时设置一个超时时间,但是指定超时发生时执行的函数。当定时器到时时会手动执行该函数,该函数只运行一次。
内核的时间
内核须要在硬件的帮助下能够估算和管理时间,硬件提供了系统定时器给内核来估算流逝的时间,当时钟中断发生时内核的特定中断处理程序会对其进行处理。定时器以某种频度自行触发时间中断,这个频度成为节拍率,连续两次时间中断的间隔时间为节拍。内核通过已知的节拍来估算墙上时间和系统运行时间linux 内核定时器,墙壁时间即是实际时间,系统运行时间为自系统启动后开始的时间。内核也为用户空间提供了一组获取实际时间和日期的系统调用。
实时时钟
实时时钟(RTC)是拿来持久储存系统时间的设备,它可以靠显卡上的微型电瓶保持系统的计时,所以即便系统关掉了也能保持系统时间的计时。实时时钟和CMOS集成在一起,实时时钟与BIOS的保存设置都是通过同一个电板供电。系统启动时内核读取实时时钟来初始化墙壁时间,该时间对应的变量为xtime。
基于时间的内核管理
内核好多工作都依赖于时钟中断,例如:
关于节拍率
系统定时器的节拍率提供给静态预处理定义,单位为HZ,内核再asm/param.h文件中定义。x86体系中系统定时器频度默认值为100,所以时钟中断评论为100HZ,每秒进行时钟中断100次,每10ms形成一次。不同的体系结构节拍率可能不同。
更高的节拍率能提供时间驱动时间的解析度,同时也提高时间驱动风波的确切度。对于linux来说能提供更高的精度来执行poll()、select()等系统调用,也能提升进程占据的确切度。但高节拍率会降低系统负担,由于会愈加频繁地执行时钟中断处理程序,降低了电源的消耗。
jiffies
jiffies是一个全局变量,它拿来记录自系统启动以来形成的节拍总量。启动时为0,之后每次时钟中断就会降低改变了的值,每秒增量为节拍率,即n赫兹。时钟中断处理程序工作大致包括:
本公众号专注于人工智能、读书与看法、聊聊物理、计算机科学、分布式、机器学习、深度学习、自然语言处理、算法与数据结构、Java深度、Tomcat内核等。
本文原创地址://gulass.cn/yybcjkahxtdy.html编辑:刘遄,审核员:暂无