1. 程式人生 > >實時Linux核心的編譯安裝(PREEMPT_RT)

實時Linux核心的編譯安裝(PREEMPT_RT)

1.什麼是實時性作業系統?

實時性是指排程的時候,任務響應時間。windows一般是15ms,最大的問題是不能保證。比如平均值是1ms,但是隨著系統負載的變化,有時甚至達到100ms,在這工業上是無法使用的。工業上一些應用要求必須有更高的時間精度,比如,一個電力監測系統必須在10ms內執行一次任務對電力執行狀況進行監測,一旦時間不準,排程不到該程式執行,則無法保證對電力故障的及時響應。

2.怎麼實現實時性系統?

3.PREEMPT_RT

PREEMPT_RT是Linux核心的一個實時補丁。得到Linus的高度評價:

Controlling a laser with Linux is crazy, but everyone in this room is crazy in his own way. So if you want to use Linux to control an industrial welding laser, I have no problem with your using PREEMPT_RT." -- Linus Torvalds

4.使用方法

4.1下載linux核心原始碼

這兩個國內的可以看一下,速度比較快。

4.2下載RT patch

4.3 使用方法

1.解壓核心原始碼

2.打patch

3.編譯linux核心並安裝 

tar xzvf  linux-4.4.138.tar.gz
cd linux-4.4.138
patch -p1 < ../patch-4.4.138-rt65.patch

make menuconfig需要安裝這個libncurses-dev模組

編譯核心需要libssl-dev模組

sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev

 配置linux核心

make menuconfig

選擇Fully Preemptible Kernel (RT)這個選項,具體路徑如下圖。儲存。

編譯核心,再安裝,更新grub.

編譯時加上 INSTALL_MOD_STRIP=1 可以生成沒有除錯資訊的模組,大大減小核心的大小。

    make -j2
    #sudo make modules_install -j2   #這一條命令生成的核心含有除錯資訊非常大
    sudo make INSTALL_MOD_STRIP=1 modules_install  
    sudo make install -j2

    sudo update-grub2

重啟後會多一個  linux-4.4.138-rt  的啟動選項

5.測試

可參考以下網頁:

sudo apt-get install rt-tests 

安裝這個工具,執行cyclictest程式進行實時性測試:

sudo cyclictest -t 5 -p 80 -n 
註釋: 執行五個執行緒,執行緒優先順序為80,無限迴圈

cyclictest執行結果詳解

T: 0 序號為0的執行緒
P: 0 執行緒優先順序為0
C: 9397 計數器。執行緒的時間間隔每達到一次,計數器加1
I: 1000 時間間隔為1000微秒(us)
Min: 最小延時(us)
Act: 最近一次的延時(us)
Avg:平均延時(us)
Max: 最大延時(us)

測試結果示例:

1.實體機測試結果

# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.13 0.06 0.02 1/244 19255

T: 0 (18989) P:80 I:1000 C: 155947 Min:      1 Act:    1 Avg:    1 Max:      17
T: 1 (18990) P:80 I:1500 C: 103964 Min:      1 Act:    1 Avg:    1 Max:      15
T: 2 (18991) P:80 I:2000 C:  77973 Min:      1 Act:    1 Avg:    1 Max:       7
T: 3 (18992) P:80 I:2500 C:  62378 Min:      1 Act:    1 Avg:    1 Max:      10
T: 4 (18993) P:80 I:3000 C:  51982 Min:      1 Act:    1 Avg:    1 Max:       7

2.虛擬機器測試結果 

在虛擬機器中效果一般,受主機的限制太大。

[email protected]:~/rt/linux-4.4.138$ sudo cyclictest -p 80 -t5 -n 
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.69 0.19 0.07 1/726 5825          

T: 0 ( 5821) P:80 I:1000 C:   8168 Min:      7 Act:  445 Avg:  327 Max:    7005
T: 1 ( 5822) P:80 I:1500 C:   5455 Min:      7 Act:  411 Avg:  319 Max:    7516
T: 2 ( 5823) P:80 I:2000 C:   4098 Min:     14 Act:  174 Avg:  320 Max:    2362
T: 3 ( 5824) P:80 I:2500 C:   3275 Min:      5 Act:   52 Avg:  319 Max:    6940
T: 4 ( 5825) P:80 I:3000 C:   2732 Min:      8 Act:  214 Avg:  299 Max:    5198

3.也可以進行多次執行並統計結果

sudo  cyclictest -l10000000 -m -n -t1 -p99 -i2 -h100

-l 指定1千萬迴圈,-m鎖定當前和將來的記憶體分配,-n指定使用 clock_nanosleep,-p99指定最高優先順序,-i2指定基本執行緒間隔單位為(us),-h100指定統計結果的分佈情況。

程式20秒執行結束,輸出顯示平均延時1 us,最大延時15 us,通過直方分佈圖察看,大多集中在1-7 us以內。

# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.36 0.33 0.28 1/246 32690

T: 0 (32688) P:99 I:2 C:10000000 Min:      0 Act:    2 Avg:    1 Max:       15
# Histogram
000000 000051
000001 6635143
000002 3352561
000003 008966
000004 002414
000005 000648
000006 000180
000007 000025
000008 000002
000009 000001
000010 000000
000011 000000
000012 000001
000013 000001
000014 000006
000015 000001
…………(中間都是0,省略)
000097 000000
000098 000000
000099 000000
# Total: 010000000
# Min Latencies: 00000
# Avg Latencies: 00001
# Max Latencies: 00009
# Histogram Overflows: 00000
# Histogram Overflow at cycle number:
# Thread 0:

6.總結

實時性補丁能夠較好地滿足我們的需求(1ms),實現較強的實時性。

-------------------------------------------------------------------------------------------------------------------------------

用到的命令列

mkdir -p /usr/src/kernels
cd /usr/src/kernels
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.47.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patch-4.9.47-rt37.patch.xz
tar xf linux-4.9.47.tar.xz
mv linux-4.9.47 linux-4.9.47-rt37
cd linux-4.9.47-rt37
xz -d ../patch-4.9.47-rt37.patch.xz
patch -p1 <../patch-4.9.47-rt37.patch

cp /boot/config-4.9.0-4-amd64 .config

In the last step, before the kernel can be compiled, the new kernel has to be configured so that the functionality imported with the RT patch is also used. The command make menuconfig is called and we select Processor type and features -> Preemption Model -> Fully Preemptible Kernel (RT).

make -j4 
make modules_install 
make install