BCLinux实时内核


  • BCLinux Developers

    在金融和电信领域,对网络的响应时间有非常严苛的要求。系统必须能够及时响应外部事件的请求,在规定的时间内完成对事件的处理。为了满足这些领域的需要,需要实时内核的支持。

    标准的Linux内核不是实时内核,只能提供软实时的保证,无法满足硬实时的要求。为此,内核开发者增加了实时内核补丁。通过在标准内核的基础上应用实时内核补丁,可以为标准内核增加实时内核特性。具体而言,实时内核补丁做了如下几点改动:

    1. 中断线程化

    标准内核中,中断具有最高优先级,可以无条件抢占当前任务,而且中断来临的时机以及执行的时间长短都是未知的,这样就会影响系统线程的执行时间,使得系统的处理增加了不确定因素,导致无法满足实时性的要求。

    实时内核将中断的处理过程线程化,中断处理程序不是在单独的中断上下文中执行,而是由内核线程处理中断请求。中断执行过程受到线程调度策略控制,与其他线程公平竞争处理器资源,可以被抢占。

    2. 高精度时钟

    在2.6.21版本之前,标准内核的定时器按照配置的固定频率HZ,产生时钟中断。操作系统中时间的更新,以及与时间相关的处理都由时钟中断触发。HZ的值在编译内核时是可以配置的,之前默认是100,也就是1s内会产生100次时钟中断。后来为了提高时钟的精度,又将HZ提高至1000。即使这样,时钟的解析度也只能达到ms级别,这样显然不能满足实时系统的要求。
    从2.6.21版本之后,标准内核中也已经从实时内核中引入高精度时钟。高精度内核提供了更高的时钟精度,达到纳秒级别(当然也受限于硬件时钟的精度),可以为实时系统提供更细粒度的时间控制。

    3. 自旋锁可抢占

    在普通内核中,自旋锁保护的临界区不可被抢占。如果当前自旋锁被持有,那么其他线程再获取自旋锁的时候,就会进入忙等状态。实时内核中,用rtmutexes实现了自旋锁,自旋锁保护的代码区域是可被抢占的。

    下面介绍一下,如何在原生内核的基础上,打上实时内核的补丁。

    1. 获取源码

    内核源码镜像网站中下载所需的内核源码,本文以此时最新的内核稳定版4.9.30为例。

    [zhangshengju@promote realtime]$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.30.tar.gz
    --2017-06-15 22:47:43--  https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.30.tar.gz
    Resolving cdn.kernel.org (cdn.kernel.org)... 151.101.76.69
    Connecting to cdn.kernel.org (cdn.kernel.org)|151.101.76.69|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 141668360 (135M) [application/x-gzip]
    Saving to: ‘linux-4.9.30.tar.gz’
    
    100%[=============================================================================================================================>] 141,668,360 1.58MB/s   in 64s    
    
    2017-06-15 22:48:54 (2.12 MB/s) - ‘linux-4.9.30.tar.gz’ saved [141668360/141668360]
    

    实时内核的补丁,从此处下载。这个网站中有针对不同内核版本的实时补丁,需要从中选择与原生内核版本一直的补丁才可以。本文下载针对4.9.30的实时补丁,如下:

    [zhangshengju@promote realtime]$ wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.30-rt21.patch.gz
    --2017-06-15 22:54:23--  https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.30-rt21.patch.gz
    Resolving www.kernel.org (www.kernel.org)... 147.75.110.187, 2604:1380:3000:3500::3
    Connecting to www.kernel.org (www.kernel.org)|147.75.110.187|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 207051 (202K) [application/x-gzip]
    Saving to: ‘patch-4.9.30-rt21.patch.gz’
    
    100%[=============================================================================================================================>] 207,051      166KB/s   in 1.2s   
    
    2017-06-15 22:54:25 (166 KB/s) - ‘patch-4.9.30-rt21.patch.gz’ saved [207051/207051]
    

    2. 打实时补丁

    解压下载的内核源码,进入内核源码目录,打实时补丁:

    [zhangshengju@promote realtime]$ tar zxvf linux-4.9.30.tar.gz
    [zhangshengju@promote realtime]$ cd linux-4.9.30/
    [zhangshengju@promote linux-4.9.30]$ zcat ../patch-4.9.30-rt21.patch.gz | patch -p1
    

    如果在应用实时内核的过程中,没有报错。则表示实时内核补丁被成功应用。

    3. 配置和编译内核

    前面已经将实时补丁打入内核中,在编译内核之前需要对内核做一下配置。

    • 启用内核完全抢占:
      CONFIG_PREEMPT_RT=y
      进入"Preemption Model"菜单,选择“Fully Preemptible Kernel (RT)”:
      选择完全内核抢占

    • 启用高精度时钟:
      CONFIG_HIGH_RES_TIMERS=y
      依次进入“General setup” -> “Timers subsystem” -> “High Resolution Timer Support”:
      选择高精度时钟
      其他内核配置项,可以根据实际需要关闭或者开启。

    • 编译并安装内核
      依次执行如下命令:

    make
    make modules
    make modules_install
    make install
    

    编译后的内核版本会有“-rt*”后缀,表示当前内核是实时内核。此外uname -v
    命令的输出中包含了"PREEMPT RT"字段。

    4.重启进入实时内核

    重启后进入实时内核,可以通过下面几种方法判断内核是不是实时的:

    • uname -r输出包含rtxxx字段。
    • uname -v输出包含"PREEMPT RT”字段。
    • ps ax | grep -w irq命令可以看到处理中断的内核线程:
       51 ?        S      0:00 [irq/9-acpi]
       72 ?        S      0:00 [irq/11-uhci_hcd]
       75 ?        S      0:00 [irq/12-i8042]
       76 ?        S      0:00 [irq/1-i8042]
       79 ?        S      0:00 [irq/8-rtc0]
      262 ?        S      0:00 [irq/6-floppy]
      264 ?        S      0:00 [irq/14-ata_piix]
      265 ?        S      0:00 [irq/15-ata_piix]
      303 ?        S      0:00 [irq/24-virtio2-]
      304 ?        S      0:00 [irq/25-virtio2-]
      305 ?        S      0:00 [irq/26-virtio0-]
      306 ?        S      0:00 [irq/27-virtio0-]
      307 ?        S      0:00 [irq/28-virtio0-]
      308 ?        S      0:00 [irq/29-virtio1-]
      309 ?        S      0:00 [irq/30-virtio1-]
      310 ?        S      0:00 [irq/31-virtio4-]
      311 ?        S      0:00 [irq/32-virtio4-]
      469 ?        S      0:00 [irq/11-virtio3]
     2953 ?        S      0:00 [irq/4-serial]
    
    • cat /sys/kernel/realtime文件内容为1。

    参考

    1. Real-Time Linux Wiki
    2. 实时内核补丁
    3. 内核镜像网站

登录后回复
 

与 BC-LINUX 的连接断开,我们正在尝试重连,请耐心等待