<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    歡迎光臨! 
    閑聊 QQ:1074961813

    隨筆分類(357)

    我管理的群

    公共blog

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

    參與管理的論壇

    好友的blog

    我的其他blog

    朋友的網站

    搜索

    •  

    最新評論

     Money很重要

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

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


    #include<linux/module.h>//
    構建模塊需要一些數據結構和一些函數,這些函數包括下面這兩個

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

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

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

    功能說明:載入模塊。

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

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

    參  數:

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

    -k  將模塊設置為自動卸除。

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

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

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

    -s  將所有信息記錄在系統記錄文件中。

    -v  執行時顯示詳細的信息。

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

    -X  匯出模塊所有的外部符號,此為預設置。

    前面文章中已經給了一個復雜的驅動例子,下面再給出一個空殼驅動程序給大家玩下 . .!~~~ 一個最簡單的模塊代碼(這個代碼不知道有沒有問題,時間關系,我并沒真正安裝,如果您按照我的說法安裝出現問題,請留言?。?/span>

    #include<linux/init.h> /*module_init、module_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);

    創建一個叫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 #卸載模塊,運行后打?。?/span>Goodbye, Kernel World

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

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

    運行情況如下:



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



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

    代碼下載



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

    FeedBack:
    # re: 如何編寫Linux 驅動程序(五) 2010-01-14 20:58 小牛
    寫的很好,學習ing  回復  更多評論
      
    主站蜘蛛池模板: 久久久久噜噜噜亚洲熟女综合| 亚洲AV无码一区二区三区网址| 四虎亚洲国产成人久久精品 | 四虎影视精品永久免费网站| 99久久免费精品视频| 精品熟女少妇aⅴ免费久久| 亚洲AV无码国产精品永久一区| 亚洲精品视频免费在线观看| 狠狠色伊人亚洲综合成人| 亚洲精品美女久久久久99小说| 在线观看免费成人| 免费精品国产自产拍在| 最近免费中文字幕高清大全 | 国产在线播放免费| 999久久久免费精品国产| 国色精品va在线观看免费视频 | 国产精品另类激情久久久免费| 免费人成在线观看69式小视频| 久久成人无码国产免费播放| 黄桃AV无码免费一区二区三区| 香港经典a毛片免费观看看| 亚洲一区二区三区国产精华液| 亚洲国产亚洲片在线观看播放| 亚洲久本草在线中文字幕| 久久噜噜噜久久亚洲va久| 国产精品亚洲片在线| 国产亚洲高清不卡在线观看| 精品国产人成亚洲区| 红杏亚洲影院一区二区三区| 亚洲午夜爱爱香蕉片| 亚洲中文字幕久久精品无码APP| 亚洲一区精品伊人久久伊人| 亚洲精品无码AV中文字幕电影网站| 四虎影在线永久免费观看| 免费国产成人午夜私人影视 | 国产精品亚洲va在线观看| 亚洲av无码无线在线观看| 亚洲av综合日韩| 搜日本一区二区三区免费高清视频| 无遮挡国产高潮视频免费观看| 国产va免费精品|