隨筆 - 303  文章 - 883  trackbacks - 0
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網(wǎng)站

          搜索

          •  

          最新評論

           Money很重要

          前面我們已經(jīng)對驅(qū)動程序的結(jié)構(gòu)有了一個初步的認識,我們知道,不管是devfs還是udev設(shè)備管理方式,都有自己的一套使用方法,很好的掌握理解和這些方法是十分有必要的,對于一個男人而言長相、才學(xué)、擅長交際很重要,如果再加上錢,那簡直就是絕世的了。生活是里不開錢的,所以錢很重要。這個世界就是怎么現(xiàn)實,握了理論還能做出來,常有人說:“老板不看過程,只看結(jié)果”。于是這里討論如何編譯和安裝模塊,還有如何很好的完成一個Makefile。這正是很多人看來過不了的技術(shù)門檻,今天就來個鯉魚跳龍門吧!希望你看完后會說:“草你,這有難度嗎?”對于驅(qū)動編寫過程中的基礎(chǔ)技術(shù)細節(jié),下個文我們會討論的,大家先看看書吧!寫這個文章的時候,linux最新版本是2.6.25,這里以這個版本做為基礎(chǔ)做討論。

          模塊:一種可以動態(tài)裝載到內(nèi)核的二進制塊,他在被裝載的時候會檢測硬件設(shè)備是否正常,并做初始化工作;卸載時會釋放被它占有的硬件資源。驅(qū)動程序中我,我們用:


          #include<linux/module.h>//
          構(gòu)建模塊需要一些數(shù)據(jù)結(jié)構(gòu)和一些函數(shù),這些函數(shù)包括下面這兩個

          module_init(sn9c102_module_init);//模塊初始化時候被用到

          module_exit(sn9c102_module_exit); //卸載模塊時候被用到

          這些信息是必要的,它們向內(nèi)核聲明這個程序是一個模~~~~。在devfs下,我們可以用#insmod命令來裝載他們。

          功能說明:載入模塊。

          語  法:insmod [-fkmpsvxX][-o <模塊名稱>][模塊文件][符號名稱 = 符號值]

          補充說明:Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較為精簡,進而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設(shè)備驅(qū)動程序。

          參  數(shù):

          -f  不檢查目前kernel版本與模塊編譯時的kernel版本是否一致,強制將模塊載入。

          -k  將模塊設(shè)置為自動卸除。

          -m  輸出模塊的載入信息。

          -o<模塊名稱>  指定模塊的名稱,可使用模塊文件的文件名。

          -p  測試模塊是否能正確地載入kernel。

          -s  將所有信息記錄在系統(tǒng)記錄文件中。

          -v  執(zhí)行時顯示詳細的信息。

          -x  不要匯出模塊的外部符號。

          -X  匯出模塊所有的外部符號,此為預(yù)設(shè)置。

          前面文章中已經(jīng)給了一個復(fù)雜的驅(qū)動例子,下面再給出一個空殼驅(qū)動程序給大家玩下 . .!~~~ 一個最簡單的模塊代碼(這個代碼不知道有沒有問題,時間關(guān)系,我并沒真正安裝,如果您按照我的說法安裝出現(xiàn)問題,請留言!):

          #include<linux/init.h> /*module_initmodule_exit*/
          #include<linux/module.h> /*寫模塊必須的*/

          #include <linux/kernel.h> /* printk*/
          MODULE_LICENSE("GPL");

          static int __init hello_init(void)

          {

              printk(KERN_ALERT " Hello, Kernel World "n");

              return 0;

          }

          static void __exit hello_exit(void)

          {

              printk(KERN_ALERT "Goodbye, Kernel World"n");

          }

          module_init(hello_init);

          module_exit(hello_exit);

          創(chuàng)建一個叫Makefile的文件(無后綴),寫入:

          obj-m := hello.o #***.o

          KERNELDIR := /lib/modules/$(shell uname -r)/build

          default:      #編譯模塊
                 make -C $(KERNELDIR) M=$(shell pwd) modules   #前面輸入tab

          install:        #安裝模塊

                 insmod hello.ko #***.ko

          uninstall:      #卸載模塊

                 rmmod hello

          clean:        #清除留文件,以重新編譯

                 make -C $(KERNELDIR) M=$(shell pwd) clean

                 rm -f Module.symvers

          將Makefile及模塊代碼放到同個目錄下,在命令行下cd到該目錄下,以root身份登陸,
          在字符界面下,使用命令:

          #make  #編譯模塊

          #make install  #安裝模塊,運行后打印:Hello, Kernel World

          #make uninstall #卸載模塊,運行后打印:Goodbye, Kernel World

          #make clean   #刪除KERNELDIR目錄下所有編譯生成的文件

          在圖形界面下,輸出信息不在終端顯示,而是保存在文件/var/log/messages
          (按“CTRL + ALT + F5
          換到控制臺模式,可看到輸出。
          ALT + F7可以切換回圖形界面)。

          運行情況如下:



          若Makefile中的obj-m := hello.o 寫成obj-m := hello.ko ,將出現(xiàn)如下錯誤:



          還有一點需要注意:模塊在安裝之后卸載掉才能再次安裝,否則會出錯。

          代碼下載



          地震讓大伙知道:居安思危,才是生存之道。
          posted on 2008-05-20 13:37 小尋 閱讀(5016) 評論(1)  編輯  收藏 所屬分類: kernel

          FeedBack:
          # re: 如何編寫Linux 驅(qū)動程序(五) 2010-01-14 20:58 小牛
          寫的很好,學(xué)習(xí)ing  回復(fù)  更多評論
            
          主站蜘蛛池模板: 嘉禾县| 陆河县| 万载县| 青阳县| 阳曲县| 崇左市| 黄石市| 化州市| 阜平县| 兰坪| 望江县| 丰城市| 利辛县| 镇坪县| 蒙山县| 余干县| 嘉善县| 财经| 洛扎县| 舞钢市| 宁国市| 青龙| 竹山县| 岢岚县| 德阳市| 星座| 漳平市| 玉溪市| 阿鲁科尔沁旗| 招远市| 富源县| 柏乡县| 当雄县| 峨边| 栖霞市| 仁化县| 西充县| 仙桃市| 海丰县| 郯城县| 玉林市|