實(shí)驗(yàn)中斷處理的內(nèi)核模塊.docx_第1頁(yè)
實(shí)驗(yàn)中斷處理的內(nèi)核模塊.docx_第2頁(yè)
實(shí)驗(yàn)中斷處理的內(nèi)核模塊.docx_第3頁(yè)
實(shí)驗(yàn)中斷處理的內(nèi)核模塊.docx_第4頁(yè)
實(shí)驗(yàn)中斷處理的內(nèi)核模塊.docx_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)1.中斷處理的內(nèi)核模塊一、中斷與異常1、基本概念在計(jì)算機(jī)科學(xué)中,中斷(Interrupt)是指處理器接收到來(lái)自硬件或軟件的信號(hào),提示發(fā) 生了某個(gè)事件,應(yīng)該被注意,這種情況就稱(chēng)為中斷。中斷通常分為同步中斷(synchronous)和 異步中 斷(asynchronous)。 同步中斷:是當(dāng)指令執(zhí)行時(shí),由CPU控制單元產(chǎn)生的,只有在一條指令終止執(zhí)行后CPU 才會(huì)發(fā)生中斷。 異步中斷:是由其他硬件設(shè)備依照CPU時(shí)鐘信號(hào)隨機(jī)產(chǎn)生的。Intel微處理器手冊(cè)中,把同步和異步中斷分別稱(chēng)為異常(exception)和中斷(internipt)。中斷是由間隔定時(shí)器和I/O設(shè)備產(chǎn)生的,而異常是由程序的錯(cuò)誤產(chǎn)生

2、的,或是由內(nèi)核必 須處理的異常條件產(chǎn)生的。2、中斷的作用每個(gè)中斷或者異常都對(duì)應(yīng)著它的中斷或者異常處理程序,中斷或異常處理程序不是一個(gè) 進(jìn)程,而是一個(gè)內(nèi)核控制路徑,代表中斷發(fā)生時(shí)正在運(yùn)行的進(jìn)程執(zhí)行。中斷處理是內(nèi)核執(zhí)行 的最敏感的任務(wù)之一,必須滿足以下約束:1) 內(nèi)核相應(yīng)中斷后的操作分兩部分:關(guān)鍵的緊急的部分,內(nèi)核立即執(zhí)行;其余的推遲隨后 執(zhí)行。2) 中斷程序必須使內(nèi)核控制路徑能以嵌套的方式執(zhí)行,當(dāng)最后一個(gè)內(nèi)核控制路徑終止時(shí), 內(nèi)核必須能恢復(fù)被中斷進(jìn)程的執(zhí)行,或者如果中斷信號(hào)己經(jīng)導(dǎo)致了重新調(diào)度,內(nèi)核能切換到 另外的進(jìn)程。3) 盡管中斷可以嵌套,但在臨界區(qū)中,中斷必須禁止。但內(nèi)核必須盡可能限制這樣的

3、臨界 區(qū),大部分時(shí)間應(yīng)該以開(kāi)中斷的方式運(yùn)行。3、中斷請(qǐng)求(IntemiptRequest, IRQ)IRQ(Interrupt Request)的作用就是在我們所用的電腦中,執(zhí)行硬件中斷請(qǐng)求的動(dòng)作,用 來(lái)停止其相關(guān)硬件的工作狀態(tài)。比如我們要打印一份文件,在打印結(jié)束時(shí)就需要由系統(tǒng)對(duì)打 印機(jī)提出相應(yīng)的中斷請(qǐng)求,來(lái)以此結(jié)束這個(gè)打印的操作。IRQ具有以下特點(diǎn):1) 硬件設(shè)備控制器通過(guò)IRQ線向CPU發(fā)出中斷,可以通過(guò)禁用某條IRQ線來(lái)屏蔽中斷。2) 被禁止的中斷不會(huì)丟失,激活I(lǐng)RQ后,中斷還會(huì)被發(fā)到CPU3) 激活/禁止IRQ線!=可屏蔽中斷的全局屏蔽/非屏蔽struct rtc_time (int

4、tm_sec;/表秒數(shù),在0,61之間,多出來(lái)的兩秒是用來(lái)處理跳秒問(wèn)題用的。int tm_min;表分?jǐn)?shù),在0,59之間。int tm_hour;表時(shí)數(shù),在0,23之間。int tm_mday;/表本月第幾日,在1,31之間。int tm_mon;/表本年第幾月,在0,11之間。int tm_year;/要加1900表示那一年。int tm_wday;/表本周第幾日,在0,6之間。int tm_yday;表本年第幾日,在0,365之間,閏年有366日。int tm_isdst;/表是否為日光節(jié)約時(shí)間。;年份加上1900,月份加上1,小時(shí)加上8。注意:可以自己先思考一下這樣的加上x(chóng)操作如果導(dǎo)致溢

