最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文講解字符設(shè)備驅(qū)動(dòng)基礎(chǔ)——讀寫接口的操作實(shí)踐

2022-08-18 17:59 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

一、細(xì)節(jié)提要

1、與用戶與內(nèi)核數(shù)據(jù)交換有關(guān)的函數(shù) (1)copy_from_user()函數(shù)

該將數(shù)據(jù)從用戶空間復(fù)制到內(nèi)核空間。

如果成功復(fù)制則返回0,如果不成功復(fù)制則返回尚未成功復(fù)制的剩下的字節(jié)數(shù)。

(2)copy_to_user()函數(shù)

將數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間。

(3)復(fù)制機(jī)制與使用mmap的對比

復(fù)制時(shí),內(nèi)核空間和用戶空間的地址不一樣,效率低。

2、代碼邏輯圖



二、代碼示例

1、代碼編寫

在ubuntu的/home/xjh/iot/embedded_basic/rootfs/tmp中編寫代碼:app.c與module_test.c。

2、代碼編譯

(1)編譯驅(qū)動(dòng)源代碼

利用同目錄下的Makefile文件編譯module_test.c,得到module_test.ko驅(qū)動(dòng)文件。

(2)編譯應(yīng)用層程序

怎樣編譯app.c?使用ubuntu的gcc還是交叉編譯工具鏈?或者和驅(qū)動(dòng)源代碼一樣的操作(這個(gè)如何完成編譯的)?

因?yàn)榇藨?yīng)用層程序要在開發(fā)板運(yùn)行,因此需要使用交叉編譯工具鏈中的gcc來編譯,而不是 ubuntu 中的gcc。

在已經(jīng)正確安裝了交叉編譯工具鏈的ubuntu系統(tǒng)中,使用如下命令編譯app.c得到app.exe。



因?yàn)橹皩?shí)驗(yàn)中已經(jīng)將ubuntu的/home/xjh/iot/embedded_basic/rootfs/tmp掛載到開發(fā)板/mnt目錄,所以開發(fā)板完全啟動(dòng)后,可以在/mnt目錄中看到剛才編譯的文件。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??

3、代碼測試

可以直接在開發(fā)板的/mnt目錄下進(jìn)行測試。

(1)裝載測試

裝載后查看/proc/devices,是否有驅(qū)動(dòng)源碼中所寫的驅(qū)動(dòng)名字、自動(dòng)分配的主設(shè)備號。

(2)創(chuàng)建設(shè)備文件

(3)操作設(shè)備文件

運(yùn)行應(yīng)用層程序app.exe,觀察運(yùn)行效果。

說明

1)Linux系統(tǒng)字符編碼默認(rèn)是UTF-8格式的,如果SecureCRT沒有設(shè)置成UTF-8格式,中文顯示會出現(xiàn)亂碼。設(shè)置SCRT格式的方法見博客:SecureCRT顯示亂碼的解決辦法

2)為何應(yīng)用層判斷是否open成功的代碼很遲才輸出?(待解決)

(4)卸載模塊測試

4、總結(jié)說明

(1)應(yīng)用層的代碼編譯,要使用交叉編譯工具鏈。

(2)驅(qū)動(dòng)源代碼的編譯,要使用與開發(fā)板系統(tǒng)內(nèi)核版本一致的內(nèi)核源碼進(jìn)行編譯。其實(shí)應(yīng)該還是借用ubuntu的 gcc工具來進(jìn)行編譯的,因?yàn)閮?nèi)核源碼中沒有g(shù)cc編譯器。Makefile 文件指明要進(jìn)入這個(gè)與開發(fā)板系統(tǒng)內(nèi)核版本一致的內(nèi)核源碼中,然后make modules。這說明是根據(jù)內(nèi)核源碼中的Makefile文件的指示,執(zhí)行Makefile文件中的一個(gè)目標(biāo)modules。

(3)mymajor = register_chrdev(0, MYNAME, &test_fops);

參數(shù) 0 表示讓系統(tǒng)自動(dòng)分配主設(shè)備號。

參數(shù)MYNAME表示設(shè)備(或者說驅(qū)動(dòng))的名字。

參數(shù)&test_fops是指向struct file_operations變量的指針,這個(gè)變量代表著驅(qū)動(dòng)的實(shí)質(zhì)內(nèi)容。

返回值mymajor代表系統(tǒng)為設(shè)備分配的主設(shè)備號。

