歡迎您光臨本站 註冊首頁

Linux字元設備驅動程序編寫基本流程

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

       

 

        驅動程序編寫基本流程:

  1.首先是一些版本信息,沒什麼用,但是不能少

  #define __NO_VERSION__

  #include <linux/modules.h>

  #include <linux/version.h>

  char kernel_version[] = UTS_RELEASE;

  2.為了把系統調用和驅動程序關聯起來,需要一個非常關鍵的數據結構:struct file_operations。file_operations結構的每一個成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是linux的設備驅動程序工作的基本原理。編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域

  3.簡單驅動程序的編寫(test.c):

  a.包含一些基本的頭文件。

  b.編寫一些功能函數,比如read(),write()等。這些函數被調用時系統進入和心態。

  c.定義struct file_operations結構的對象,填充結構體。結構體中功能的順序不能改變,若一些功能沒有實現就用NULL填充,已經實現的功能如read()、write()分別添加到對應的位置。這步實現的是函數的註冊。到這裡驅動程序的主體可以說是寫好了。現在需要把驅動程序嵌入內核。

  d.註冊設備驅動程序,使用register_chrdev註冊字元型設備。函數原型為:

  int register_chrdev(0, "test_name", &test_file_operations)

  函數返回主設備號,若註冊成功返回值大於0。

  第一個參數:主設備號。第二個參數:註冊的設備名。第三個參數:結構體名(設備相關操作方式,驅動程序實際執行操作的函數的指針)。

  這個函數由int init_module(void)函數調用,這個函數在系統啟動時註冊到內核時調用。

  e.在用rmmod卸載模塊時,cleanup_module函數被調用,它釋放字元設備test在系統字元設備表中佔有的表項。

  void cleanup_module(void)

  {

  unregister_chrdev(test_major, "test");

  }

  到這裡test.c基本就編寫完成了。一個簡單的字元設備可以說寫好了。

  4.編譯

  $ gcc -O2 -DMODULE -D__KERNEL__ -c test.o test.c

  得到文件test.o就是一個設備驅動程序。

  如果設備驅動程序有多個文件,把每個文件按上面的命令行編譯,然後

  ld -r file1.o file2.o -o modulename

  驅動程序已經編譯好了,現在把它安裝到系統中去。

  $ insmod -f test.o

  安裝成功在/proc/devices文件中就可以看到設備test,並可以看到主設備號。要卸載運行:

  $ rmmod test

 

  5.創建設備節點

  mkmod /dev/test c major minor

  c是指字元設備,major是主設備號,minor是從設備號,一般可以設置為0

  以上就是linux驅動編寫的基本過程了



[火星人 ] Linux字元設備驅動程序編寫基本流程已經有338次圍觀

http://coctec.com/docs/program/show-post-71598.html