自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)最簡(jiǎn)單的Linux驅(qū)動(dòng)程序的編譯運(yùn)行

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

[[207441]]

一、背景知識(shí)

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

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

Linux驅(qū)動(dòng)程序就是一種特殊的可裝載內(nèi)核模塊。

說(shuō)明:本代碼在linux2.6以上測(cè)試運(yùn)行通過(guò)。linux3.*也可。本人用ubuntu12.04,linux內(nèi)核版本linux3.5。

二、編譯內(nèi)核模塊

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

首先寫(xiě)一個(gè)最簡(jiǎn)單的驅(qū)動(dòng)程序源碼:hello.c

[html] view plain copy

 

  1. #include <linux/init.h> //聲明頭文件 
  2.  
  3. #include <linux/module.h> 
  4.  
  5. //模塊加載函數(shù) 
  6.  
  7. static int hello_init(void) 
  8.  
  9.  
  10. printk(KERN_INFO " Hello World enter\n"); //系統(tǒng)調(diào)用打印函數(shù),類(lèi)似于用戶調(diào)用的printf 
  11.  
  12. return 0; 
  13.  
  14.  
  15. //模塊卸載函數(shù) 
  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)注冊(cè)模塊加載函數(shù) 
  24.  
  25. module_exit(hello_exit); //向系統(tǒng)注冊(cè)模塊卸載函數(shù) 
  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、編寫(xiě)makefile文件

[html] view plain copy

  1. KVERS = $(shell uname -r) #變量KVERS為當(dāng)前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內(nèi)核源碼樹(shù)目錄,M=后面是源碼目錄

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

 

 

 

 

3、在終端輸入 make命令。

 

 

 

 

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

 

 

 

 

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

三、裝載

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

[[207445]]

 

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

 

 

 

 

 

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

 

 

 

 

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

四、一些理論知識(shí)

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

模塊卸載函數(shù)必須用宏“module_exit”指定,無(wú)返回值。

printk用法:

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

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

***個(gè)參數(shù)指定輸出級(jí)別:分為以下八種:

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

2、KERN_ALERT 需要立刻動(dòng)作的情形.

3、KERN_CRIT 嚴(yán)重情況, 常常與嚴(yán)重的硬件或者軟件失效有關(guān).

4、KERN_ERR 用來(lái)報(bào)告錯(cuò)誤情況; 設(shè)備驅(qū)動(dòng)常常使用 KERN_ERR 來(lái)報(bào)告硬件故障.

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

6、KERN_NOTICE 正常情況, 但是仍然值得注意. 在這個(gè)級(jí)別一些安全相關(guān)的情況會(huì)報(bào)告.

7、KERN_INFO 信息型消息. 在這個(gè)級(jí)別, 很多驅(qū)動(dòng)在啟動(dòng)時(shí)打印它們發(fā)現(xiàn)的硬件的信息.

8、KERN_DEBUG 用作調(diào)試消息. 

責(zé)任編輯:龐桂玉 來(lái)源: 嵌入式Linux中文站
相關(guān)推薦

2021-11-12 11:28:01

Linux 內(nèi)核驅(qū)動(dòng)Linux 系統(tǒng)

2013-10-31 16:29:10

Linux內(nèi)核

2011-05-19 15:14:49

PostgreSQL

2011-01-06 16:29:08

linuxtasklet機(jī)制

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2011-01-10 18:21:38

linux編寫(xiě)程序

2021-05-26 07:53:58

Linux運(yùn)維Linux系統(tǒng)

2010-01-07 13:27:22

Linux驅(qū)動(dòng)程序

2016-11-08 18:53:08

編譯器

2023-07-25 15:17:38

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

2009-12-07 09:39:04

Linux設(shè)備驅(qū)動(dòng)硬件通信

2022-05-13 09:14:47

NVidia開(kāi)源Linux

2011-04-22 17:29:37

Linux網(wǎng)卡

2021-12-06 07:47:36

Linux 驅(qū)動(dòng)程序Linux 系統(tǒng)

2009-07-06 18:17:46

JDBC驅(qū)動(dòng)程序

2009-10-23 10:25:27

驅(qū)動(dòng)程序技巧

2022-03-08 09:25:52

數(shù)據(jù)庫(kù)系統(tǒng)MongoDB

2022-05-23 13:17:32

Linux開(kāi)源NVIDIA

2020-12-21 20:25:24

UbuntuDebian LinuC 程序

2012-08-07 11:28:13

卸載linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)