《電子技術應用》
您所在的位置:首頁 > 測試測量 > 設計應用 > 基于Linux系統的PCI設備驅動程序的開發
基于Linux系統的PCI設備驅動程序的開發
崔 莉, 趙大政
摘要: 以一個具體的PCI設備的驅動開發過程為基礎,總結了與PCI設備驅動開發的相關問題,詳細闡述了基本開發步驟、具體實現、驅動程序內核塊的加載以及用戶進程和驅動程序的協同工作問題。
Abstract:
Key words :

  摘  要: 以一個具體的PCI設備的驅動開發過程為基礎,總結了與PCI設備驅動開發的相關問題,詳細闡述了基本開發步驟、具體實現、驅動程序內核塊的加載以及用戶進程和驅動程序的協同工作問題。
  關鍵詞: PCI設備  設備驅動  中斷

1 Linux 系統下設備驅動的概念
  在Linux操作系統下,系統調用是操作系統內核和應用程序之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接口[2]。設備驅動程序為應用程序屏蔽了硬件的細節。這樣在應用程序看來,硬件設備只是一個文件,即特殊的設備文件。因此應用程序通過特定的設備驅動程序可以像操作普通文件一樣對具體的硬件設備進行操作。應用程序和設備驅動的關系如圖1所示。

 


  在Linux操作系統下有二種主要的設備文件類型,一種是字符設備,另一種是塊設備。每種設備文件和實際的硬件相聯系。字符設備和塊設備的主要區別是:字符設備在寫請求的同時,實際的硬件I/O操作便發生了。塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求讀/寫時,它首先察看緩沖區的內容。如果緩沖區的數據能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作。塊設備主要是針對磁盤等慢速設備設計的,以免等待時耗費過多的CPU時間。
  就特定的PCI卡,用戶可根據用途來確定是將其作為塊設備,還是字符設備來處理。本文根據實際工作中所用到的PCI采集卡的特點,簡要闡述了其驅動程序開發過程中需要注意的問題和基本步驟。
2  Linux系統PCI設備驅動程序的開發
2.1 基本需求分析
 
  根據設備不同的用途,可以區分不同的PCI設備類型?;谶@一設備類型,又可以分析出其他一些基本需求。從本文所使用的數據采集卡可知,其主要用途是用于采集和控制。根據工控過程的特點,需要PCI采集卡在每采樣一個數據點時,就以中斷的方式交給內核緩沖,再由用戶程序適時取出使用。因此,將PCI采集卡作為一個字符設備來處理,并選擇觸發模式為內觸發,數據傳送模式為中斷傳送。本文就是基于這樣的需求,按如下所述的步驟和具體實現過程,開發了其驅動程序。
2.2 基本步驟
  (1)PCI設備文件的建立
  既然PCI設備被操作系統當作特殊的文件來看,就要有個文件名。因此,建立一設備文件的名字來代表硬件設備是開發驅動的第一步。按照習慣,設備文件都放在系統目錄/dev下。一般在開發過程中,由于要經常查看設備文件的狀態,而在這一目錄下已經有很多設備文件,查看起來特別不方便,因此,可以自己在某個地方建立一個文件夾,將該設備文件放在該文件夾下。使用mknod命令可以建立設備特殊文件(注意:只有root賬號的超級用戶才能使用些命令),其格式示例為:
  $mknod  /subfolders/mydev/PCIdrv   c  254  0
  也就是用主設備號254(一般在Linux操作系統下設備文件的主設備號不會超過254,所以選用254,以確保該設備號是惟一的)和輔助設備號0在目錄/subfolders/mydev下建立特殊設備文件PCIdrv。
  (2)file_operation數據結構
  設備驅動程序就是一組能完成特定任務的、在內核態下運行的子函數的集合。每個設備驅動程序都有一個被稱作file_operation的數據結構來管理、組織這些子函數。該結構包含了指向驅動程序內部這些子函數的指針。當系統引導時,內核會調用每個驅動程序的初始化函數。它有二個任務要完成:(1)將設備驅動程序使用的主設備號通知內核;(2)初始化函數將file_operation指針傳送給內核?;窘Y構為:
  struct file_operations PCI_fops={NULL,PCIread,
  PCIwrite,NULL,NULL,NULL,NULL,
  PCIopen,PCIrelease,NULL,NULL};
  結構中的每一個非NULL成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如讀/寫操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然后讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是Linux的設備驅動程序工作的基本流程。例如:當用戶進程執行open( )調用時,open( )執行體將根據open所帶的參數找到PCI設備驅動程序,并根據其相關聯的PCI_fops數據結構,找到PCIopen子函數的入口點,接著就執行PCIopen函數體。
  (3)編寫驅動程序子函數
  file_operation的數據結構中所定義的子函數的集合構成了具體的設備驅動的執行體。因此編寫驅動程序子函數是開發過程中最為重要的一步,這些子函數要根據具體的需求來設計。工作中用到的PCI采集卡的主要功能函數有:A/D轉換函數AD_INT_Start、AD_INT_Stop、AD_INT_Data,數字量采集與輸出函數DI_Data、DO_Data,D/A轉換函數AO_Data等。這里不予贅述。
