最近學(xué)院里的nfc老師要我們做個(gè)設(shè)備驅(qū)動(dòng),之前從沒接手過這個(gè)東西,,加上老師給的材料錯(cuò)誤也是一大堆,搞了差不多一個(gè)星期才搞出來,。特此寫一個(gè)博客,,以免后來人和我一樣跳坑。 總體考慮 要去寫設(shè)備驅(qū)動(dòng)程序,說白了就三大步驟:下載內(nèi)核源碼構(gòu)建內(nèi)核源碼樹(也就是下載你的目的內(nèi)核源碼包并解壓就行了),、編譯內(nèi)核(這樣才能讓操作系統(tǒng)感知自己寫的驅(qū)動(dòng)程序),、寫代碼(編寫內(nèi)核程序并編譯測(cè)試)。這三步哪一步都很艱難,。 我是在自己筆記本上用虛擬機(jī)VMware裝的ubuntu操作系統(tǒng),,相比于裝雙系統(tǒng)有一大缺點(diǎn)和一大優(yōu)點(diǎn),優(yōu)點(diǎn)是將編譯好的新內(nèi)核裝入操作系統(tǒng)時(shí)不用擔(dān)心系統(tǒng)崩潰,,缺點(diǎn)是裝虛擬機(jī)的時(shí)候沒考慮周全,,搞得虛擬機(jī)的硬盤太小了,估計(jì)容量不夠用,。 那么綜合考慮之后,,對(duì)于我來說是四大步驟:1、給虛擬機(jī)擴(kuò)容,;2,、下載內(nèi)核源碼構(gòu)建內(nèi)核源碼樹;3,、編譯內(nèi)核,;4、寫代碼,。 下面來一一介紹: 1,、虛擬機(jī)擴(kuò)容 (1)虛擬機(jī)邏輯擴(kuò)盤。僅僅在這一步擴(kuò)盤是完全不夠的,!還要在虛擬機(jī)內(nèi)部設(shè)置掛載,,不然的話虛擬機(jī)無法感知到你擴(kuò)展的硬盤。這相當(dāng)于你給一臺(tái)實(shí)際的臺(tái)式電腦加了一塊新硬盤后,,還要在操作系統(tǒng)內(nèi)進(jìn)行設(shè)置,。我在這里是擴(kuò)成80GB。
(2)在終端使用命令 sudo apt-get install Gparted 下載Gparted部件,。 (3)打開Gparted: (4)打開Gparted應(yīng)用,,你可以看到已分配分區(qū)狀況和新增未分配的分區(qū) : (5)然后依次刪除/dev/sda5和/dev/sda2,刪除后,,就會(huì)剩下/dev/sda1(14GB)和未分配的(15GB),,不然的話你怎么都無法將unallocated部分掛載。 (6)接下來重新調(diào)整/dev/sda1的大小,,我這里調(diào)整為75529MiB(73.76GB),,然后剩下6.24GB作為linux_swap,重新將未分配的6.24GB格式化,,先new出一個(gè)extended的分區(qū),,然后再在這個(gè)extended的分區(qū)里new一個(gè)邏輯分區(qū),并且file system選擇為linux-swap,最后選擇綠色的鉤鉤,,完成保存,。最后執(zhí)行完后,如下圖所示: (7)這樣我就把虛擬機(jī)的硬盤擴(kuò)成了80GB,,編譯內(nèi)核源碼絕對(duì)是綽綽有余的了,。 (注:本小節(jié)參考了博客:http://blog.csdn.net/Timsley/article/details/50742755) 2、構(gòu)建內(nèi)核源碼樹 (1)我的虛擬機(jī)的操作系統(tǒng)是ubuntu16.04,。我是在這里下載的源碼包:https://www./pub/linux/kernel/v4.x/,,我下載的源碼包是linux-4.10.14.tar.xz 附:大家千萬不要在非www.開頭的網(wǎng)站上隨意下載內(nèi)核源碼! (2)下載完之后解壓即可:
3,、編譯內(nèi)核 (1)安裝基本的工具軟件,。 逐次在終端執(zhí)行以下四條命令: sudo apt-get install libncurses5-dev libssl-dev sudo apt-get install build-essential openssl sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11 (2)在終端進(jìn)入你的解壓的內(nèi)核源碼的目錄,比如我內(nèi)核源碼解壓后在home/expr/expr4/linux-4.10.14,,那么進(jìn)入終端后就是: (3)依次執(zhí)行以下三條命令: sudo make mrproper sudo make clean sudo make menuconfig 其中mrproper為清除編譯過程中產(chǎn)生的所有中間文件,,clean為清除上一次產(chǎn)生的編譯中間文件,在menuconfig中出現(xiàn)選擇的圖形化界面后,直接按右方向鍵選擇到exit退出,,退出提示中選擇保存,,實(shí)現(xiàn)內(nèi)核的默認(rèn)配置。 (4)執(zhí)行命令: sudo make –j8 因?yàn)槲业墓P記本cpu是i7四核八線程,,所以我直接用8個(gè)線程并行編譯,,這樣編譯速度就是普通的make命令的8倍。最近雙一流建設(shè)學(xué)校發(fā)了財(cái)換了一大批新電腦,,所以在我學(xué)校的高性能計(jì)算實(shí)驗(yàn)室編譯內(nèi)核,,因?yàn)樘幚砥魇切沦I的intel core i7 6700k,8線程編譯的話20分鐘就搞定了,,普通筆記本應(yīng)該要1~2小時(shí),。 下面放一波編譯的時(shí)候截的圖: 正在編譯內(nèi)核 編譯的時(shí)候監(jiān)測(cè)筆記本狀態(tài),怕內(nèi)存泄漏 (5)依次執(zhí)行命令: sudo make modules_install //安裝內(nèi)核模塊 sudo make install //安裝內(nèi)核 下面放一波編譯的時(shí)候截的圖:
正在執(zhí)行sudo make modules_install 正在執(zhí)行sudo make modules_install 正在執(zhí)行sudo make install 新內(nèi)核成功嵌入操作系統(tǒng) (6)重新啟動(dòng)系統(tǒng),,如果是虛擬機(jī)的話記得重啟進(jìn)入BIOS界面之前一定要點(diǎn)擊鼠標(biāo)進(jìn)入虛擬機(jī)的界面實(shí)現(xiàn)鍵盤捕獲。在重啟開機(jī)界面按住shift鍵不放手,,選擇高級(jí)選項(xiàng),,進(jìn)入內(nèi)核選擇加載界面,選擇自己編譯的內(nèi)核的正常模式:
進(jìn)入內(nèi)核選擇模式,,選擇自己編譯的內(nèi)核:
(7)至此,,工作完成了50%。隨著操作系統(tǒng)的啟動(dòng),,我新編譯的內(nèi)核也正式誕生了,! (注:本小節(jié)參考了博客:http://blog.csdn.net/Xiaobai__Lee/article/details/72048829) 4、寫自己的設(shè)備驅(qū)動(dòng)程序 (1)寫在前面: 在編程的時(shí)候,不要輕易復(fù)制任何網(wǎng)站的代碼,,99.99%都是跑不通的,。Makefile文件尤其不要隨便在網(wǎng)上下載,因?yàn)檫@個(gè)東西對(duì)格式要求非常高,,新手隨便在網(wǎng)上下的Makefile文件也是99.99%都是跑不通,。要跑通,有兩個(gè)關(guān)鍵:1,、認(rèn)真分析每一條源代碼,;2、有問題,,多去搜一下看看,。 (2)我在ubuntu下編寫的代碼如下: 源代碼材料包托管在github上:https://wnm1503303791./interesting-work/blog/code.zip 有需要的朋友自取 (3)要在內(nèi)核態(tài)下編譯我們寫好的設(shè)備驅(qū)動(dòng)程序源碼,必須使用Makefile文件,。 Makefile文件內(nèi)容截圖,,每個(gè)關(guān)鍵字都出現(xiàn)彩色的時(shí)候說明基本上沒寫錯(cuò) (4)在終端下進(jìn)入設(shè)備驅(qū)動(dòng)程序源碼所在的文件夾,例如,,我的源碼放在home/expr/expr4/expr4/code/,,那么就是這樣:
(5)輸入make命令,之后在文件夾下直接生成.ko文件:
(6)繼續(xù)在終端下輸入命令:sudo insmod globalmem.ko將剛剛生成的globalmem.ko文件加載進(jìn)入內(nèi)核,。 (7)用命令lsmod查看是否加載成功,,如果成功就是這樣:
可以看到第一個(gè)module就是我剛剛生成的globalmem。 (8)到這里工作完成了85%,??梢韵炔患敝憸y(cè)試程序,可以先用原語測(cè)試一下驅(qū)動(dòng),,因?yàn)槲业倪@個(gè)驅(qū)動(dòng)是處理字符的驅(qū)動(dòng)程序,,所以我是這樣測(cè)試的:
也就是進(jìn)入root模式后用原語將字符串“tz”送入驅(qū)動(dòng),驅(qū)動(dòng)就會(huì)輸出“tz”,。 (9)現(xiàn)在就可以踏踏實(shí)實(shí)地去寫測(cè)試程序了:
(10)編譯這個(gè)C程序,,并運(yùn)行:
測(cè)試程序運(yùn)行正常,表明設(shè)備驅(qū)動(dòng)運(yùn)行正常,。 至此,,我的教程就結(jié)束了。有疑問的朋友可以直接在評(píng)論區(qū)留言,,非常希望和各位朋友一起討論,! TZ@華中農(nóng)業(yè)大學(xué)信息學(xué)院高性能計(jì)算實(shí)驗(yàn)室 2017/12/12夜 Last updated @ 2020/6/21 |
|