linux 内核rt,实时操作系统kernel rt
https://blog.csdn.net/baidu_34045013/article/details/78886617
實時應用程序在某些觸發事件和應用程序對該事件的響應之間有操作截止日期。為了滿足這些操作期限,程序員使用實時操作系統(RTOS),在該系統上可以可靠地計算或測量給定應用程序和環境的最大響應時間。典型的RTOS使用優先級。需要CPU的最高優先級任務總是在事件喚醒任務之后的固定時間內獲得CPU。在這種RTOS中,任務的延遲只取決于以相同或更高優先級運行的任務;優先級較低的任務可能會被忽略。在非實時操作系統(大多數GNU/Linux發行版運行它們的默認內核)上,由于延遲依賴于系統上運行的每個進程,因此很明顯,要確保每次都能滿足截止日期要困難得多,而且這種困難會隨著系統的復雜性而非線性地擴展。調度中的決定論變得更加難以實現,因為可以在任意數量的時間內關閉搶占。因此,想要運行的高優先級任務可以被禁用搶占的低優先級任務無限期延遲。
所謂實時操作系統(Real-time Opearting System),是指當外接世界或數據產生時,能夠接受并以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統做出快速響應,調度一切可利用的資源完成實時任務,并控制所有實時任務協調一致運行的操作系統。相比于分時操作系統有著響應及時和可靠性高的優點。
本文將在QEMU環境下,通過給內核打實時補丁的方式,使Linux成為一個實時操作系統,并使用測試程序判斷內核的實時性。
對QEMU不熟悉的朋友可以移步我的上一篇博客:http://blog.csdn.net/baidu_34045013/article/details/78882607
實驗環境
ubuntu 16.04.2
QEMU-2.11.0
Linux kernel-4.14.7
Real-time patch-4.14.8
安裝Cyclictest
為了比較打補丁前后的性能差異,我們選用Real-Time Linux Wiki提供的基準測試用例Cyclictest
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest
Cyclictest是一個高精度的測試程序,是rt-test下的一個測試工具,也是rt-test下使用最廣泛的測試工具,樣板主要用來測試使用內核的延遲,從而判斷內核的實時性。
從git clone rt-test源碼
git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
cd rt-tests
git checkout stable/v1.0
1
2
3
交叉編譯rt-test,修改Makefile中的編譯器
CC = arm-linux-gnueabi-gcc
AR = arm-linux-gnueabi-ar
1
2
make
1
將編譯好的rt-tests放入文件系統
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo mkdir tmpfs/rt-tests
sudo cp rt-tests/* -r tmpfs/rt-tests/
sudo umount tmpfs
1
2
3
4
啟動QEMU,進入rt-tests目錄,使用Cyclictest
./cyclictest -t1 -p 80 -n -i 10000 -l 10000
1
運行結果如下:
結果分析
T:0(783) P:80 I:10000 C:10000 Min:259 Act:4281 Avg:5201 Max: 14962
T: 線程序號為0
P: 線程的優先級為80
C: 計數器,線程的時間間隔每達到一次,計數器加1
I: 時間間隔(單位微秒 us)
Min: 最小時延(us)
Act: 最近一次的時延
Avg: 平均時延
Max: 最大時延
參數分析
-t 線程數
-p 最高優先級線程的優先級
-n 使用clock_nanosleep
-i 基本線程間隔,默認為1000us
-l 循環次數,默認為正無窮
運行另一個測試命令
./cyclictest -t5 -p80 -n -i 10000 -l 1000
接下來我們給kernel打上實時補丁,再運行測試用例測試系統實時性
打實時補丁
Linux Real-time Patch可以在kernel.org找到
這里我們選擇下載與內核版本對應的rt patch
wget /patch-4.14.8-rt9.patch.gz
1
解壓patch
gunzip patch-4.14.8-rt9.patch.gz
cp patch-4.14.8-rt9.patch linux-4.14.7/
cd linux-4.14.7
1
2
3
打補丁
patch -p1 < patch-4.14.8-rt9.patch
1
如需回退補丁使用以下命令
patch -R -p1 < patch-4.14.8-rt9.patch
1
打補丁成功后,重新編譯內核,這里由于內核是跑在QEMU模擬的vexpress-a9單板上,所以需要交叉編譯,有關交叉編譯的內容也在我的上一篇博客有介紹
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig
1
在“Processor type and features”中
選擇“Complete Preemption (Real-Time)”、“Thread Softirqs”和“Thread Hardirqs”
在“Device Drivers”中
去掉“Staging Drivers”
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
1
更新grub
sudo update-grub2
1
測試實時搶占系統
啟動QEMU
命令行輸入 uname -a
證明當前內核已打上實時補丁
接下來再運行測試用例,來檢驗實時補丁是否起了作用
./cyclictest -t1 -p 80 -n -i 10000 -l 10000
1
./cyclictest -t5 -p80 -n -i 10000 -l 1000
1
通過以上兩個例子的運行,我們發現打了實時補丁的內核的實時性要明顯優于非實時內核。
有興趣的朋友也可以使用latencytop進行比較測試
總結
以上是生活随笔為你收集整理的linux 内核rt,实时操作系统kernel rt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 溢价放贷是什么意思
- 下一篇: linux 其他常用命令