Linux驅動開發之初始化參數,linux驅動開發
先上代碼:
#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/moduleparam.h>static char* whom = "World";static int howmany = 1;module_param( howmany, int, S_IRUGO );module_param( whom, charp, S_IRUGO );static int hello_init(void){ int i; printk( KERN_ALERT "Hello, world! I'm Lizhixing.\n" ); for( i=0; i< howmany; ++i ) { printk( KERN_ALERT "Hello, %s !\n", whom ); } return 0;};static void hello_exit(void){ printk( KERN_ALERT "Good bye, cruel world. Tommorow is another day! \n" );};module_init( hello_init );module_exit( hello_exit );
Linux驅動初始化的時候可以接受參數, 命令如下:
insmod hello.ko howmany=10 whom="Daddy"
這裡傳入2個參數, 分別是 howmany 和 whom.
為了讓module能接收這兩個參數要做的事:
1. 包含標頭檔 moduleparam.h, 這個標頭檔中定義了參數需要的東西.
2. 聲明參數. 支援的幾種類型有:
bool/invbool, 都是boolean, invbool顛倒黑白,將true和false互換,好奇葩的設計,理解不能.....
charp, 就是字串了.
int/long/short/uint/ulong/ushort, 這些都是熟悉的不能再熟的老面孔了.
還有就是能支援Array參數, 然後就這些了. 如果想用其它的類型,就需要用註冊回呼函數的方式自己去處理了.
3. 用module_param( name, type, permission ) 來註冊這個參數,這樣kernel就會用命令列裡的參數將變數賦值.
載入module:
insmod hello.ko howmany=10 whom="Daddy"
dmesg, 有列印了:
33553.819340] Good bye, cruel world. Tommorow is another day! [383720.555138] perf samples too long (2516 > 2500), lowering kernel.perf_event_max_sample_rate to 50000[565169.015155] Hello, world! I'm Lizhixing.[565169.015179] Hello, Daddy[565169.015187] Hello, Daddy[565169.015194] Hello, Daddy[565169.015200] Hello, Daddy[565169.015207] Hello, Daddy[565169.015213] Hello, Daddy[565169.015220] Hello, Daddy[565169.015226] Hello, Daddy[565169.015232] Hello, Daddy[565169.015239] Hello, Daddy[565181.213351] Good bye, cruel world. Tommorow is another day!
學習linux底層驅動開發有什經典的參考書?
結構、作業系統、體繫結構、編譯原理、電腦網路你全修過
我想大概可以分為4個階段,水平從低到高
從安裝使用=>linux常用命令=>linux系統編程=>核心開發閱讀核心源碼
其中學習linux常用命令時就要學會自己編譯核心,最佳化系統,調整參數
安裝和常用命令書太多了,找本稍微詳細點的就ok,其間需要學會Regex
系統編程推薦《進階unix環境編程》,黑話叫APUE
還有《unix網路編程》
這時候大概還需要看資料理解elf檔案格式,連接器和載入器,cmu的一本教材中文名為《深入理解電腦系統》比較好
核心開發閱讀核心源碼階段,從寫驅動入手逐漸深入linux核心開發
參考書如下《linux device drivers》,黑話叫ldd
《linux kernel development》,黑話叫lkd
《understading the linux kernel》,黑話叫utlk
《linux源碼情景分析》
這四本書為搞核心的必讀書籍
最後,第三階段和第四階段最重動手,空言無益,光看書也不罩,不動手那些東西理解不了
學習linux/unix編程方法的建議
建議學習路徑:
首先先學學編輯器,vim, emacs什麼的都行。
然後學make file檔案,只要知道一點就行,這樣就可以準備編程式了。
然後看看《C程式設計語言》K&R,這樣呢,基本上就可以進行一般的編程了,順便找本資料結構的書來看。
如果想學習UNIX/LINUX的編程,《APUE》絕對經典的教材,加深一下功底,學習《UNP》的第二卷。這樣基本上系統方面的就可以掌握了。
然後再看Douglus E. Comer的《用TCP/IP進行網際互連》第一卷,學習一下網路的知識,再看《UNP》的第一卷,不僅學習網路編程,而且對系統編程的一些常用的技巧就很熟悉了,如果繼續網路編程,建議看《TCP/IP進行網際互連》的第三卷,裡面有很多關於應用協議telnet、ftp等協議的編程。
如果想寫裝置驅動程式,首先您的系統編程的介面比如檔案、IPC等必須要熟知了,再學習《LDD》2。
對於幾本經典教材的評價:
《The C Programing Language》K&R 經典的C語言程式設計教材,作者是C語言的發明者,教材內容深入淺出。雖然有點老,但是必備的一本手冊,現在有時候我還常翻翻。篇幅比較小,但是每看一遍,就有一遍的收穫。另外也可用譚浩強的《C語言程式設計》代替。
《Advanced Programing in Unix Envirement》 W.Richard Stevens:也是非常經典的書(廢話,Stevens的書哪有不經典的!),雖然初學者就可以看,但是事實上它是《Unix Network Programing》的一本輔助資料。國內的翻譯的《UNIX環境進階編程》的水平不怎麼樣,現在有影印版,直接讀英文比讀中文來得容易。
《Unix Network Programing》W.Richard Stevens:第一卷講BSD Socket網路編程介面和另外一種網路編程介面的,不過現在一般都用BSD Socket,所以這本書只要看大約一半多就可以了。第二卷沒有設計到網路的東西,主要講進程間通訊和Posix線程。所以看了《APUE》以後,就可以看它了,基本上系統的東西就由《APUE》和《UNP》vol2概括了。看過《UNP》以後,您就會知道系統編程的絕大部分編程技巧,即使卷一是講網路編程的。國內是清華翻譯得《Uni......餘下全文>>
linux驅動程式與linux驅動開發詳解哪本書 講的更詳細 具體 適合剛入門的
紹本書給你看
一本超越K&R的C語戴有煒編程著作《 Linux C編程一站式學習》
本書有以下特點:
• 不是孤立地講C語言,而是和編譯原理、作業系統、電腦體繫結構結合起來講。或者說,本書的內容只是以C語言為載體,真正講的是電腦的原理和程式的原理。
• 強調基本概念和基本原理,在編排順序上非常重視概念之間的依賴關係,每次引入一個新的概念,只依賴於前面章節已經講過的概念,而絕不會依賴後面章節要講的概念。有些地方為了敘述得完整,也會引用後面要講的內容,比如說“有關XX我們到XX章再仔細講解”,凡是這種引用都不是必要的依賴,可以當它不存在,只管繼續往下看就行了。
• 盡量做到每個知識點直到要用的時候才引入。過早引入一個知識點,講完了又不用它,讀者很快就會遺忘,這是不符合認知規律的。