歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux字符設備驅動編寫流程

Linux字符設備驅動編寫流程

日期:2017/3/1 10:06:00   编辑:Linux編程

  驅動程序編寫基本流程:

  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驅動編寫的基本過程了

Copyright © Linux教程網 All Rights Reserved