/proc/devices文件記錄著系統(tǒng)中已經(jīng)注冊的塊設(shè)備和字符設(shè)備??梢酝ㄟ^cat或者vim(但只能讀不能修改)來查看此文件內(nèi)容。注冊成功后,可以通過/proc/devices文件查看到該設(shè)備的名字MYNAME及其設(shè)備號mymajor。

此函數(shù)成功后,主設(shè)備號為mymajor的設(shè)備與它的驅(qū)動(dòng)內(nèi)容&test_fops就關(guān)聯(lián)起來了,也就是說一個(gè)設(shè)備對應(yīng)了一個(gè)驅(qū)動(dòng)內(nèi)容。那在應(yīng)用層如何表示這個(gè)設(shè)備呢?見(4)。

(4)/dev/test是設(shè)備文件,是命令行中使用mknod命令創(chuàng)建的。安裝好驅(qū)動(dòng)模塊后,得到系統(tǒng)分配的主設(shè)備號mymajor(這里是250)。然后利用這個(gè)主設(shè)備號來創(chuàng)建設(shè)備文件,即執(zhí)行“mknod /dev/test c 250 126”。這樣一來,主次設(shè)備號為250、126的設(shè)備就和設(shè)備文件/dev/test關(guān)聯(lián)了,應(yīng)用層通過API操作/dev/test文件,也就是操作主次設(shè)備號為250、126的設(shè)備,而應(yīng)用層操作里的API就對應(yīng)著這個(gè)設(shè)備對應(yīng)的驅(qū)動(dòng)&test_fops。

設(shè)備文件不能使用vim打開,可以使用ls -l 命令查看。

綜合(3)(4),主次設(shè)備號、設(shè)備名字、驅(qū)動(dòng)內(nèi)容、設(shè)備文件,這幾個(gè)概念要清楚。

主次設(shè)備號:主設(shè)備號是register_chrdev()的返回值mymajor,次設(shè)備號在mknod時(shí)設(shè)定。

設(shè)備名字:MYNAME (主設(shè)備號、設(shè)備名字在/proc/devices文件中)

驅(qū)動(dòng)內(nèi)容:&test_fops (程序猿在驅(qū)動(dòng)源代碼中編寫)

設(shè)備文件:/dev/test,利用mknod命令手動(dòng)創(chuàng)建

(5)設(shè)備文件是手動(dòng)創(chuàng)建的,能不能讓它自動(dòng)創(chuàng)建呢?字符設(shè)備驅(qū)動(dòng)高級篇4——自動(dòng)創(chuàng)建設(shè)備文件的函數(shù)代碼分析_天糊土的博客-CSDN博客

(6)應(yīng)用層的open、read等API,與驅(qū)動(dòng)源碼的test_chrdev_open、test_chrdev_read等具體操作函數(shù),通過struct file_operations的填充而關(guān)聯(lián)起來。不過這里的驅(qū)動(dòng)源碼中的test_chrdev_open、test_chrdev_read等具體操作函數(shù),并沒有做什么事情,按理應(yīng)該操作一些硬件的。這里只是為了演示應(yīng)用層讀寫操作與驅(qū)動(dòng)層的讀寫如何關(guān)聯(lián)起來的,因而沒有硬件操作細(xì)節(jié)(比如硬件寄存器操作這些行為)。

關(guān)于具體的硬件操作見:字符設(shè)備驅(qū)動(dòng)基礎(chǔ)5——驅(qū)動(dòng)如何操控硬件(動(dòng)靜態(tài)映射操作LED)

1、應(yīng)用層代碼:app.c

2、驅(qū)動(dòng)文件:module_test.c


一文講解字符設(shè)備驅(qū)動(dòng)基礎(chǔ)——讀寫接口的操作實(shí)踐的評論 (共 條)

分享到微博請遵守國家法律
土默特左旗| 天水市| 宁城县| 龙州县| 南京市| 绍兴县| 洪江市| 泸西县| 南充市| 赣榆县| 合川市| 伊吾县| 榆社县| 肇东市| 台州市| 沅陵县| 株洲县| 广西| 耒阳市| 施甸县| 额尔古纳市| 壶关县| 蒙自县| 鹤峰县| 四川省| 大港区| 旺苍县| 阜南县| 革吉县| 方正县| 榆中县| 海宁市| 通山县| 张家川| 石首市| 台北县| 临泉县| 通渭县| 日喀则市| 五大连池市| 新和县|