在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > RK3568驅動指南|第二篇 字符設備基礎-第14章 內核空間與用戶空間數據交互實驗

            RK3568驅動指南|第二篇 字符設備基礎-第14章 內核空間與用戶空間數據交互實驗

            發(fā)布人:紅李亞 時間:2024-04-07 來源:工程師 發(fā)布文章
            瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU,可用于輕量級人工智能應用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網網關、NVR 存儲、工控平板、工業(yè)檢測、工控盒、卡拉 OK、云終端、車載中控等行業(yè)。


            第14章 內核空間與用戶空間數據交互實驗

            在“第12章 字符設備驅動框架實驗”中,已經對file_operations結構體的進行了填充,該結構體的每一個成員都對應著一個系統(tǒng)調用,例如read、write等,在對應的實驗中,只是對調用函數進行了標志打印,并沒有真正實現(xiàn)設備的讀寫功能,而在本章節(jié)將對內核空間與用戶空間的數據交換功能進行實現(xiàn)。

            14.1 內核空間與用戶空間

            Linux系統(tǒng)將可訪問的內存空間分為了兩個部分,一部分是內核空間,一部分是用戶空間。操作系統(tǒng)和驅動程序運行在內核空間(內核態(tài)),應用程序運行在用戶空間(用戶態(tài))。

            那么為什么要區(qū)分用戶空間和內核空間呢?

            (1)內核空間中的代碼控制了硬件資源,用戶空間中的代碼只能通過內核暴露的系統(tǒng)調用接口來使用系統(tǒng)中的硬件資源,這樣的設計可以保證操作系統(tǒng)自身的安全性和穩(wěn)定性。

            (2)從另一方面來說,內核空間的代碼更偏向于系統(tǒng)管理,而用戶空間中的代碼更偏重業(yè)務邏輯實現(xiàn),倆者的分工不同。

            硬件資源管理都是在內核空間完成的,應用程序無法直接對硬件進行操作,只能通過調用相應的內核接口來完成相應的操作。比如應用程序要對磁盤上的一個文件進行讀取,應用程序可以向內核發(fā)起一個“系統(tǒng)調用”申請——我要讀取磁盤上的文件。這個過程其實是通過一個特殊的指令讓進程從用戶態(tài)進入到了內核態(tài)。在內核空間中,CPU可以執(zhí)行任何命令,包括從磁盤上讀取數據,具體過程是先把數據讀取到內核空間中,然后再把數據拷貝到用戶空間并從內核態(tài)切換到用戶態(tài)。此時應用程序已經從系統(tǒng)調用中返回并拿到了想要的數據,可以繼續(xù)往下執(zhí)行了。

            進程只有從用戶空間切換到內核空間才可以使用系統(tǒng)的硬件資源,切換的方式有三種:系統(tǒng)調用,軟中斷,硬中斷,如下圖(圖 14-1)所示:

            14.2 用戶空間和內核空間數據交換

            內核空間和用戶空間的內存是不能互相訪問的。但是很多應用程序都需要和內核進行數據的交換,例如應用程序使用read函數從驅動中讀取數據,使用write函數向驅動中寫數據,上述功能就需要使用copy_from_user和copy_to_user倆個函數來完成。copy_from_user函數是將用戶空間的數據拷貝到內核空間。copy_to_user函數是將內核空間的數據拷貝到用戶空間。

            這倆個函數定義在了kernel/include/linux/uaccess.h文件下,如下所示:

            copy_to_user


            函數原型:

            unsigned long copy_to_user_inatomic(void __user *to, const void

            *from, unsigned long n);


            函數作用:

            把內核空間的數據復制到用戶空間。


            參數含義:

            *to是用戶空間的指針

            *from是內核空間的指針

            n是從內核空間向用戶空間拷貝的字節(jié)數

            copy_from_user


            函數原型:

            unsigned long copy_from_user(void *to, const void __user *from,

            unsigned long n)


            函數作用:

            把用戶空間的數據復制到內核空間。


            參數含義:

            *to是內核空間的指針

            *from是用戶空間的指針

            n是從用戶空間向內核空間拷貝的字節(jié)數


            14.3 實驗程序編寫

            14.3.1 驅動程序編寫

            本驅動程序對應的網盤路徑為:iTOP-RK3568開發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開發(fā)板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\09\module。

            在該實驗中將實現(xiàn)內核空間和用戶空間進行數據交換的功能。以12章編寫的字符設備驅動框架實驗為基礎編寫驅動程序,程序使用copy_to_user函數和copy_from_user函數來實現(xiàn)內核空間和用戶空間互傳數據的功能,編寫完成的file.c代碼如下所示:

            以上代碼在cdev_test_read函數中使用copy_to_user函數將內核數據拷貝到用戶空間,在cdev_test_write函數中使用copy_from_user函數將用戶空間數據拷貝到內核空間。

            14.3.2 編寫測試 APP

            本應用程序對應的網盤路徑為:iTOP-RK3568開發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開發(fā)板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\09\app。

            編寫測試APP其實是在編寫Linux應用,編譯完成的應用程序app.c代碼如下所示:

            14.4 運行測試

            14.4.1 編譯驅動程序

            在上一小節(jié)中的file.c代碼同一目錄下創(chuàng)建 Makefile 文件,Makefile 文件內容如下 所示:

            對于Makefile的內容注釋已在上圖添加,保存退出之后,來到存放file.c和Makefile文件目錄下,如下圖(圖14-2)所示:

            然后使用命令“make”進行驅動的編譯,編譯完成如下圖(圖14-3)所示:

            編譯完生成 file.ko目標文件,如下圖(圖 14-4)所示:

            至此我們的驅動模塊就編譯成功了,下面進行應用程序編譯.


            下面進行驅動程序的測試。


            輸入以下命令運行應用程序,如下圖(圖 14-7)所示

            由上圖可知,打印“This is cdev_test_open”信息說明成功打開了字符設備驅動。

            打印“ This is cdev_test_read”和“buf1 is This is cdev_test_read!”說明應用程序成功讀取到內核的數據。

            打印“This is cdev_test_write”和“kbuf is nihao”說明應用程序向內核寫數據成功。

            最后打印“This is cdev_test_release”說明卸載字符設備。

            更多內容可以了解迅為RK3568開發(fā)板


            *博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



            關鍵詞: 開發(fā)板

            相關推薦

            技術專區(qū)

            關閉