2.3 PCI采集卡驅動程序的具體實現
  (1)獲取PCI采集卡的基本配置信息
  PCI采集卡的驅動程序主要是完成對采集卡的寄存器和PCI總線控制器的PCI配置空間的設置和讀取,用以啟動采集卡,并按照一定的方式進行采集、傳送、停止等。若要對這些寄存器進行設置和讀取,就要知道這些寄存器的BaseAddress和偏移值、中斷號等相關配置信息。這是對硬件操作的第一步。Linux操作系統對PCI設備提供了大量的初始化函數(這一點不同于Dos和Windows)。因此,在系統啟動時,這特定的初始化函數會被調用,用來檢測系統中存在的所有的PCI設備,并填充PCI設備的配置空間。因此,在開發PCI設備驅動時,只要執行相關的系統調用(由系統提供),就可獲得所需要的PCI設備信息。
下面是幾個常用的內核函數:
 ?、賞cibios_present( )
  ②int pcibios_find_device(int device_id,int vendor_id,
int index,int*bus_number,int*device_function)
    ③read_config_byte,read_config_word,read_config_dword
    ④write_config_byte,write_config_word,write_config_dword
    函數①的功能是:返回一個布爾值表明所運行的計算機是否具有支持PCI設備的能力;函數②的功能是:返回設備在總線上的位置及函數指針bus_number、device_function;函數③、④的功能是:通過調用該類函數,設備驅動程序實現寄存器空間的訪問,包括讀和寫。
  (2)內存操作
  設備驅動的子函數運行在內核態,在設備驅動程序中動態開辟和釋放內存。用kmalloc或get_free_pages直接申請頁而不是用malloc和free;釋放內存用的是kfree或free_pages。kmalloc等函數返回的是物理地址,而malloc等返回的是線性地址,且kmalloc最大只能開辟128KB。
  很多硬件需要一塊比較大的連續內存用作DMA傳送,并且需要一直駐留在內存,不能被交換到磁盤文件中去。但是kmalloc最多只能開辟128KB的內存,這可以通過犧牲一些系統內存的方法來解決。具體做法是:若機器是32MB的內存,在lilo.conf的啟動參數中加上mem=30MB,這樣Linux就認為此機器只有30MB的內存,剩下的2MB內存在vremap之后就可以為DMA所用。
  (3)Linux下的中斷及中斷處理
  Linux中的中斷處理程序很有特色。它的一個中斷處理程序可分為上半部(top half)和下半部(bottom half)二個部分。之所以會有上半部和下半部之分,完全是考慮到中斷處理的效率。上半部的功能是“登記中斷”,當一個中斷發生時,它就把設備驅動程序中中斷例程的下半部掛到該設備的下半部執行隊列中去,然后就等待新的中斷的到來。這樣一來,上半部執行的速度就會很快,它就可以接受更多設備產生的中斷。上半部之所以要快,是因為它是完全屏蔽中斷的,如果不執行完,其他的中斷就不能被及時處理,只能等到這個中斷處理程序執行完畢以后。所以,要盡可能多地對設備產生的中斷進行服務和處理,確保中斷處理程序的速度。
要使用一個中斷,必須先向系統登記。實現系統中斷登記的系統調用形式如下:
  int request_irq(unsigned int irq,void(*handle)(int,void*,struct pt_regs*),unsigned int long flags,const char*device);
  其中:irq是要申請的中斷號,handle是中斷處理函數指針,flags是中斷標識,device是設備名。
  如果登記成功,則返回0。這時在/proc/interrupts文件中可以看到自己請求的中斷。
  (4)內核態和用戶態下數據交換問題
  用戶進程在執行特定系統調用使用設備時,系統就從用戶態進入內核態下運行,這時用戶進程的環境仍然可用。但在內核緩沖區和用戶進程緩沖區間進行數據交換時,必須要用內核提供的專門函數。主要有:put_user( ),get_user( ),copy_to_user( ),copy_from_user( )等。
  通過這些調用來使用用戶緩沖時還要進行用戶緩沖讀寫權限的檢驗,否則調用數據交換函數時會出錯。檢驗函數為:int verify_area(int access,void*u_addr,unsigned long size)。