5、出,應(yīng)該怎么處理。例如,得到的UTC小時(shí)數(shù)為22,加上8之后30明顯溢出(超過(guò)24),并且由于小時(shí)數(shù)溢出到了第二天, 因此天數(shù)也應(yīng)該加lo4. rtc_time_to_tm()頭文件:<linux/rtc.h>函數(shù)原型:void rtc_time_to_tm(unsigned long time, struct rtc_time *tm);功能:將time存儲(chǔ)的秒數(shù)轉(zhuǎn)換為年月日時(shí)分秒等信息保存在rtc_time結(jié)構(gòu)體中。參數(shù):time為秒數(shù),可以是do_gettimeofday()函數(shù)獲取的秒數(shù)。tm是rtc_time結(jié)構(gòu)體指針, 結(jié)構(gòu)體中存放了年月日時(shí)分秒等信息。二、內(nèi)核模塊編程

6、源碼編寫(xiě).c源文件Makefile文件編寫(xiě)編譯模塊make模塊加載進(jìn)內(nèi)核insmod查看加載的內(nèi)容mesg查看內(nèi)核模塊Ismod卸載內(nèi)核模塊rmmod三、任務(wù)描述3. 調(diào)用內(nèi)核時(shí)鐘接口,編寫(xiě)內(nèi)核模塊,檢查實(shí)現(xiàn)累加計(jì)算sum=l+2+3+.+100000所花時(shí)間。4. 加載、卸載模塊并查看模塊打印信息。四、審核要求1. 正確編寫(xiě)滿足功能的源文件,正確編譯。2. 正常加載、卸載內(nèi)核模塊;且內(nèi)核模塊功能滿足任務(wù)所述。3. 提交相關(guān)源碼與運(yùn)行截圖。五、參考答案1、參考答案源碼sum_time.c#include <linux/module.h>#include <linux/time

7、.h>MODULE_LICENSE(nGPLn);#define NUM 100000struct timeval tv;static long sum(int num)(inti;long total = 0;for (i= l;i<= NUM; i+) total = total + i;printk(HThe sum of 1 to %d is: %ldn, NUM, total); return total;static int _init sum_init(void)(int start;int start_u;int end;int end_u;long time_co

