讓ChatGPT寫一個內(nèi)核模塊_第1頁
讓ChatGPT寫一個內(nèi)核模塊_第2頁
讓ChatGPT寫一個內(nèi)核模塊_第3頁
讓ChatGPT寫一個內(nèi)核模塊_第4頁
讓ChatGPT寫一個內(nèi)核模塊_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第第頁讓ChatGPT寫一個內(nèi)核模塊筆者最近看到這樣一篇文章

,原讓ChatGPT寫一個內(nèi)核模塊,要求實現(xiàn)的功能是:每5秒向控制臺打印一句"Hellow(or)ld",并且把編譯需要的Makefile也一起寫出來。

(AI)最開始的實現(xiàn)方法是:創(chuàng)建一個內(nèi)核線程,線程主體是一個while循環(huán),每隔1毫秒檢查一次,看時間是不是過去了5秒:

while(!kthre(ad)_should_stop()){unsignedlong(ti)me_since_load=jiffies-jiffies_at_load;unsignedlongtime_since_load_sec=time_since_load/HZ;if(time_since_load_sec>=5){printk(KERN_INFO"Helloworld!");jiffies_at_load=jiffies;}//Sleepfor1mstoavoidhoggingthe(CPU)msleep(1);}

此處用msleep(1)是沒有大毛病的,它確實可以通過睡眠暫時讓出CPU,避免hogging,不像

busyloop

的mdelay()。

但它這里實現(xiàn)的比較曲折,1毫秒檢查一次,5秒內(nèi)就要檢查5000次,雖然沒有「霸占」CPU,但是對CPU資源也是不小的浪費。

于是原讓它改了一個更減少CPU消耗的版本出來:

while(!kthread_should_stop()){printk(KERN_INFO"Helloworld!");//Sleepfor5secondstoavoidhoggingtheCPUschedule_timeout(HZ*5);}

看起來是解決了原來存在的問題,但編譯出來一試,好家伙,"Helloworld"是突突地往控制臺上打啊,根本不是間隔5秒一次。

把這個問題反饋給AI后,它立馬做出了調(diào)整,加入了一句對process狀態(tài)的設(shè)置后,就可以work了。

set_current_state(TASK_INTERRUPTIBLE);schedule_timeout(HZ*5);

查閱(Linux)源碼可知,schedule_timeout()最終會調(diào)用__schedule()函數(shù),其對process切換的判斷是這樣的:

if(!preempt

再由于:

#defineTASK_RUNNING0x0000

所以如果之前的狀態(tài)是RUNNING,process并不會真的離開CPU的runqueue,豈不就是一直執(zhí)行,一直框框地打印么。

在/search/linux上查了下schedule_timeout()在內(nèi)核中的具體使用情況,好些對set_current_state()為INTERRUPTIBLE的設(shè)置沒有和schedule_timeout()挨在一起,所以AI“理解”不了這兩者的關(guān)聯(lián),筆者覺得是可以接受的。

不過其實Linux是提供了一個“二合一”的封裝函數(shù)的:

schedschedule_timeout_uninterruptible(signedlongtimeout){set_current_state(TASK_UNINTERRUPTIBLE);returnschedule_timeout(timeout);}

而它還有個更上層的封裝"msleep"(希望可被(信號)打斷就用"msleep_interruptible"):

voidmsleep(unsignedintmsecs){unsignedlongtimeout=msecs_to_jiffies(msecs)+1;while(timeout)timeout=schedule_timeout_uninterruptible(timeout);}

咳,繞了這么大一圈,其實一開始直接用msleep(5000)最方便啦。

后來原又提了在「內(nèi)核模塊」開發(fā)中頗為常見的兩點功能:

一是將5秒的間隔配置成modulepa(ram)eter(以供動態(tài)調(diào)整),這個任務(wù)被順利完成了。

二是在"/proc"文件系統(tǒng)中加入打印次數(shù)的統(tǒng)計功能(以便查詢),這里出了點小岔子,AI用的"file_operations",而不是"proc_ops",這在高于5.7的內(nèi)核版本上是編譯不過的(參看筆者親身經(jīng)歷的這個案例)。

這也不能怪AI,你沒說內(nèi)核版本不是。

小結(jié)

最后原寫了下他的感受,大意就是"halfamazingandhalf(te)rrifying",雖然AI中途犯了不少錯,但總比自己現(xiàn)查(資料)來的快不是…

除此之外,筆者也有兩點感受,一是ChatGPT即使有時會出錯,但回答地總是非常自信(還好不是那么普通,卻那么自信……),二是那個解釋一條條地寫的真是規(guī)范啊,連每個頭文件為什么加,都有理有據(jù),這一點就強過很多人。

#include//Neededforallkernelmodules#include//NeededforKERN_INFO#include//Neededforthemac(ros)#include//Neededforjiffies#include//Neededformsleep

筆者自己也用這個題目,在ChatGPT上試了一把,得出了不太一樣的結(jié)果,欲知后續(xù),請看下文分解。

補充(為了避免影響主線劇情):

那schedule_timeout()返回的時候,也需要手動再將狀態(tài)設(shè)置回TASK_RUNNING么?不需要,因為timer的callback在喚醒process后會將其狀態(tài)(自動)設(shè)為RUNNING(參考Linux中的等待隊列機制):

void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論