歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix資訊 >> 學習Unix操作系統參數大行動

學習Unix操作系統參數大行動

日期:2017/3/6 11:41:29   编辑:Unix資訊

我們在使用Unix操作系統的時候,我們會經常用到一些符號,也許你還是對Unix操作系統不是很熟悉,這些就是Unix操作系統的參數,今天,我們就來學習下這方面的知識。參數irq表示所要申請的硬件中斷號。handler為向Unix操作系統登記的中斷處理子 程序,中斷產生時由Unix操作系統來調用,調用時所帶參數irq為中斷號,dev_id為申請時告訴系統的設備標識,regs為中斷發生時寄存器內容。

device為設備名, 將會出現在/proc/interrupts文件裡。flag是申請時的選項,它決定中斷處理程序的一些特性,其中最重要的是中斷處理程序是快速處理程序(flag裡設置了SA_INTERRUPT)還是慢速處理程序(不設置SA_INTERRUPT),快速處理程序運行時,所有中斷都被屏蔽,而慢速處理程序運行時,除了正在處理的中斷外, 其它中斷都沒有被屏蔽。

在LINUX系統中,中斷可以被不同的中斷處理程序共享, 這要求每一個共享此中斷的處理程序在申請中斷時在flags裡設置SA_SHIRQ, 這些處理程序之間以dev_id來區分。如果中斷由某個處理程序獨占,則dev_id 可以為NULL。request_irq返回0表示成功,返回-INVAL表示irq 15或 handler==NULL,返回-EBUSY表示中斷已經被占用且不能共享。

作為Unix操作系統核心的一部分,設備驅動程序在申請和釋放內存時不是調用malloc 和free,而代之以調用kmalloc和kfree,它們被定義為:參數len為希望申請的字節數,obj為要釋放的內存指針。priority為分配內存操作的優先級,即在沒有足夠空閒內存時如何操作,一般用GFP_KERNEL。

與中斷和內存不同,使用一個沒有申請的I/O端口不會使CPU產生異常,也就不會導致諸如“segmentation fault"一類的錯誤發生。任何進程都可以訪問 任何一個I/O端口。此時系統無法保證對I/O端口的操作不會發生沖突,甚至會 因此而使Unix操作系統崩潰。因此,在使用I/O端口前,也應該檢查此I/O端口是否已有 別的程序在使用,若沒有,再把此端口標記為正在使用,在使用完以後釋放它。

這樣需要用到如下幾個函數:
調用這些函數時的參數為:from表示所申請的I/O端口的起始地址; extent為所要申請的從from開始的端口數;name為設備名,將會出現在/proc/ioports文件裡。check_region返回0表示I/O端口空閒,否則為正在被使用。

在申請了I/O端口之後,就可以如下幾個函數來訪問I/O端口:

其中inb_p和outb_p插入了一定的延時以適應某些慢的I/O端口。 在設備驅動程序裡,一般都需要用到計時機制。在LINUX系統中,時鐘是由 系統接管,設備驅動程序可以向系統申請時鐘。與時鐘有關的系統調用有:#include asm/param.h

struct timer_list的定義為:其中expires是要執行function的時間。Unix操作系統核心有一個全局變量JIFFS 表示當前時間,一般在調用add_timerjiffies=JIFFIES+num,表示在num個 系統最小時間間隔後執行function。Unix操作系統最小時間間隔與所用的硬件平台有關, 在核心裡定義了常數HZ表示一秒內最小時間間隔的數目,則num*HZ表示num 秒。

Unix操作系統計時到預定時間就調用function,並把此子程序從定時隊列裡刪除, 因此如果想要每隔一定時間間隔執行一次的話,就必須在function裡再一次調 用add_timer。function的參數d即為timer裡面的data項。

在設備驅動程序裡,還可能會用到如下的一些Unix操作系統函數:這兩個函數負責打開和關閉中斷允許。

在用戶程序調用read 、write時,因為進程的運行狀態由用戶態變為核心 態,地址空間也變為核心地址空間。而read、write中參數buf是指向用戶程 序的私有地址空間的,所以不能直接訪問,必須通過上述兩個Unix操作系統函數來訪問用 戶程序的私有地址空間。memcpy_fromfs由用戶程序地址空間往核心地址空間 復制,memcpy_tofs則反之。參數to為復制的目的指針,from為源指針,n 為要復制的字節數。

在Unix操作系統設備驅動程序裡,可以調用printk來打印一些調試信息,用法與printf 類似。printk打印的信息不僅出現在屏幕上,同時還記錄在文件syslog裡。

Copyright © Linux教程網 All Rights Reserved