欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Linux設(shè)備驅(qū)動開發(fā)環(huán)境的搭建

系統(tǒng) 1927 0

剛接觸Linux設(shè)備驅(qū)動時,初學(xué)者往往連如何編譯驅(qū)動程序都不懂,更別說編譯進(jìn)內(nèi)核或加載測試了。一般都是在網(wǎng)上找個最簡單的 helloworld驅(qū)動程序,然后嚴(yán)格按照網(wǎng)上所說的步驟編譯,結(jié)果卻得到一大堆見都沒見過的錯誤,更不要說根據(jù)錯誤信息來解決問題了,很多人到這里就 不知道如何往下進(jìn)行了。十幾天前我也卡在這里很長時間,現(xiàn)在知道所以然了就記下來,些許對一些同道者有幫助。

一個基本的Linux設(shè)備驅(qū)動開發(fā)環(huán)境由宿主機(jī)和目標(biāo)機(jī)組成,宿主機(jī)就是用來做驅(qū)動開發(fā)工作的主機(jī),目標(biāo)機(jī)就是用來運(yùn)行和測試設(shè)備驅(qū)動的主機(jī),在宿 主機(jī)上需要有開發(fā)工具(gcc,gdb,make等)和linux源碼(版本要對應(yīng)目標(biāo)機(jī)上的linux內(nèi)核),而目標(biāo)機(jī)上只要運(yùn)行l(wèi)inux即可。由于 步驟有所不同,下面分為普通Linux設(shè)備驅(qū)動開發(fā)和嵌入式Linux設(shè)別驅(qū)動開發(fā)兩種情況來講述環(huán)境的搭建和驅(qū)動程序的編譯:

(一)普通Linux設(shè)備驅(qū)動開發(fā)

普通Linux主要是區(qū)分于嵌入式Linux(一般指uClinux),在這種開發(fā)中宿主機(jī)和目標(biāo)機(jī)可以是一臺主機(jī),即在本機(jī)上開發(fā)編譯然后在本機(jī) 上加載運(yùn)行(Linux設(shè)備驅(qū)動也可以直接編譯進(jìn)內(nèi)核,但為了開發(fā)工作方便,一般采用動態(tài)加載的方式),當(dāng)然也可以是兩臺主機(jī),如果是兩臺主機(jī)的話,要保 證宿主機(jī)上的linux源碼的版本號與目標(biāo)機(jī)中的linux內(nèi)核版本一致。普通Linux設(shè)備驅(qū)動開發(fā)的步驟如下:

  1. 在宿主機(jī)上安裝開發(fā)工具和下載linux源碼(要求版本號和目標(biāo)機(jī)上的linux內(nèi)核版本一致)。開發(fā)工具主要有g(shù)cc、gdb、make等,這些工具在redhat或fc中默認(rèn)就安裝了,在debian或Ubuntu中可以通過下面這個命令安裝:
    apt-get install build-essential
    linux源碼可以通過以下幾種途徑獲得:
    • 直接去www.kernel.org下載
    • 通過包管理工具下載源碼,在debian和Ubuntu中可以通過下面這個命令下載,
      apt-get install linux-source-(版本號) ,下載后的文件在/usr/src目錄中,解壓到該目錄即可

    將源碼解壓到/usr/src/目錄后,進(jìn)入linux-source-(版本號)目錄中執(zhí)行下面幾個命令:
    make oldconfig
    make prepare
    make scripts

  2. 編寫Linux驅(qū)動程序,以一個最簡單的hello.c為例,hello.c的內(nèi)容如下:
            
              
    #include "linux/init.h"
    #include "linux/module.h"

    static int hello_init(void)
    {
    printk(KERN_ALERT "Hello World linux_driver_module/n");
    return 0;
    }

    static void hello_exit(void)
    {
    printk(KERN_ALERT "Goodbey linux_driver_module/n");
    }

    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("lpj");
  3. 寫Makefile文件,一個示例如下,里面各項參數(shù)根據(jù)實(shí)際情況更改:
            
              
    #sample driver module
    obj-m := hello.o
    KDIR = /usr/src/linux-source-2.6.24/

    all:
    $(MAKE) -C $(KDIR) M=$(PWD)

    .PHONY:clean
    clean:
    rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
  4. 編譯,在hello.c和Makefile所在目錄下執(zhí)行 make 即可,編譯后在當(dāng)前目錄生成hello.ko文件
  5. 加載并測試:加載使用insmod或modprobe命令來實(shí)現(xiàn),如在當(dāng)前路徑執(zhí)行如下代碼:
    insmod hello.ko 或 modprobe hello
    注意,如果在虛擬終端加載內(nèi)核的話,將看不到內(nèi)核打印信息,因?yàn)閮?nèi)核打印信息不會輸出到虛擬終端,而是輸出到/proc/kmsg文件中,所以可以通過以下方式查看內(nèi)核信息:
    • cat /proc/kmsg 會一直打印,需要Ctrl-C手動終止
    • dmesg 或 dmesg | tail -N ,N為一數(shù)字,表示顯示最后N行
  6. 卸載:使用rmmod命令卸載驅(qū)動模塊,如 rmmod hello

(二)嵌入式Linux設(shè)備驅(qū)動開發(fā)

