學習Unix操作系統(tǒng)參數(shù)大行動
我們在使用Unix操作系統(tǒng)的時候,我們會經(jīng)常用到一些符號,也許你還是對Unix操作系統(tǒng)不是很熟悉,這些就是Unix操作系統(tǒng)的參數(shù),今天,我們就來學習下這方面的知識。參數(shù)irq表示所要申請的硬件中斷號。handler為向Unix操作系統(tǒng)登記的中斷處理子 程序,中斷產(chǎn)生時由Unix操作系統(tǒng)來調(diào)用,調(diào)用時所帶參數(shù)irq為中斷號,dev_id為申請時告訴系統(tǒng)的設備標識,regs為中斷發(fā)生時寄存器內(nèi)容。
device為設備名, 將會出現(xiàn)在/proc/interrupts文件里。flag是申請時的選項,它決定中斷處理程序的一些特性,其中最重要的是中斷處理程序是快速處理程序(flag里設置了SA_INTERRUPT)還是慢速處理程序(不設置SA_INTERRUPT),快速處理程序運行時,所有中斷都被屏蔽,而慢速處理程序運行時,除了正在處理的中斷外, 其它中斷都沒有被屏蔽。
在LINUX系統(tǒng)中,中斷可以被不同的中斷處理程序共享, 這要求每一個共享此中斷的處理程序在申請中斷時在flags里設置SA_SHIRQ, 這些處理程序之間以dev_id來區(qū)分。如果中斷由某個處理程序獨占,則dev_id 可以為NULL。request_irq返回0表示成功,返回-INVAL表示irq 15或 handler==NULL,返回-EBUSY表示中斷已經(jīng)被占用且不能共享。
作為Unix操作系統(tǒng)核心的一部分,設備驅(qū)動程序在申請和釋放內(nèi)存時不是調(diào)用malloc 和free,而代之以調(diào)用kmalloc和kfree,它們被定義為:參數(shù)len為希望申請的字節(jié)數(shù),obj為要釋放的內(nèi)存指針。priority為分配內(nèi)存操作的優(yōu)先級,即在沒有足夠空閑內(nèi)存時如何操作,一般用GFP_KERNEL。
與中斷和內(nèi)存不同,使用一個沒有申請的I/O端口不會使CPU產(chǎn)生異常,也就不會導致諸如“segmentation fault"一類的錯誤發(fā)生。任何進程都可以訪問 任何一個I/O端口。此時系統(tǒng)無法保證對I/O端口的操作不會發(fā)生沖突,甚至會 因此而使Unix操作系統(tǒng)崩潰。因此,在使用I/O端口前,也應該檢查此I/O端口是否已有 別的程序在使用,若沒有,再把此端口標記為正在使用,在使用完以后釋放它。
這樣需要用到如下幾個函數(shù):
調(diào)用這些函數(shù)時的參數(shù)為:from表示所申請的I/O端口的起始地址; extent為所要申請的從from開始的端口數(shù);name為設備名,將會出現(xiàn)在/proc/ioports文件里。check_region返回0表示I/O端口空閑,否則為正在被使用。
在申請了I/O端口之后,就可以如下幾個函數(shù)來訪問I/O端口:
其中inb_p和outb_p插入了一定的延時以適應某些慢的I/O端口。 在設備驅(qū)動程序里,一般都需要用到計時機制。在LINUX系統(tǒng)中,時鐘是由 系統(tǒng)接管,設備驅(qū)動程序可以向系統(tǒng)申請時鐘。與時鐘有關(guān)的系統(tǒng)調(diào)用有:#include asm/param.h
struct timer_list的定義為:其中expires是要執(zhí)行function的時間。Unix操作系統(tǒng)核心有一個全局變量JIFFS 表示當前時間,一般在調(diào)用add_timerjiffies=JIFFIES+num,表示在num個 系統(tǒng)最小時間間隔后執(zhí)行function。Unix操作系統(tǒng)最小時間間隔與所用的硬件平臺有關(guān), 在核心里定義了常數(shù)HZ表示一秒內(nèi)最小時間間隔的數(shù)目,則num*HZ表示num 秒。
Unix操作系統(tǒng)計時到預定時間就調(diào)用function,并把此子程序從定時隊列里刪除, 因此如果想要每隔一定時間間隔執(zhí)行一次的話,就必須在function里再一次調(diào) 用add_timer。function的參數(shù)d即為timer里面的data項。
在設備驅(qū)動程序里,還可能會用到如下的一些Unix操作系統(tǒng)函數(shù):這兩個函數(shù)負責打開和關(guān)閉中斷允許。
在用戶程序調(diào)用read 、write時,因為進程的運行狀態(tài)由用戶態(tài)變?yōu)楹诵?態(tài),地址空間也變?yōu)楹诵牡刂房臻g。而read、write中參數(shù)buf是指向用戶程 序的私有地址空間的,所以不能直接訪問,必須通過上述兩個Unix操作系統(tǒng)函數(shù)來訪問用 戶程序的私有地址空間。memcpy_fromfs由用戶程序地址空間往核心地址空間 復制,memcpy_tofs則反之。參數(shù)to為復制的目的指針,from為源指針,n 為要復制的字節(jié)數(shù)。
在Unix操作系統(tǒng)設備驅(qū)動程序里,可以調(diào)用printk來打印一些調(diào)試信息,用法與printf 類似。printk打印的信息不僅出現(xiàn)在屏幕上,同時還記錄在文件syslog里。
【編輯推薦】