module_param 在內核編程中的作用

module_param

  在用戶態下編程可以通過main()的來傳遞命令行參數,而編寫一個內核模塊則通過module_param()!

module_param的作用
一.module_param
1.為什么引入
?在用戶態下編程可以通過main()來傳遞命令行參數,而編寫一個內核模塊則可通過module_param()來傳遞命令行參數

內核允許對驅動程序在加載的時候傳遞參數,在編寫內核程序的時候。要在代碼中用宏module_param來指定接受的參數名,而這個宏在<linux/moduleparam.h>中的定義如下
/* Helper functions: type is byte, short, ushort, int, uint, long,
?? ulong, charp, bool or invbool, or XXX if you define param_get_XXX,
?? param_set_XXX and param_check_XXX. */

#define module_param_named(name, value, type, perm)??? ??? ??? ?? \
??? param_check_##type(name, &(value));??? ??? ??? ??? ?? \
??? module_param_call(name, param_set_##type, param_get_##type, &value, perm); \
??? __MODULE_PARM_TYPE(name, #type)

#define module_param(name, type, perm)??? ??? ??? ??? \
??? module_param_named(name, name, type, perm)


由此可知
module_param的實現是通過module_param_named(name, name, type, perm)的。
其中使用了 3 個參數:要傳遞的參數變量名,變量的數據類型,以及訪問參數的權限
測試模塊,源程序hello.c內容如下:
#include <linux/init.h> #include <linux/module.h>
#include <linux/moduleparam.h>????????

MODULE_LICENSE("Dual BSD/GPL");????

static char *who= "world";????????????
static int times = 1;???????
module_param(times,int,S_IRUSR);????
module_param(who,charp,S_IRUSR);??

static int hello_init(void)??????
{
int i;
for(i=0;i<times;i++)
printk(KERN_ALERT "(%d) hello, %s!\n",i,who);
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, %s!\n",who);
}

module_init(hello_init);
module_exit(hello_exit);

編譯生成可執行文件hello

插入:
# insmod hellowho="world"times=5出現5次"hello,world!": #(1)hello,world! #(2)hello,world! #(3)hello,world! # (4)hello,world! #(5)hello,world!
卸載: # rmmodhello出現: #Goodbye,world!

?

驅動程序module的工作流程主要分為四個部分:

1、 insmod module
2、 驅動module的初始化初始化結束后即進入“潛伏”狀態,直到有系統調用
3、 當操作設備時,即有系統調用時,調用驅動module提供的各個服務函數
4、 rmmod module

一、 驅動程序的加載
Linux驅動程序分為兩種形式一種是直接編譯進內核另一種是編譯成module,然后在需要該驅動module時手動加載。

在用insmod加載module時,還可以給提供模塊參數,如:
static char *whom=”world”;
static int howmany=10;
module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);

這樣,當使用insmod scull.ko whom=”string” howmany=20這樣的命令加載驅動時,whom和howmay的值就會傳入scull驅動模塊了。

二、 驅動module的初始化
scull_init_module函數中主要做了以下幾件事情:

a) 分配并注冊主設備號次設備號

int register_chrdev_region(dev_t first, unsigned int count, char *name)
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)

b) 初始化代表設備的struct結構體:scull_dev

c) 初始化互斥體init_MUTEX

d) 初始化在內核中代表設備的cdev結構體,最主要是將該設備與file_operations結構體聯系起來。在Linux內核中,cdev結構體才是真正代表了某個設備。在內核調用設備的open,read等操作之前,必須先分配并注冊一個或者多個cdev結構。

三、設備操作
涉及open ,close ioclt,release等函數

四、卸載
scull_cleanup_module

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254022.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu 備忘

卷組擴容 Linux mint采用默認卷組的安裝方式 sainLinux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev 3.7G 0 3.7G 0% /dev tmpfs 743M 9.5M 733M 2% /run /dev/mapper/mint--vg-root…

DDL DML DCL

2019獨角獸企業重金招聘Python工程師標準>>> DDL is Data Definition Language statements. Some examples:數據定義語言&#xff0c;用于定義和管理 SQL 數據庫中的所有對象的語言 DML is Data Manipulation Language statements. Some examples:數據操作語言&…

學習halcon的論壇與書籍

論壇、培訓 halcon學習網&#xff1a;http://www.ihalcon.com/鳥叔機器視覺&#xff1a;http://bbs.szvbt.com/forum.php 博客 韓兆新的博客園majunfuLife and Codingzhaojun的博客風韻無聲騎螞蟻上高速的博客小馬_xiaoLV2小新識圖程序園-程序員的世界章柯淵的博客 注&…

LINUX內核中的xx_initcall初始化標號

LINUX內核中的xx_initcall初始化標號 田海立CSDN 2011-07-02 LINUX內核中有很多的初始化指示標志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 這些起什么作用呢&#xff1f;查閱源代碼&#xff08;android goldfish-2.6.29&#xff09;…

代碼習慣---打印參數

打印參數很重要。轉載于:https://www.cnblogs.com/Andomly/p/6050773.html

javascript設置和獲取cookie的方法

設置cookie的方法&#xff0c;和獲取cookie的方法例如以下 設置cookie document.cookie"name"value;//獲取cookie當中index是cookie的名稱function getCookie(index){var allcookies document.cookie; var cookie_pos allcookies.indexOf(index);if (cookie_pos !…

favicon.ico--網站標題小圖片二三事

前言: 什么是favicon? 直接用圖說話:這個就是favicon favicon.ico 是一種格式&#xff0c;一般用于網頁地址欄前或者在標簽上以縮略方式顯示網站標志&#xff0c;也可以拖曳favicon到桌面以建立到網站的快捷方式。為什么要設置favicon圖標&#xff0c;以圖像形態顯示&#xff…

