linux 内核rt,实时操作系统kernel rt
https://blog.csdn.net/baidu_34045013/article/details/78886617
實(shí)時(shí)應(yīng)用程序在某些觸發(fā)事件和應(yīng)用程序?qū)υ撌录捻憫?yīng)之間有操作截止日期。為了滿足這些操作期限,程序員使用實(shí)時(shí)操作系統(tǒng)(RTOS),在該系統(tǒng)上可以可靠地計(jì)算或測(cè)量給定應(yīng)用程序和環(huán)境的最大響應(yīng)時(shí)間。典型的RTOS使用優(yōu)先級(jí)。需要CPU的最高優(yōu)先級(jí)任務(wù)總是在事件喚醒任務(wù)之后的固定時(shí)間內(nèi)獲得CPU。在這種RTOS中,任務(wù)的延遲只取決于以相同或更高優(yōu)先級(jí)運(yùn)行的任務(wù);優(yōu)先級(jí)較低的任務(wù)可能會(huì)被忽略。在非實(shí)時(shí)操作系統(tǒng)(大多數(shù)GNU/Linux發(fā)行版運(yùn)行它們的默認(rèn)內(nèi)核)上,由于延遲依賴于系統(tǒng)上運(yùn)行的每個(gè)進(jìn)程,因此很明顯,要確保每次都能滿足截止日期要困難得多,而且這種困難會(huì)隨著系統(tǒng)的復(fù)雜性而非線性地?cái)U(kuò)展。調(diào)度中的決定論變得更加難以實(shí)現(xiàn),因?yàn)榭梢栽谌我鈹?shù)量的時(shí)間內(nèi)關(guān)閉搶占。因此,想要運(yùn)行的高優(yōu)先級(jí)任務(wù)可以被禁用搶占的低優(yōu)先級(jí)任務(wù)無(wú)限期延遲。
所謂實(shí)時(shí)操作系統(tǒng)(Real-time Opearting System),是指當(dāng)外接世界或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來(lái)控制生產(chǎn)過(guò)程或?qū)μ幚硐到y(tǒng)做出快速響應(yīng),調(diào)度一切可利用的資源完成實(shí)時(shí)任務(wù),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的操作系統(tǒng)。相比于分時(shí)操作系統(tǒng)有著響應(yīng)及時(shí)和可靠性高的優(yōu)點(diǎn)。
本文將在QEMU環(huán)境下,通過(guò)給內(nèi)核打?qū)崟r(shí)補(bǔ)丁的方式,使Linux成為一個(gè)實(shí)時(shí)操作系統(tǒng),并使用測(cè)試程序判斷內(nèi)核的實(shí)時(shí)性。
對(duì)QEMU不熟悉的朋友可以移步我的上一篇博客:http://blog.csdn.net/baidu_34045013/article/details/78882607
實(shí)驗(yàn)環(huán)境
ubuntu 16.04.2
QEMU-2.11.0
Linux kernel-4.14.7
Real-time patch-4.14.8
安裝Cyclictest
為了比較打補(bǔ)丁前后的性能差異,我們選用Real-Time Linux Wiki提供的基準(zhǔn)測(cè)試用例Cyclictest
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest
Cyclictest是一個(gè)高精度的測(cè)試程序,是rt-test下的一個(gè)測(cè)試工具,也是rt-test下使用最廣泛的測(cè)試工具,樣板主要用來(lái)測(cè)試使用內(nèi)核的延遲,從而判斷內(nèi)核的實(shí)時(shí)性。
從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放入文件系統(tǒng)
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
啟動(dòng)QEMU,進(jìn)入rt-tests目錄,使用Cyclictest
./cyclictest -t1 -p 80 -n -i 10000 -l 10000
1
運(yùn)行結(jié)果如下:
結(jié)果分析
T:0(783) P:80 I:10000 C:10000 Min:259 Act:4281 Avg:5201 Max: 14962
T: 線程序號(hào)為0
P: 線程的優(yōu)先級(jí)為80
C: 計(jì)數(shù)器,線程的時(shí)間間隔每達(dá)到一次,計(jì)數(shù)器加1
I: 時(shí)間間隔(單位微秒 us)
Min: 最小時(shí)延(us)
Act: 最近一次的時(shí)延
Avg: 平均時(shí)延
Max: 最大時(shí)延
參數(shù)分析
-t 線程數(shù)
-p 最高優(yōu)先級(jí)線程的優(yōu)先級(jí)
-n 使用clock_nanosleep
-i 基本線程間隔,默認(rèn)為1000us
-l 循環(huán)次數(shù),默認(rèn)為正無(wú)窮
運(yùn)行另一個(gè)測(cè)試命令
./cyclictest -t5 -p80 -n -i 10000 -l 1000
接下來(lái)我們給kernel打上實(shí)時(shí)補(bǔ)丁,再運(yùn)行測(cè)試用例測(cè)試系統(tǒng)實(shí)時(shí)性
打?qū)崟r(shí)補(bǔ)丁
Linux Real-time Patch可以在kernel.org找到
這里我們選擇下載與內(nèi)核版本對(duì)應(yīng)的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
打補(bǔ)丁
patch -p1 < patch-4.14.8-rt9.patch
1
如需回退補(bǔ)丁使用以下命令
patch -R -p1 < patch-4.14.8-rt9.patch
1
打補(bǔ)丁成功后,重新編譯內(nèi)核,這里由于內(nèi)核是跑在QEMU模擬的vexpress-a9單板上,所以需要交叉編譯,有關(guān)交叉編譯的內(nèi)容也在我的上一篇博客有介紹
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
測(cè)試實(shí)時(shí)搶占系統(tǒng)
啟動(dòng)QEMU
命令行輸入 uname -a
證明當(dāng)前內(nèi)核已打上實(shí)時(shí)補(bǔ)丁
接下來(lái)再運(yùn)行測(cè)試用例,來(lái)檢驗(yàn)實(shí)時(shí)補(bǔ)丁是否起了作用
./cyclictest -t1 -p 80 -n -i 10000 -l 10000
1
./cyclictest -t5 -p80 -n -i 10000 -l 1000
1
通過(guò)以上兩個(gè)例子的運(yùn)行,我們發(fā)現(xiàn)打了實(shí)時(shí)補(bǔ)丁的內(nèi)核的實(shí)時(shí)性要明顯優(yōu)于非實(shí)時(shí)內(nèi)核。
有興趣的朋友也可以使用latencytop進(jìn)行比較測(cè)試
總結(jié)
以上是生活随笔為你收集整理的linux 内核rt,实时操作系统kernel rt的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 溢价放贷是什么意思
- 下一篇: 侵华日军七三一细菌部队孙吴支队罪证遗址怎