8、st;long s;printk(nStart sum_time module.nn); do_gettimeofday(&tv);start = (int)tv.tv_sec;start_u = (int)tv.tv_usec;printk(nThe start time is: %d s %d us nH, start, start_u);s = sum(NUM);do gettimeofday(&tv);end = (int)tv.tv_sec;end_u = (int)tv.tv_usec;printk(nThe end time is: %d s %d us nn,

9、end, end_u);time_cost = (end - start) * + end_u - start_u;printk(nThe cost time of sum from 1 to %d is: %ld us n”,NUM, time_cost); return 0;)static void _exit sum_exit(void)(printk(nExit sum_time module.An");module_init(sum_init);module exit(sum exit);2、Makefileifneq ($(KERNELRELEASE),)obj-m :=

10、 sum_time.oelseKERNELDIR ?= /root/raspbeiTypi-kernelPWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendif.PHONY:cleanclean:-rm *.mod.c *.o *.order *.symvers *.ko2、運(yùn)行結(jié)果rootopenEuler task3# makemake -C /root/raspberrypi-kernel M=/root/kernel_gkd/ch5/task3 modulesmakel: Entering dire

11、ctory '/root/raspberrypi-kernel CC M /root/kernel_gkd/ch5/task3/sum_time.o Building modulesr stage 2.MODPOST 1 modulesCC/root/kernel_gkd/ch5/task3/sum_time.mod.oLD M /root/kernel_gkd/ch5/task3/sum_time.ko makel: Leaving directory '/root/raspberrypi-kernel' rootopenEuler rootopenEuler roo

12、t(aopen Euler rootopenEuler 66857.341650:66857.0 '66857.0 '66857.0 66857.341745' rootopenEuler rootopenEuler rootopenEuler rootopenEuler 66857.341650:66857.0 '66857.0 '66857.0 ' 66857.341745' 66876.187292 rootopenEuler task3# rootopenEuler task3# make rm *.mod.c *.o *.ord

13、er *.symverstask3#task3# insmod sum_time.ko task3#task3# dmesg |tail -n 5 Start sum_time The The The Thetask3# task3# rmmod task3# task3# dmesg Start sum_time The The The The Exit sum timemodule.is: 1593570461 s 216127 usstart timesum of 1 to 100000 is: 5000050000end time is: 1593570461 s 216166 usc

14、ost time of sum from 1 to 100000 is: 39 ussum time|tail -n 6 module.is: 1593570461 s 216127 usstart timesum of 1 to 100000 is: 5000050000 end time is: 1593570461 s 216166 us cost timeof sum from 1 to 100000 is: 39 us module.clean *ko運(yùn)行結(jié)果可以看出,從1至I100000的累加和所花時(shí)間是39 US。4、中斷的上半部和下半部中斷服務(wù)程序一般都是在中斷請(qǐng)求關(guān)閉的條件下

15、執(zhí)行的,以避免嵌套而使中斷控制復(fù)雜 化。但是,中斷是一個(gè)隨機(jī)事件,它隨時(shí)會(huì)到來(lái),如果關(guān)中斷的時(shí)間太長(zhǎng),CPU就不能及時(shí) 響應(yīng)其他的中斷請(qǐng)求,從而造成中斷的丟失。因此,Linux內(nèi)核的目標(biāo)就是盡可能快的處理 完中斷請(qǐng)求,盡其所能把更多的處理向后推遲。例如,假設(shè)一個(gè)數(shù)據(jù)塊已經(jīng)達(dá)到了網(wǎng)線,當(dāng) 中斷控制器接受到這個(gè)中斷請(qǐng)求信號(hào)時(shí),Linux內(nèi)核只是簡(jiǎn)單地標(biāo)志數(shù)據(jù)到來(lái)了,然后讓處 理器恢復(fù)到它以前運(yùn)行的狀態(tài),其余的處理稍后再進(jìn)行(如把數(shù)據(jù)移入一個(gè)緩沖區(qū),接受數(shù) 據(jù)的進(jìn)程就可以在緩沖區(qū)找到數(shù)據(jù))。因此,內(nèi)核把中斷處理分為兩部分:上半部(tophalf) 和下半部(bottomhalf),上半部(就是中斷服

16、務(wù)程序)內(nèi)核立即執(zhí)行,而下半部(就是一些 內(nèi)核函數(shù))留著稍后處理,首先,一個(gè)快速的“上半部”來(lái)處理硬件發(fā)出的請(qǐng)求,它必須在一個(gè)新的中斷產(chǎn)生之前 終止。通常,除了在設(shè)備和一些內(nèi)存緩沖區(qū)(如果你的設(shè)備用到了 DMA,就不止這些)之 間移動(dòng)或傳送數(shù)據(jù),確定硬件是否處于健全的狀態(tài)之外,這一部分做的工作很少。下半部運(yùn)行時(shí)是允許中斷請(qǐng)求的,而上半部運(yùn)行時(shí)是關(guān)中斷的,這是二者之間的主要 區(qū)別。但是,內(nèi)核到底什時(shí)候執(zhí)行下半部,以何種方式組織下半部?這就是我們要討論的下 半部實(shí)現(xiàn)機(jī)制,這種機(jī)制在內(nèi)核的演變過(guò)程中不斷得到改進(jìn),在以前的內(nèi)核中,這個(gè)機(jī)制叫 做bottomhalf(簡(jiǎn)稱(chēng)bh),在2.4以后的版本中有了

17、新的發(fā)展和改進(jìn),改進(jìn)的目標(biāo)使下半部可 以在多處理機(jī)上并行執(zhí)行,并有助于驅(qū)動(dòng)程序的開(kāi)發(fā)者進(jìn)行驅(qū)動(dòng)程序的開(kāi)發(fā)。二、軟中斷與tasklettasklet是linux中斷處理機(jī)制中的軟中斷延遲機(jī)制。引A tasklet,最主要的是考慮支持 SMP (多處理,Symmetrical Multi-Processing),提高 SMP 多個(gè) cpu 的利用率;不同的 tasklet 可以在不同的cpu上運(yùn)行。tasklet可以理解為softirq (軟中斷)的派生,所以它的調(diào)度時(shí)機(jī) 和軟中斷一樣。對(duì)于內(nèi)核中需要延遲執(zhí)行的多數(shù)任務(wù)都可以用tasklet來(lái)完成,由于同類(lèi) tasklet本身已經(jīng)進(jìn)行了同步保護(hù),所

18、以使用tasklet比軟中斷要簡(jiǎn)單的多,tasklet不需要考慮 SMP下的并行問(wèn)題,而又比workqueues有著更好的性能。tasklet通常作為中斷下半部來(lái)使 用,它在性能和易用性之間有著很好的平衡。中斷上半部(緊急的硬件操作)調(diào)用下半部(砌的耗時(shí)操作)三、tasklet的運(yùn)行機(jī)制參考:/techblog/archives/15471、定義tasklet由tasklet_struct結(jié)構(gòu)體來(lái)表示,每一個(gè)這樣的結(jié)構(gòu)體就表示一個(gè)tasklet。在<linux/interrupt.h>中可以看到如下的定義:struct tasklet structstruct tasklet st

19、ruct *next;unsigned long state; atomic_t count;void (*func)(unsigned long); unsigned long data;說(shuō)明:;struct tasklet struct *next;代表鏈表中的下一個(gè)taskletunsigned long state;代表此刻 tasklet 的狀態(tài),一般為 TASKLET_STATE_SCHED, 表示此tasklet已被調(diào)度且正準(zhǔn)備運(yùn)行;此變量還可取 TASKLET_STATE_RUN,表示正在運(yùn)行,但只用在多處理器的 情況下。atomic_t count;引用計(jì)數(shù)器,只有當(dāng)其值為0

20、時(shí)候,tasklet才會(huì)被激活;否則 誡禁it,不能被機(jī)行。void (*func)(unsigned long);函數(shù)指針,它指向tasklet處理函數(shù),這個(gè)處理函數(shù)的唯一參數(shù) 為 dataunsigned long data;上述處理函數(shù)的參數(shù)2、創(chuàng)建 tasklet在使用tasklet前,必須首先創(chuàng)建一個(gè)tasklet_struct類(lèi)型的變量。通常有兩種方法:靜態(tài)創(chuàng)建 和動(dòng)態(tài)創(chuàng)建。在 <linux/interrupt.h> 中的兩個(gè)宏:#define DECLARE_TASKLET(namer funcr data) struct tasklet_struct name =

21、NULL, 0, ATOMIC_INIT(0), func, data #define DECLARE_TASKLET_DISABLED(name, func, data) struct tasklet_struct name = NULL, 0, ATOMIC_INIT(1)r func, data 通過(guò)第一個(gè)宏創(chuàng)建的tasklet處于激活狀態(tài),再通過(guò)調(diào)度函數(shù)被掛起盡而被內(nèi)核執(zhí)行;而通過(guò)第二個(gè)宏創(chuàng)建的tasklet處于禁止?fàn)顟B(tài)。從兩個(gè)宏的定義可以看到,所謂的靜態(tài)創(chuàng)建或動(dòng)態(tài)創(chuàng)建就是直接定義個(gè)一個(gè)名為name的tasklet_struct類(lèi)型的變量,并將宏中各個(gè)參數(shù)相應(yīng)的賦值給這個(gè)name變量的

22、各個(gè)成員。注意,兩個(gè)宏在功能上差異就在于對(duì)name變量count成員的賦值上。具體原因見(jiàn)上述結(jié)構(gòu) 體說(shuō)明。3、處理函數(shù)實(shí)現(xiàn)tasklet的結(jié)構(gòu)體中包含處理函數(shù)的函數(shù)指針func,它指向的是這樣的一個(gè)函數(shù):void tasklet_handler(unsigned long data);如同上半部分的中斷處理程序一樣,這個(gè)函數(shù)需要我們自己來(lái)實(shí)現(xiàn)。4、tasklet 常用接口創(chuàng)建好之后,我們還要通過(guò)如下的方法對(duì)tasklet進(jìn)行初始化與調(diào)度: void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsig

23、ned long data);/*初始化tasklet, func指向要執(zhí)行的函數(shù),data為傳遞給函數(shù)func的參數(shù)*/ tasklet_schedule(&my_tasklet) void tasklet_kill(struct tasklet_struct *t) void tasklet_disable(struct tasklet_struct *t)/*調(diào)度執(zhí)行指定的tasklet*/*移除指定tasklet*/*禁用指定tasklet*/ void tasklet_enable(struct tasklet_struct *t)/*啟用先前被禁用的tasklet*/四、內(nèi)

24、核模塊編程源碼編寫(xiě).c源文件Makefile文件編寫(xiě)編譯模塊make模塊加載進(jìn)內(nèi)核insmod查看加載的內(nèi)容mesg查看內(nèi)核模塊Ismod卸載內(nèi)核模塊rmmod五、任務(wù)描述1. 編寫(xiě)內(nèi)核模塊,使用tasklet實(shí)現(xiàn)打印helloworldo2. 加載、卸載模塊并查看模塊打印信息。六、審核要求1. 正確編寫(xiě)滿足功能的源文件,正確編譯。2. 正常加載、卸載內(nèi)核模塊;且內(nèi)核模塊功能滿足任務(wù)所述。3. 提交相關(guān)源碼與運(yùn)行截圖。七、參考答案1、參考答案源碼tasklet_interrupt.c#include <linux/module.h>#include <linux/interr

25、upt.h>MODULE_LICENSE(nGPLH);static struct tasklet_struct my_tasklet;static void tasklet_handler(unsigned long data)(printk(nHello World! tasklet is working.nn);)static int _init mytasklet_init(void)(printk(nStart tasklet module.An1'); tasklet_init(&my_tasklet, tasklet_handler, 0); tasklet

26、_schedule(&my_tasklet);return 0;static void _exit mytasklet_exit(void)(tasklet_kill(&my_tasklet); printk(HExit tasklet module.nn);)module_init(mytasklet_init);module exit(mytasklet exit);2、Makefileifneq ($(KERNELRELEASE),)objm := tasklet interrupLoelseKERNELDIR ?= /root/raspberrypi-kernelPWD

27、 := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif.PHONY:cleanclean:-rm *.mod.c *.o *.order *.symvers *ko2、內(nèi)核模塊加載結(jié)果rootopenEuler taskl# makemake -C /root/raspberrypi-kernel M=/root/kernel_gkd/ch4/taskl modules makel: Entering directory '/root/raspberrypi-kernel'CC M /root

28、/kernel_gkd/ch4/taskl/tasklet_intertupt.oBuilding modulesr stage 2.MODPOST 1 modulesCC /root/kernel_gkd/ch4/taskl/tasklet_intertupt.mod.o LD M /root/kernel_gkd/ch4/taskl/tasklet_intertupt.ko makel: Leaving directory '/root/raspberrypi-kernel'rootopenEulerrootopenEulerrootopenEulerrootopenEul

29、ertaskl#taskl# insmod tasklet_intertupt.ko taskl#taskl# dmesg | tail -n 2 1159.844493 Start tasklet module.taskl#taskl# rmmod tasklet_intertupt taskl#taskl# dmesg | tail -n 31159.844548 Hello World! tasklet is working. rootopenEulerrootopenEulerrootopenEulerrootopenEuler 1159.844493 Start tasklet mo

30、dule.1159.844548 Hello World! tasklet is working.1179.037567 Exit tasklet module.frcc十幻ccanFular 十谷ski 1#實(shí)驗(yàn)2.進(jìn)程管理:信息獲取、設(shè)置,線程操作一、相關(guān)知識(shí)當(dāng)前進(jìn)程在在/proc文件系統(tǒng)也有保存(如2.1所述),只不過(guò)需要遍歷所有進(jìn)程文件 夾,從stat文件中讀取狀態(tài),來(lái)判定是否為當(dāng)前運(yùn)行進(jìn)程。而內(nèi)核中可用進(jìn)程遍歷函數(shù)來(lái) 遍歷所有進(jìn)程,且進(jìn)程描述符task_struct結(jié)構(gòu)里邊有state狀態(tài),state為。的進(jìn)程就是當(dāng)前 進(jìn)程。1 進(jìn)程描述符task_struct 系統(tǒng)中存放進(jìn)程的管理

31、和控制信息的數(shù)據(jù)結(jié)構(gòu)稱(chēng)為進(jìn)程控制塊PCB (Process Control Block),是進(jìn)程管理和控制的最重要的數(shù)據(jù)結(jié)構(gòu)。 每一個(gè)進(jìn)程均有一個(gè)PCB,在創(chuàng)建進(jìn)程時(shí),建立PCB,伴隨進(jìn)程運(yùn)行的全過(guò)程,直 到進(jìn)程撤消而撤消。 在Linux中,每一個(gè)進(jìn)程都有一個(gè)進(jìn)程描述符task_struct,也就是PCB; task_struct結(jié)構(gòu)體是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會(huì)被裝載到RAM里并包含每個(gè) 進(jìn)程所需的所有信息。是對(duì)進(jìn)程控制的唯一手段也是最有效的手段。 task_struct 定義在 linux/ sched.h 頭文件中。2 task_struct中幾個(gè)重要字段struct task_

32、struct (volatile long state;進(jìn)程運(yùn)行狀態(tài),-1代表不可運(yùn)行,。代表可運(yùn)行,0代表已停止。struct mm_struct *mm;該結(jié)構(gòu)體記錄了進(jìn)程內(nèi)存使用的相關(guān)情況pid_t pid;進(jìn)程號(hào)char commTASK_COMM_LEN;保存進(jìn)程名字的字符數(shù)組(1) 其中結(jié)構(gòu)體 mm_struct定義在頭文件linux/mm_types.h中,mm_struct中的unsigned long total_vm字段表示進(jìn)程占用內(nèi)存的大小。(2) 以上四個(gè)字段便是任務(wù)中需要打印的進(jìn)程四項(xiàng)信息。3、for_each_process(1) for_each_process是

33、一個(gè)宏,定義在linux/sched/signal.h文件中,提供了依次訪問(wèn) 整個(gè)任務(wù)隊(duì)列的能力;(2) 定義內(nèi)容如下:從init_task開(kāi)始遍歷系統(tǒng)所有進(jìn)程,init_task是進(jìn)程結(jié)構(gòu)鏈表頭。#define for_each_process(p) for (p 二 &init task ; (p = next task(p) != &init task ;)可用如下方式遍歷并打印進(jìn)程信息:struct task_struct *p;for_each_process(p)(if()(打印信息ooooo二、任務(wù)描述1. 編寫(xiě)一個(gè)內(nèi)核模塊,打印當(dāng)前系統(tǒng)處于運(yùn)行狀態(tài)的進(jìn)程的PID

34、和名字。2. 加載、卸載模塊并查看模塊打印信息。三、審核要求1. 正確編寫(xiě)滿足功能的源文件,正確編譯。2. 正常加載、卸載內(nèi)核模塊;且內(nèi)核模塊功能滿足任務(wù)所述。3. 提交相關(guān)源碼與運(yùn)行截圖。四、參考答案1、參考答案源碼process_info.c#include <linux/module.h>#include <linux/sched/signal.h>#include <linux/sched.h>MODULE_LICENSE(nGPLH);struct task_struct *p;static int _init process_info_init(

35、void)( printk(nStart process_info!nn); for_each_process(p) if(p->state = 0) printk(nl)name:%s 2)pid:%d 3)state:%ldn”,p->comm, p->pid, p->state);return 0;static void _exit process_info_exit(void)(printk(nExit process_info!nn);module_init(process_info_init);module exit(process info exit);2、Makefileifneq ($(KERNELRELEASE),) obj-m := process_info.oelseKERNELDIR ?= /root/raspberrypi-kernelPWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif.PHONY:cleanclean:-rm *.mod.c *.o *.order *.symvers *ko2、內(nèi)核模塊加載結(jié)果root(QopenEuler task3# makemake -C

溫馨提示

  • 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)論