這種開發(fā)中一般目標(biāo)機(jī)為帶有嵌入式處理器的開發(fā)板,而宿主機(jī)為PC,開發(fā)環(huán)境需要在宿主機(jī)上搭建,嵌入式Linux設(shè)備驅(qū)動開發(fā)的步驟如下:

  1. 在宿主機(jī)上下載嵌入式Linux的源碼,并安裝嵌入式Linux開發(fā)工具(針對于不同的嵌入式處理器,工具也有所不同,如對應(yīng)于Arm的arm-gcc系列,針對nios2處理器的nios2-cc系列)
  2. 編寫Linux設(shè)備驅(qū)動驅(qū)動程序,還以上面給出的hello.c為例,將該文件復(fù)制到(linux 源碼目錄)/drivers/(目標(biāo)文件夾)/中
  3. 在(目標(biāo)文件夾)中創(chuàng)建Makefile和Kconfig(菜單配置文件),內(nèi)容分別如下:

    #makefile
    obj-$(CONFIG_HELLODRV) += hello.o
            
              
    #Kconfig
    menu USER_DEVICE_DRIVERS
    config HELLODRV
    tristate "Hello"
    ---help---
    This is a sample driver programme.
    endmenu

    注意,如果Kconfig文件中的"tristate"寫成"bool",則該模塊只能選為Y(編譯進(jìn)內(nèi)核)或N(不選擇),不能選為M(編譯為模塊,可動態(tài)加載)

  4. 修改上層目錄( linux內(nèi)核源碼目錄/drivers/)中的Makefile和Kconfig文件,Makefile中加入如下語句:

    #makefile
    obj-y += (目標(biāo)文件夾)

    (此處有多種寫法,這只是其中一種)
    Kconfig中加入如下語句:

    #Kconfig
    source "drivers/(目標(biāo)文件夾)/Kconfig"
  5. 編譯內(nèi)核:幾個基本的命令及選擇界面如下:
    make menuconfig 執(zhí)行到這一步后
    其中Vendor/Product...是選擇處理器廠家和型號的,Kernel/Library...是配置應(yīng)用程序的,按空格鍵或回車鍵可以進(jìn)入選項進(jìn)行配置,用上下鍵移動到Kernel/Library...菜單上
    在該界面有兩個Customize...選項,第一個是選擇自定義配置內(nèi)核,第二個是選擇自定義配置應(yīng)用程序,按空格鍵可以選擇這些選項,選擇后按 exit鍵退出,選擇是否保存的時候選擇“yes“,如果選擇了第一個Customize...,則退出后會自動進(jìn)入內(nèi)核配置界面
    該界面有很多選項,這里不細(xì)講,我們要配置驅(qū)動模塊,就用上下鍵移動到Device Drivers上,然后按回車或空格鍵進(jìn)入,設(shè)備驅(qū)動配置界面如下圖:

    這里就是linux-2.X/drivers/Kconfig里的內(nèi)容了,下面那個綠色的V(+)表示這一頁沒顯示完,可以用下鍵繼續(xù)往下瀏覽,找到我們自己的菜單名,然后按回車或空格進(jìn)入
    用M鍵使選項前的尖括號里顯示M表示該模塊要動態(tài)加載,也可以按y鍵選擇直接編輯進(jìn)內(nèi)核,選擇完后exit退出,選擇yes或no的對話框通一選yes。
    make romfs #第一次編譯內(nèi)核前一定要有該步驟
    make
  6. 加載測試:將生成的zImage文件下載到開發(fā)板,開發(fā)板上的嵌入式Linux啟動后可以用insmod或modprobe加載驅(qū)動模塊,測試完畢后可以通過rmmod命令卸載驅(qū)動模塊

Linux設(shè)備驅(qū)動開發(fā)環(huán)境的搭建


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: a视频在线观看 | 1级毛片 | 日韩精品中文字幕久久 | 日韩在线观看一区二区不卡视频 | 亚洲综合在线网 | 97精品超碰一区二区三区 | 中国一级特黄真人毛片 | 国精品日韩欧美一区二区三区 | 日日操视频 | 国产三级做爰在线观看视频 | 午夜精品久久久久久久久久久久久 | 亚洲成人另类 | 欧美成视频在线观看 | 日本午夜免费无码片三汲大片 | 久久一本精品 | 久久人 | 国产成人精品在线观看 | 操操操操网 | 日韩一区二区三区在线播放 | 富二代精品视频 | 午夜精品久久久久久久99黑人 | 夜夜艹| a毛片免费 | 中国一级毛片在线视频 | 极品美女一区二区三区视频 | 性久久久久久久久波多野结衣 | 夭天曰天天躁天天摸在线观看 | 久久精品小视频 | 亚洲youjizz| 欧美日韩亚洲视频 | 欧美精品一区二区在线观看 | 亚洲免费三区 | 好吊在线 | 热灸灸这里只有精品 | 精品国产乱码久久久久久丨区2区 | 日韩精品一区二区三区在线观看 | 国产精品高清在线 | 欧美中文字幕在线播放 | 欧美一区二区三区精品 | 日韩一区二区三区视频 | 日本黄色小视频在线观看 |