3 將驅動程序嵌入內核
  由于驅動程序是在內核下運行,因此,要把編寫的驅動程序嵌入內核。驅動程序可以按照二種方式編譯,一種是編譯進kernel,另一種是編譯成模塊(modules)。如果編譯進內核的話,會增加內核的大小,還要改動內核的源文件,而且不能動態卸載,不利于調試。所以推薦使用模塊方式。這種方式可以用insmod命令來加載模塊和用rmmod來卸載模塊。
  在用insmod命令將編譯好的模塊調入內核時,init_module 函數被調用。在這里,init_module只做了一件事,就是向系統的字符設備表登記了一個字符設備。register_chrdev需要三個參數:其一是希望獲得的設備號,如果為0,系統將選擇一個沒有被占用的設備號返回;其二是設備文件名;其三是用來登記驅動程序實際執行操作的函數指針。如果登記成功,則返回設備的主設備號;若不成功,則返回一個負值。
  下面是用模塊方法將驅動程序加載進內核時用的主要功能函數體示例,也就是當執行inmod 命令時執行的函數體。
  int init_module(void)
  {
       int result;
       result=register_chrdev(254,″PCItest″,&PCI_fops);
       if(result<0) {
    printk(KERN_INFO ″test:can′t get major number\n″);
    return result;
       }
       if(PCItest==0) PCItest=result;/*dynamic*/
       return 0;
  }
  同樣可以用 rmmod 命令卸載模塊:
  void cleanup_module(void)
  {
       unregister_chrdev(254,″PCItest″);
  }
  在用rmmod卸載模塊時,cleanup_module函數被調用,它釋放字符設備PCItest在系統字符設備表中占有的表項。
4  結束語
  設計Linux設備驅動程序有一定的模式,遵循這個模式,將會大大減輕設計程序的工作量。本文總結了工作中對一種PCI采集卡的驅動開發過程。同網卡的驅動相比,PCI采集卡驅動的開發是一件相對簡單的工作,但它們同屬于PCI設備,具有類似之處。所以,PCI采集卡的驅動開發對設計復雜的網絡驅動程序是很有幫助的。
