偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一個最簡單的Linux驅動程序的編譯運行

系統(tǒng) Linux
模塊(module)是一段可以被動態(tài)鏈接的目標代碼(.ko),它可由insmod命令動態(tài)的裝載并鏈接到正在運行的內核。鏈接后,它就成了內核的一部分,直到用rmmod命令解除鏈接并卸載。Linux驅動程序就是一種特殊的可裝載內核模塊。

[[207441]]

一、背景知識

可裝載內核模塊:為了使系統(tǒng)功能能夠更靈活的擴充,Linux支持內核的動態(tài)擴展,即在系統(tǒng)運行時給內核增加新的功能(即模塊module)。

模塊:模塊(module)是一段可以被動態(tài)鏈接的目標代碼(.ko),它可由insmod命令動態(tài)的裝載并鏈接到正在運行的內核。鏈接后,它就成了內核的一部分,直到用rmmod命令解除鏈接并卸載。

Linux驅動程序就是一種特殊的可裝載內核模塊。

說明:本代碼在linux2.6以上測試運行通過。linux3.*也可。本人用ubuntu12.04,linux內核版本linux3.5。

二、編譯內核模塊

如何由源碼(.c文件)生成動態(tài)鏈接的目標代碼(即.ko文件)?

首先寫一個最簡單的驅動程序源碼:hello.c

[html] view plain copy

 

  1. #include <linux/init.h> //聲明頭文件 
  2.  
  3. #include <linux/module.h> 
  4.  
  5. //模塊加載函數 
  6.  
  7. static int hello_init(void) 
  8.  
  9.  
  10. printk(KERN_INFO " Hello World enter\n"); //系統(tǒng)調用打印函數,類似于用戶調用的printf 
  11.  
  12. return 0; 
  13.  
  14.  
  15. //模塊卸載函數 
  16.  
  17. static void hello_exit(void) 
  18.  
  19.  
  20. printk(KERN_INFO " Hello World exit\n "); 
  21.  
  22.  
  23. module_init(hello_init); //向系統(tǒng)注冊模塊加載函數 
  24.  
  25. module_exit(hello_exit); //向系統(tǒng)注冊模塊卸載函數 
  26.  
  27. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); //模塊作者等信息聲明,可選 
  28.  
  29. MODULE_LICENSE("Dual BSD/GPL"); //模塊許可證聲明 
  30.  
  31. MODULE_DESCRIPTION("A simple Hello World Module"); //模塊描述聲明,可選 
  32.  
  33. MODULE_ALIAS("a simplest module"); //模塊別名的聲明,可選 

 

將這段程序編譯為hello.ko的步驟:

1、編寫makefile文件

[html] view plain copy

  1. KVERS = $(shell uname -r) #變量KVERS為當前l(fā)inux版本值 
  2.  
  3. obj-m += hello.o 
  4.  
  5. default
  6.  
  7. make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules 

 

-C后面是linux內核源碼樹目錄,M=后面是源碼目錄

2、在終端下輸入 cd /**/**,找到hello.c源碼所在的目錄

 

 

 

 

3、在終端輸入 make命令。

 

 

 

 

4、如圖所示即可生成hello.ko文件。

 

 

 

 

其他文件是生成的一些中間文件。

三、裝載

加載:在終端輸入insmod命令,模塊加載完成。

[[207445]]

 

注意:如果終端沒有打印printk語句,在linux系統(tǒng)日志文件/var/log/syslog中查看。

 

 

 

 

 

卸載:在終端輸入remmod命令。

 

 

 

 

打印信息同在日志文件中。

四、一些理論知識

模塊加載函數:用宏“module_init”指定,它返回整型值。若初始化成功則返回0,若失敗則返回一個負值作為錯誤碼。

模塊卸載函數必須用宏“module_exit”指定,無返回值。

printk用法:

1、printk(KERN_INFO "Hello, world!/n");

2、printk("<6>Hello, world!/n");

***個參數指定輸出級別:分為以下八種:

1、KERN_EMERG 用于緊急消息, 常常是那些崩潰前的消息.

2、KERN_ALERT 需要立刻動作的情形.

3、KERN_CRIT 嚴重情況, 常常與嚴重的硬件或者軟件失效有關.

4、KERN_ERR 用來報告錯誤情況; 設備驅動常常使用 KERN_ERR 來報告硬件故障.

5、KERN_WARNING 有問題的情況的警告, 這些情況自己不會引起系統(tǒng)的嚴重問題.

6、KERN_NOTICE 正常情況, 但是仍然值得注意. 在這個級別一些安全相關的情況會報告.

7、KERN_INFO 信息型消息. 在這個級別, 很多驅動在啟動時打印它們發(fā)現(xiàn)的硬件的信息.

8、KERN_DEBUG 用作調試消息. 

責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2021-11-12 11:28:01

Linux 內核驅動Linux 系統(tǒng)

2011-01-06 16:29:08

linuxtasklet機制

2011-05-19 15:14:49

PostgreSQL

2013-10-31 16:29:10

Linux內核

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2021-05-26 07:53:58

Linux運維Linux系統(tǒng)

2010-01-07 13:27:22

Linux驅動程序

2011-01-10 18:21:38

linux編寫程序

2016-11-08 18:53:08

編譯器

2023-07-25 15:17:38

Linux操作系統(tǒng)開發(fā)

2011-04-22 17:29:37

Linux網卡

2009-12-07 09:39:04

Linux設備驅動硬件通信

2022-05-13 09:14:47

NVidia開源Linux

2009-07-06 18:17:46

JDBC驅動程序

2022-03-08 09:25:52

數據庫系統(tǒng)MongoDB

2012-08-07 11:28:13

卸載linux

2021-12-06 07:47:36

Linux 驅動程序Linux 系統(tǒng)

2021-11-22 08:14:23

Linux Linux驅動Linux 系統(tǒng)

2020-12-21 20:25:24

UbuntuDebian LinuC 程序

2022-05-23 13:17:32

Linux開源NVIDIA
點贊
收藏

51CTO技術棧公眾號