驅動學習之驅動和應用的介面
在前面講過,驅動層是應用層是分離,驅動層的程式碼不能使用再應用層,應用層也不能直接操作驅動程式碼,那麼應用層和驅動層之間是如何來實現資料間的交換的能,方法就是通過相應的介面函式。
(1)copy_from_user
1
2
3
4
5
6
7
8
9
|
unsigned long copy_from_user( void *to, const void __user *from, unsigned long n)
{ might_sleep();
if (access_ok(VERIFY_READ, from, n))
n = __copy_from_user(to, from, n);
else
memset (to, 0, n);
return n;
} |
這個函式是從使用者空間拷貝資料到核心空間,失敗返回沒有被拷貝的位元組數,成功返回0,注意使用者空間的資料不能直接通過memcpy複製到核心空間,原因是核心空間和使用者空間的地址不在同一個對映區域裡面。核心空間和使用者空間的記憶體是不能直接訪問的。
(2)copy_to_user
1
2
3
4
5
6
7
8
|
unsigned long copy_to_user( void __user *to, const void *from, unsigned long n)
{ might_sleep();
BUG_ON(( long ) n < 0);
if (access_ok(VERIFY_WRITE, to, n))
n = __copy_to_user(to, from, n);
return n;
} |
返回值和copy_from_user一樣,成功返回0,失敗返回沒有拷貝成功的位元組數。
引數to有個__user限定,這個在~/include/linux/compiler.h中有如下定義:
# define __user __attribute__((noderef, address_space(1)))
表示這是一個使用者空間的地址,即其指向的為使用者空間的記憶體。
__attribute__是gnu c編譯器的一個功能,它用來讓開發者使用此功能給所宣告的函式或者變數附加一個屬性,以方便編譯器進行錯誤檢查,其實就是一個核心檢查器。
以上兩個函式參考
http://blog.sina.com.cn/s/blog_55465b470100kdn9.html
本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1872418
相關文章
- android驅動學習入門-android應用怎麼呼叫驅動2Android
- extcon驅動及其在USB驅動中的應用
- 學Linux驅動: 應該先了解驅動模型Linux模型
- linux驅動之LED驅動Linux
- 字元裝置驅動學習之cdev_init和cdev_alloc字元dev
- mtd裝置驅動(待學習)
- Linux 驅動之IoctlLinux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- MySQL的驅動表與被驅動表MySql
- 新字元驅動框架驅動LED字元框架
- 字元裝置驅動——申請、建立、應用.字元
- 驅動精靈是幹嘛的 驅動精靈怎麼安裝驅動
- 事件驅動的微服務-事件驅動設計事件微服務
- Android音訊驅動學習(一) Audio HALAndroid音訊
- 驅動Driver-platform平臺驅動Platform
- Android硬體服務框架例項之Vibrator(驅動到應用)Android框架
- VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 整合網路卡驅動和 NVMe 驅動 (整合驅動版)MaciOS
- linux mmap應用與驅動共享記憶體Linux記憶體
- Linux驅動之I2C匯流排裝置以及驅動Linux
- Linux晶片驅動之SPI ControllerLinux晶片Controller
- 既支援時間驅動又支援事件驅動,TDengine3.0流式計算的學習使用心得事件
- 【驅動】串列埠驅動分析(二)-tty core串列埠
- VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 整合網路卡驅動和 NVMe 驅動 (整合驅動版)MaciOS
- VMware ESXi 8.0U1d macOS Unlocker & OEM BIOS 整合網路卡驅動和 NVMe 驅動 (整合驅動版)MaciOS
- springCloud學習5(Spring-Cloud-Stream事件驅動)SpringGCCloud事件
- 如何學習領域驅動設計? - Vladik Khononov
- 基於Python的介面自動化-unittest測試框架和ddt資料驅動Python框架
- Bevy:基於Rust的資料驅動遊戲引擎和應用程式框架Rust遊戲引擎框架
- 驅動mysqlMySql
- 進一步學習WDK驅動程式的SOURCES檔案、WMI驅動程式的mof檔案和wmidata.h標頭檔案
- VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 整合網路卡驅動和 NVMe 驅動 (整合驅動版)MaciOS
- VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 整合網路卡驅動和 NVMe 驅動 (整合驅動版)MaciOS
- 驅動Driver-MISC雜項驅動裝置
- linux核心匯流排驅動模型-驅動篇Linux模型
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 驅動開發:探索DRIVER_OBJECT驅動物件Object物件
- 【linux】驅動-7-平臺裝置驅動Linux
- Binder驅動的使用
- RocketMQ 事件驅動:雲時代的事件驅動有啥不同?MQ事件