鏡頭MTF傳遞函數解讀

什么是鏡頭的MTF曲線&#xff1f;MTF全稱是Modulation Transfer Function&#xff0c;譯為調制傳遞函數&#xff0c;其單位以line/mm來表示。MTF綜合反映了鏡頭的反差和分辨率特性&#xff0c; MTF是用儀器測量的&#xff0c;因而可以完全排除膠片等客觀因素的影響和人工判讀的…

Java的線程模型

并發不一定要依賴多線程&#xff08;如PHP中很常見的多進程并發&#xff09;&#xff0c;但是在Java里面談論并發&#xff0c;大多數都與線程脫不開關系。 線程是比進程更輕量級的調度執行單位&#xff0c;線程的引入&#xff0c;可以把一個進程的資源分配和執行調度分開&#…

BT656/BT601/BT1120協議以及DM365/DM355/DM6467上使用的YUV顏色空間說明

ITU-R BT.601和ITU-RBT.656國際電信聯盟&#xff08;International Telecommunication Union&#xff09;無線通信部門&#xff08;ITU-R&#xff09;制定的標準。嚴格來說&#xff0c;ITU-R BT.656應該是隸屬ITU-R BT.601的一個子協議。ITU-R BT.601是演播室數字電視編碼參數標…

eclispe設置workspace text file encoding

在windows下開發&#xff0c;經常會遇到eclipse新導入的工程 java代碼中的注釋或者字符串中文顯示亂碼&#xff0c;每次都要一個個項目更改麻煩&#xff0c;特地找了下&#xff0c;可通過如下方法一次性設置。 轉載于:https://www.cnblogs.com/zhjh256/p/7190537.html

工業定焦鏡頭的選型公式

工業鏡頭的焦距(f mm)可以根據FOV(視場), WD(工作距離) 和CCD芯片尺寸計算出來:FOV視場指被攝取物體的大小&#xff0c;視場的大小是以鏡頭至被攝取物體距離(WD)&#xff0c;鏡頭焦距(F)及CCD芯片尺寸確定的。鏡頭的焦距&#xff0c;視場大小、工作距離、光學倍率計算如下:焦距…

Nginx系列二:(Nginx Rewrite 規則、Nginx 防盜鏈、Nginx 動靜分離、Nginx+keepalived 實現高可用)...

一、Nginx Rewrite 規則 1. Nginx rewrite規則 Rewrite規則含義就是某個URL重寫成特定的URL&#xff08;類似于Redirect&#xff09;&#xff0c;從某種意義上說為了美觀或者對搜索引擎友好&#xff0c;提高收錄量及排名等。 語法&#xff1a; rewrite<regex><replace…

受限玻爾茲曼機(RBM)以及對比散度(CD)

1. RBM 的提出 BM 的缺點&#xff1a; 計算時間漫長&#xff0c;尤其是無約束自由迭代的負向階段&#xff1b;對抽樣噪音敏感&#xff1b;流行軟件的不支持&#xff1b;受限玻爾茲曼機&#xff08;Restricted Boltzmann Machine,簡稱 RBM&#xff0c;以解決 BM 的學習效率過慢的…

嵌入式系統中看門狗概述。。。

一直以來對于嵌入式中的watch dog&#xff08;看門狗&#xff09;都比較陌生&#xff0c;一直都不知道它到底是做什么的&#xff0c;單從名字上看也不知其所以然&#xff0c;然后就在網上找到了一篇blog&#xff0c;就是再說看門狗的作用和概述&#xff0c;原文如下&#xff1a…

MySQL中的運算符

算術運算符 MySQL 支持常見的五種算術運算&#xff1a;, -, *, /(同 DIV 函數), %(同 MOD 函數)&#xff0c;即加減乘除和取余。&#xff08;被除數為 0則結果為 NULL&#xff09; 比較運算符 當使用 SELECT 語句進行查詢時&#xff0c;MySQL 允許用戶對表達式的左邊操作數和右…

Qt中查看ui_xxx.h文件方法

前提 1、Qt當有界面 2、構造完成 滿足以上兩個條件qt會生成ui_xxx.h文件。 如何查看 方法1 在cpp文件中找到UI下的一個對象 如&#xff1a; ui->textEdit Ui::QWDialog按住Ctrl鍵&#xff0c;使用鼠標左鍵點擊UI下的一個對象&#xff0c;如&#xff1a;textEdit、QWDia…

springCloud Finchley 實戰入門(基于springBoot 2.0.3)【三 Eureka-高可用服務注冊中心】...

Eureka高可用注冊中心 Eureka Server的設計一開始就考慮到了高可用的問題&#xff0c;在eureka服務治理設計中&#xff0c;所有的節點即是是服務提供方&#xff0c;也是服務消費方。 在部署高可用注冊中心前我們先需要準備一下&#xff0c;本地環境。因為我們實例是在單臺電腦上…

Spring 讀取配置文件(二)

Spring 讀取配置文件并調用 bean package cn.com.test.receive;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class…

DaVinci的Buffer_Handle和BufTab Cmem函數調用

DaVinci的dvsdk里面&#xff0c;所有的內存用的都是CMEM&#xff0c;而比較上層的一個封裝就是BufTab和Buffer_Handle了 每個Tab可以控制好多塊內存塊。 具體到內存塊有兩種&#xff0c;一種是創建的時候指定他的大小啊&#xff0c;物理地址啥的。另外一種就是僅僅創建出這個 …