linux 基礎(chǔ)復(fù)習(xí)(9)設(shè)備驅(qū)動(dòng)入門
· get_free_page:獲得一個(gè)或幾個(gè)連續(xù)頁(yè)面。
· get_dma_pages:獲得用于DMA傳輸?shù)捻?yè)面。
與之相對(duì)應(yīng)的釋放內(nèi)存用也有kfree或free_pages 族。
kmalloc 函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
函數(shù)原型 void *kmalloc(unsigned int len,int flags)
Len:希望申請(qǐng)的字節(jié)數(shù)
GFP_KERNEL:內(nèi)核內(nèi)存的通常分配方法,可能引起睡眠
GFP_BUFFER:用于管理緩沖區(qū)高速緩存
函數(shù)傳入值 flags GFP_ATOMIC:為中斷處理程序或其他運(yùn)行于進(jìn)程上下文之外的代碼分
配內(nèi)存,且不會(huì)引起睡眠
GFP_USER:用戶分配內(nèi)存,可能引起睡眠
GFP_HIGHUSER:優(yōu)先高端內(nèi)存分配
_GFP_DMA:DMA數(shù)據(jù)傳輸請(qǐng)求內(nèi)存
_GFP_HIGHMEN:請(qǐng)求高端內(nèi)存
函數(shù)返回值 成功:寫入的數(shù)據(jù)長(zhǎng)度
失?。?EFAULT
kfree函數(shù)的語(yǔ)法格式
所需頭文件 #i nclude
函數(shù)原型 void kfree(void * obj)
函數(shù)傳入值 obj:要釋放的內(nèi)存指針
函數(shù)返回值 成功:寫入的數(shù)據(jù)長(zhǎng)度
失?。?EFAULT
get_free_ page類函數(shù)語(yǔ)法要點(diǎn)
unsigned long get_zeroed_page(int flags)
unsigned long __get_free_page(int flags)
函數(shù)原型 unsigned long __get_free_page(int flags,unsigned long order)
unsigned long __get_dma_page(int flags,unsigned long order)
函數(shù)傳入值 flags:同kmalloc
order:要請(qǐng)求的頁(yè)面數(shù),以2為底的對(duì)數(shù)
函數(shù)返回值 成功:寫入的數(shù)據(jù)長(zhǎng)度
失?。?EFAULT
free_page類函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
函數(shù)原型 unsigned long free_page(unsigned long addr)
unsigned long free_page(unsigned long addr)
函數(shù)傳入值 flags:同kmalloc
order:要請(qǐng)求的頁(yè)面數(shù),以2為底的對(duì)數(shù)
函數(shù)返回值 成功:寫入的數(shù)據(jù)長(zhǎng)度
失敗:-EFAULT
printk類函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
函數(shù)原型 int printk(const char * fmt,…)
KERN_EMERG:緊急時(shí)間消息
KERN_ALERT:需要立即采取動(dòng)作的情況
KERN_CRIT:臨界狀態(tài),通常涉及嚴(yán)重的硬件或軟件操作失敗
KERN_ERR:錯(cuò)誤報(bào)告
函數(shù)傳入值 fmt: KERN_WARNING:對(duì)可能出現(xiàn)的問(wèn)題提出警告
日志級(jí)別 KERN_NOTICE:有必要進(jìn)行提示的正常情況
KERN_INFO:提示性信息
KERN_DEBUG:調(diào)試信息
…:如printf一樣的格式說(shuō)明
函數(shù)返回值 成功:0
失?。?1
這些不同優(yōu)先級(jí)的信息可以輸出到控制臺(tái)上、/var/log/messages 里。其中,對(duì)輸出給控制臺(tái)的信息有一個(gè)特定的優(yōu)先級(jí)console_loglevel。若優(yōu)先級(jí)小于這個(gè)整數(shù)值時(shí),則消息才能顯示到控制臺(tái)上,否則,消息會(huì)顯示在/var/log/messages 里。若不加任何優(yōu)先級(jí)選項(xiàng),則消息默認(rèn)輸出到/var/log/messages 文件中。
要開(kāi)啟klogd和syslogd服務(wù),消息才能正常輸出。
proc 文件系統(tǒng)
/proc 文件系統(tǒng)是一個(gè)偽文件系統(tǒng),它是一種內(nèi)核和內(nèi)核模塊用來(lái)向進(jìn)程發(fā)送信息的機(jī)制。這個(gè)偽文件系統(tǒng)讓用戶可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行交互,獲取有關(guān)進(jìn)程的有用信息,在運(yùn)行時(shí)通過(guò)改變內(nèi)核參數(shù)改變?cè)O(shè)置。與其他文件系統(tǒng)不同,/proc存在于內(nèi)存之中而不是硬盤上。讀者可以通過(guò)“ls”查看/proc文件系統(tǒng)的內(nèi)容。
/proc文件系統(tǒng)主要目錄內(nèi)容
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} onclick=if(!this.resized) {return true;} else {window.open(this.src);} alt= src=http://blogimg.chinaunix.net/blog/upfile2/080413215654.jpg onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} border=0>
除此之外,還有一些是以數(shù)字命名的目錄,它們是進(jìn)程目錄。系統(tǒng)中當(dāng)前運(yùn)行的每一個(gè)進(jìn)程都有對(duì)應(yīng)的一個(gè)目錄在/proc下,以進(jìn)程的PID 號(hào)為目錄名,它們是讀取進(jìn)程信息的接口。進(jìn)程目錄的結(jié)構(gòu)如下
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} onclick=if(!this.resized) {return true;} else {window.open(this.src);} alt= src=http://blogimg.chinaunix.net/blog/upfile2/080413215720.jpg onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} border=0>
用戶可以使用cat命令來(lái)查看其中的內(nèi)容。
可以看到,/proc文件系統(tǒng)體現(xiàn)了內(nèi)核及進(jìn)程運(yùn)行的內(nèi)容,在加載模塊成功后,讀者可以使用查看/proc/device文件獲得相關(guān)設(shè)備的主設(shè)備號(hào)。
評(píng)論