參考文獻
1   Rubini A著,LISOLEG譯.Linux設備驅動程序.北京:中國電力出版社,2000
2   蔡震.Linux系統下USB設備驅動程序的開發.計算機測量與控制,2003;11(2)
3   李善平,劉文蜂.Linux內核2.4版源代碼分析大全.北京:機械工業出版社,2002
4   王學龍.嵌入式Linux系統設計與應用.北京:清華大學出版社,2001
5   Rusling D A著,朱珂譯.Linux編程白皮書.北京:機械工業出版社,2000
 

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲一级二级| 欧美福利视频一区| 亚洲精品综合久久中文字幕| 欧美精品99| 欧美日韩国内自拍| 国产精品久久国产精麻豆99网站| 亚洲高清视频的网址| 亚洲裸体俱乐部裸体舞表演av| 蘑菇福利视频一区播放| 亚洲国产91色在线| 久久中文久久字幕| 久久嫩草精品久久久久| 欧美激情一区二区三级高清视频| 欧美精品123区| 久久美女艺术照精彩视频福利播放| 国产精品视频免费一区| 久久久久久久网站| 影音先锋成人资源站| 欧美日韩国产欧| 亚洲综合欧美| 欧美午夜一区二区福利视频| 91久久精品国产91久久性色| 伊人精品久久久久7777| 欧美黄色一级视频| 亚洲欧美在线观看| 欧美高清成人| 亚洲精品中文字幕女同| 亚洲自拍16p| 国产在线播精品第三| 国产精品久久国产精麻豆99网站| 国产乱码精品1区2区3区| 久久裸体艺术| 亚洲人成在线播放| 欧美伦理91| 国产农村妇女精品一区二区| 亚洲第一中文字幕在线观看| 老牛嫩草一区二区三区日本| 亚洲欧美日韩另类精品一区二区三区| 国内激情久久| 国产精品一区二区三区四区| 欧美日韩国产欧美日美国产精品| 亚洲精品一二区| 欧美在线观看视频在线| 久久超碰97中文字幕| 久久久久久一区二区三区| 欧美手机在线| 亚洲欧美不卡| 国产精品成人一区二区网站软件| 欧美精品成人91久久久久久久| 欧美成人国产| 国产精品综合| 亚洲图片欧洲图片日韩av| 欧美有码在线观看视频| 国产欧美在线视频| 欧美视频一区在线| 欧美暴力喷水在线| 亚洲免费在线视频| 亚洲人在线视频| 欧美一区二区三区视频免费| 欧美精品免费在线观看| 亚洲日本成人网| 欧美第一黄色网| 91久久久国产精品| 红桃视频成人| 老妇喷水一区二区三区| 国产精品免费电影| 国产一区香蕉久久| 久热综合在线亚洲精品| 欧美精品午夜| 亚洲一区二区三区四区在线观看| 久久久夜夜夜| 久久一区视频| 亚洲免费精彩视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲美女在线视频| 亚洲毛片在线免费观看| 欧美国产综合| 亚洲欧洲精品一区二区| 日韩亚洲不卡在线| 国产日韩一区二区三区| 国产一区二区三区四区三区四| 一区二区亚洲| 美女国内精品自产拍在线播放| 国产欧美一区二区精品仙草咪| 精品999在线播放| 欧美日韩日本国产亚洲在线| 国内自拍亚洲| 欧美理论电影在线播放| 国产亚洲精品久久久久久| aa成人免费视频| 亚洲手机视频| 亚洲九九九在线观看| 久久久久久久久久久成人| 欧美激情视频一区二区三区在线播放| 日韩视频精品在线| 一区二区欧美国产| 亚洲综合首页| 国产精品视频久久一区| 欧美视频在线免费看| 欧美在线资源| 国产精品二区在线观看| 亚洲精品一区二区三区99| 国产精品国产三级国产a| 欧美好骚综合网| 欧美精品福利| 久久久夜夜夜| 欧美日韩精品一区二区三区| 久久精品国产清高在天天线| 久久国产精品久久w女人spa| 欧美一区二区三区啪啪| 韩国av一区二区三区| 国产伦精品一区二区三区高清| 国产欧美一区二区精品婷婷| 亚洲福利视频网| 欧美+日本+国产+在线a∨观看| 国产精品最新自拍| 欧美在线看片a免费观看| 亚洲欧洲精品一区二区三区波多野1战4| 欧美激情综合五月色丁香| 国产欧美日韩在线| 久久久久看片| 国产亚洲人成网站在线观看| 亚洲国产精品一区制服丝袜| 国产精品区二区三区日本| 尤物yw午夜国产精品视频明星| 黄色在线成人| 亚洲乱码国产乱码精品精可以看| 国产精品久久久久久久久免费| 亚洲免费成人| 亚洲深夜影院| 国产精品国产亚洲精品看不卡15| 久久狠狠一本精品综合网| 老司机免费视频久久| 亚洲欧洲午夜| 国产精品无人区| 亚洲一二三区在线观看| 国产精品系列在线播放| 亚洲激情视频在线播放| 亚洲欧美精品在线| 久久亚洲一区| 性亚洲最疯狂xxxx高清| 国产精品区二区三区日本| 欧美视频不卡| 91久久一区二区| 欧美日韩中字| 羞羞答答国产精品www一本| 亚洲精品在线看| 亚洲男人的天堂在线观看| 99视频精品在线| 美女诱惑一区| 国产美女精品人人做人人爽| 国产一二精品视频| 狠狠色狠狠色综合日日tαg| 欧美一区国产一区| 国产精品综合久久久| 久久久天天操| 日韩视频精品在线| 欧美美女bbbb| 蜜臀av在线播放一区二区三区| 亚洲日本一区二区三区| 国产一区高清视频| 亚洲欧美清纯在线制服| 亚洲区一区二| 欧美精品日韩一本| 欧美成人在线影院| 欧美一区二区视频在线| 99成人免费视频| 欧美日韩另类国产亚洲欧美一级| 国产精品久久久对白| 欧美高清视频一二三区| 久久女同互慰一区二区三区| 久久久不卡网国产精品一区| 国产日韩精品一区二区浪潮av| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日韩日日夜夜| 在线亚洲精品| 伊人成人网在线看| 欧美 日韩 国产精品免费观看| 欧美综合激情网| 国产综合久久久久久鬼色| 榴莲视频成人在线观看| 亚洲欧美卡通另类91av| 欧美日韩国产经典色站一区二区三区| 亚洲精品一区二区三区婷婷月| 好吊色欧美一区二区三区视频| 欧美电影免费观看网站| 亚洲国产高清在线| 欧美日韩在线播| 亚洲成人自拍视频| 一区二区欧美日韩视频| 这里只有精品在线播放| 亚洲欧美bt| 国产乱码精品一区二区三| 乱人伦精品视频在线观看| 日韩一级网站| 欧美高清一区| 欧美在线视频免费观看| 在线欧美日韩| 一区久久精品| 男人的天堂亚洲在线| 亚洲日本成人网| 亚洲破处大片| 一二三区精品| 亚洲桃色在线一区| 农夫在线精品视频免费观看| 亚洲中午字幕| 亚洲高清视频的网址| 99re6这里只有精品| 亚洲精选久久| 亚洲国产高清在线观看视频| 在线亚洲欧美| 久久精品天堂| 欧美日韩精品免费观看| 国产欧美一区二区精品秋霞影院| 久久九九免费| 激情av一区二区| 国产精品久久久久一区二区三区| 麻豆国产va免费精品高清在线| 亚洲国产乱码最新视频| 亚洲第一精品久久忘忧草社区| 欧美理论电影在线观看| 国产精品v日韩精品| 蜜桃久久av| 国产麻豆成人精品| 国产精品亚洲综合天堂夜夜| 国产亚洲欧洲一区高清在线观看| 99在线精品观看| 国产欧美一区二区三区国产幕精品| 国产亚洲日本欧美韩国| 欧美成人精品在线| 亚洲精品日韩在线观看| 久久久久在线| 国产精品亚洲欧美| 国产精品第三页| 欧美 亚欧 日韩视频在线| 久久精品国产欧美激情| 久久亚洲图片| 欧美日韩久久久久久| 国产日韩专区在线| 欧美一区二区三区四区高清| 国产精品欧美日韩| 亚洲欧洲日夜超级视频| 国产欧美精品一区二区三区介绍| 亚洲午夜一区二区| 在线日本高清免费不卡| 日韩视频在线观看一区二区| 国产在线视频不卡二| 亚洲欧美综合v| 国产精品久久二区| 欧美日韩一区二区免费在线观看| 国产精品久久网站| 欧美日本中文字幕| 国产麻豆午夜三级精品| 欧美日一区二区在线观看| 永久91嫩草亚洲精品人人| 欧美精选午夜久久久乱码6080| 影音先锋日韩有码| 久久综合五月| 欧美午夜在线观看| 欧美1区免费| …久久精品99久久香蕉国产| 欧美激情一区二区三区高清视频| 免费精品99久久国产综合精品| 欧美日韩国产在线播放| 136国产福利精品导航| 国产美女精品视频免费观看| 亚洲精品国产精品国自产观看浪潮| 激情伊人五月天久久综合| 一区二区av在线| 国户精品久久久久久久久久久不卡| 亚洲一区二区在线视频| 欧美欧美午夜aⅴ在线观看| 欧美激情精品久久久久久变态| 亚洲国产国产亚洲一二三| 久久国产精品第一页| 久久久一区二区三区| 欧美伊久线香蕉线新在线| 亚洲三级视频| 一区二区av在线| 亚洲国产日韩欧美在线动漫| 亚洲主播在线| 一区二区91| 国内精品久久久久影院 日本资源| 9色porny自拍视频一区二区| 亚洲综合首页| 亚洲欧洲精品一区二区三区| 日韩写真视频在线观看| 一区二区三区四区五区在线| 999在线观看精品免费不卡网站| 国产一区二区三区四区在线观看| 欧美一级在线播放| 国产欧美日韩91| 国产一区免费视频| 国产精品福利av| 一区三区视频| 国产精品另类一区| 国产精品一区二区久久久| 欧美激情视频给我| 欧美日韩在线一区| 91久久久久久国产精品| 狠狠色狠狠色综合日日五| 亚洲婷婷免费| 久久精品毛片| 欧美成人午夜77777| 欧美日韩亚洲一区二区三区| 亚洲人成77777在线观看网| 91久久久久久国产精品| 欧美午夜理伦三级在线观看| 9国产精品视频| 国产精品视频一| 极品少妇一区二区三区精品视频| 欧美日韩国产精品| 亚洲国产精品va在看黑人| 国产精品久久久免费| **性色生活片久久毛片| 欧美mv日韩mv国产网站| 亚洲第一精品电影| 欧美日韩精品欧美日韩精品一| 国产深夜精品福利| 嫩草影视亚洲| 欧美亚洲色图校园春色| 国产精品实拍| 国产一区二区中文字幕免费看| 欧美黄色aa电影| 国产精品影音先锋| 蜜桃av噜噜一区二区三区| 日韩亚洲在线观看| 亚洲娇小video精品|