基于APIC时钟的嵌入式Linux内核实时化研究

基于APIC时钟的嵌入式Linux内核实时化研究,第1张

  引言

  嵌入式Linux是指对Linux进行剪裁后,将其固化在单片机或者存储器中,应用于特定场合的专用Linux系统。本文采用APIC时钟修改的方法对Linux内核进行实时化改造,修改APIC中断函数,将APIC中断和8254中断排序,使得硬实时中断的优先级大于普通8254中断。通过多组仿真实验,验证了该改造方法是有效的。

  1 嵌入式Linux的实时性分析

  Linux设计的初衷是系统吞吐量的平衡,其内核试图通过一种公平分配的策略来实现各进程平均地共享系统资源:

  (1)内核的不可抢占性:Linux的内核在单处理器上不可抢占,当一个任务进入内核态运行时,一个具有更高优先级的进程,只有等待处于核心态的系统调用返回后方能执行,这将导致优先级逆转。

  (2)进程调度的不可抢占性:Linux作为一个分时系统,采用多级反馈轮转调度算法,它保证了每一个进程都有一种调度策略,但是都放在同一个队列中运行,这也是Linux作为实时 *** 作系统的一个弱点。图1是Linux调度机制框图。

  (3)时钟中断的精度不高:Linux 2.4.X内核的时钟中断周期为10 ms,时钟粒度太过于粗糙,不能满足实时性要求。

  (4)Linux的虚拟存储管理:Linux采用段和页机制的虚拟存储管理技术,进程在硬盘和内存间的换入换出必然带来额外的开销,造成很大的延迟。

  

基于APIC时钟的嵌入式Linux内核实时化研究,第2张

 

  由此可见,要将Linux应用于嵌入式系统,必须对其进行实时化改造,以适应嵌入式领域要求。

  2 基于时钟修改的内核改造方案

  在单CPU系统中,与时间有关的活动都是由8254时钟芯片来驱动的,8254产生0号中断。直接修改内核定时参数HZ的初值就可构造细粒度定时器。这种方式实现起来很简单,但是由此带来频繁的定时中断使得系统的开销很大,当然随着硬件速度的提高,这种开销会逐步降低。

  简单地修改赫兹参数HZ进行实时化的方法显然并不可取。Linux 2.6内核的时钟粒度是1 ms,但仍然与嵌入式领域的实时化要求差距较远,因此需要更高精度的时钟。目前常见的修改时钟系统达到实时化的方法都是从软件层面着手,这方面己获得较大进展,但是从时钟系统的硬件结构分析并开展实时化工作也是一个值得注意的方向。本文利用先进的APIC时钟实现一个高精度时钟系统,提供了高精度的中断响应,从而以较少的改动获得较高的实时性。

  APIC以总线频率工作,可立即执行所有的定时器 *** 作,目前x86都有片内APIC,用户可在单CPU内使用APIC。APIC除了能提供高精度的时钟外还具有一个重要的优点,是由于它位于片内,对其编程只需几个CPU指令周期,而对IntelX86的8254存取需要若干慢速的ISA总线指令。

  在100MHz的CPU系统中,处理一个中断的时间不到10μs,因此高速CPU完全可在更短的时间内处理更多的APIC中断。理论上APIC可实现10 ns左右的系统时钟,但实际上在处理中断时要耗费一些时间,因此中断的响应时间要大于10 ns。

  APIC本身提供了中断处理函数apic_TImer_interrupt,该函数包括Irq_enter(),Run_realTImer_queue()和irq_exit(),其中函数irq_ exit通常负责判断当前是否有8254产生的软中断存在,如果存在,就会触发8254软中断,这样会造成APIC硬中断处理延迟。本文的思路就是修改irq_exit,在其中将各软中断线程和硬中断线程进行排序,使APIC硬中断的优先级高于软中断,此时硬中断线程得到优先处理,从而提高内核的实时性能。Irp_exit函数的核心代码如下:

  

基于APIC时钟的嵌入式Linux内核实时化研究,第3张

 

  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2714037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存