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

下載本文檔

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

文檔簡(jiǎn)介

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

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

(AI)最開(kāi)始的實(shí)現(xiàn)方法是:創(chuàng)建一個(gè)內(nèi)核線程,線程主體是一個(gè)while循環(huán),每隔1毫秒檢查一次,看時(shí)間是不是過(guò)去了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)是沒(méi)有大毛病的,它確實(shí)可以通過(guò)睡眠暫時(shí)讓出CPU,避免hogging,不像

busyloop

的mdelay()。

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

于是原讓它改了一個(gè)更減少CPU消耗的版本出來(lái):

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

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

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

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

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

if(!preempt

再由于:

#defineTASK_RUNNING0x0000

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

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

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

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

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

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

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

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

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

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

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

小結(jié)

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

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

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

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

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

那schedule_timeout()返回的時(shí)候,也需要手動(dòng)再將狀態(tài)設(shè)置回TASK_RUNNING么?不需要,因?yàn)閠imer的callback在喚醒process后會(huì)將其狀態(tài)(自動(dòng))設(shè)為RUNNING(參考Linux中的等待隊(duì)列機(jī)制):

void

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論