1. 程式人生 > >字元裝置的讀寫

字元裝置的讀寫

在應用程式看來,字元裝置只是一個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。應用層對裝置的操作都在裝置驅動程式的file_operations結構中有對應的介面,比如應用層的read函式對應驅動層的file_operations-> read,而應用層的write函式對應驅動層的file_operations-> write。本節介紹字元裝置核心空間與使用者空間資料互動的方法。

先看file_operations中的讀寫介面:

  1. ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);  
  2. ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 

它們的第二個引數實際上是使用者空間的資料地址。由於核心態和使用者態使用不同的記憶體定義,所以二者之間不能直接訪問對方的記憶體,而應該使用Linux中的使用者和核心態記憶體互動函式,這些函式在include/asm/uaccess.h中宣告。

從核心空間複製資料到使用者空間使用copy_to_user函式:

  1. unsigned long copy_to_user (void __user * to, const void * from, unsigned long n); 
而要從使用者空間複製資料到核心空間可以用copy_from_user函式:
  1. unsigned long copy_from_user (void * to, const void* from, unsigned long n); 
此外核心空間和使用者空間之間也可進行單值互動(如char、int、long型別):
  1. int  put_user(dataum,ptr);  //向用戶空間傳單值  
  2. int  get_user(local,ptr);   //向核心空間傳單值 
當一個指標指向使用者空間時,必須確保指向的使用者地址是合法的,而且對應的頁面也已經對映,這一點可以使用access_ok函式檢測。access_ok函式的type引數有兩個選項:VERIFY_READ、VERIFY_ WRITE,分別對應記憶體讀、寫。
  1. int access_ok(int type, const void *addr, unsigned long size); 
在訪問使用者空間的記憶體時,可以使用下面的方法先檢查使用者空間的指標是否合法:
  1. char kernelbuffer[100];  
  2. static ssize_t demo_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)  
  3. {  
  4.     if (!access_ok(VERIFY_WRITE, buffer, count))  
  5.         return -EFAULT;  
  6.     if (copy_to_user(buffer, kernelbuffer, count))  
  7.             return -EFAULT;  
  8.     return count;  
  9. }  

相關推薦

關於python中cv帶中文字元問題(imwrite儲存失敗)

今天在寫一段資料augment程式的時候,裡面用到了cv2.imwrite這個函式發現雖然沒有報錯,程式也執行完了,但是沒有產生相應的圖片。並且在下一段使用cv2.imread讀取圖片的時候也發現讀進來的顯示為None。這是怎麼回事呢。 後來在通過查詢帖子發現,這個可能是因

Linux I2C裝置應用程式

中間驅動中通過呼叫i2c_get_adapter(id)和i2c_put_adapter(id)來獲取和釋放adapter總線上的相應的I2C裝置,通過呼叫adpter的i2c_transfer來進行讀寫通訊。 I2C_dev 就是個典型的例子,I2C_dev為adapter總線上的每一個I2c adapte

Vim中特殊字元詳解

一、檢視特殊字元 Vim中可見特殊字元會直接顯示,不可見特殊字元會顯示為該字元在命令列的輸入方式, 例如\r顯示為^M。通過:help digraph-table可看到所有Vim中可輸入的特殊字元, 該文件的第一頁如下: ? 1 2 3

涉及多平臺版本的中英文字元檔案和轉換

參考文件: 1. 在多個編譯版本中,中英文在傳遞時,可能採用不同的格式  _UNICODE定義時,中英文字元都按unicode格式儲存(CString使用CStringW-wchar_t型儲存) MBCS時,英文字元1個位元組,中文字元兩個位元組(CSt

java-IO操作——使用帶有緩衝的字元資料

使用BufferedReader和PrintWriter實現檔案拷貝 package Test; import java.io.BufferedReader; import java.io.Bu

Linux 字元裝置驅動開發--記憶體操作

學習Linux的累計時間已經有兩年多了,工作關係,學習的過程總是斷斷續續的,現在整理一下,下面要分享的是一個簡單的linux驅動程式,將記憶體當作一個虛擬的裝置去讀寫,沒有什麼實際的用處,像hello wold!程式一樣,我們簡單體會一下linux驅動程式的特點,Linux

字元裝置

在應用程式看來,字元裝置只是一個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。應用層對裝置的操作都在裝置驅動程式的file_operations結構中有對應的介面,比如應用層的read函式對應驅動層的file_operations-> read,而應用

linux0.11字元裝置過程分析

首先要知道linux系統/dev目錄下的各種裝置檔案(檔案屬性c打頭)並不佔用空間,你可以發現他們的大小為0位元組,他們的區別在於檔案的i節點的成員i_zone[0]的值不同,該值標識不同的裝置號。比如tty0檔案的裝置號為0x0400,tty1裝置號為0x0401,hd0

STM32的RFID射頻控制裝置

please include .cn mage str rfid alt all float ,大二上學期做的,過了很久,先上一下圖: 這並不是做個最後一版;主體是RC552+STM32+1062;蜂鳴器,繼電器,LED等;反正最後的效果就是,刷一下卡,1602顯示一下持

[轉]C++ MFC介面USB HID裝置資料程式

C++ MFC介面讀寫USB HID裝置資料程式跟大家分享一個最近開發的,用來測試USB HID裝置的通用程式,程式還有很多可以繼續優化的地方,比如說interupt的週期,讀取位元組的多少等。我遇到的問題是:開發一個簡單易用的介面,用來對USB HID裝置(比如說遊戲手柄,控制面板等)讀寫資料,一

系統學習 Java IO (十四)----字元快取和回退 BufferedReader/BufferedWriter & PushbackReader

目錄:系統學習 Java IO---- 目錄,概覽 BufferedReader BufferedReader 類構造器接收一個 Reader 物件,為 Reader 例項提供緩衝。 緩衝可以加快 IO 的速度。 BufferedReader 不是一次從網路或磁碟讀取一個字元,而是一次讀取一個更大的塊。

系統學習 Java IO (十五)----字元 Reader/Writer 其他子類

目錄:系統學習 Java IO---- 目錄,概覽 跟蹤行號的緩衝字元輸入流 LineNumberReader LineNumberReader 類是一個 BufferedReader ,用於跟蹤讀取字元的行號。行號從 0 開始。每當 LineNumberReader 在包裝的 Reader 返回的字元中

Java——IO流(三)字元流的與拷貝、裝飾設計模式

1.字元流的學習(FileReader與FileWriter):字元流是可以直接讀寫字元的IO流(只讀或者只寫時使用字元流)          (1)字元流讀取字元就要先讀取到位元組資料,然後轉化為字元;如果要寫出字元,需要把字元轉化為位元組再寫出          (2)讀

ApolloStudio高手之路(3):用Python以最優雅簡潔的方式支援Modbus RTU/TCP協議的裝置資料

縱觀整個工業界生態鏈,可能Modbus協議(包括了通過串列埠方式連線的Modbus RTU協議和通過網路傳輸的Modbus TCP協議,這裡統稱為Modbus)作為一種工業領域通訊協議的業界標準在所有裝置互聯的協議群中獨佔鰲頭,也許正是因為其相較與其他協議的優越性(1.公開發表並且無版權要求;2

位元組流與字元流,位元組流和字元流的使用哪個多? java 操作大檔案 BufferedReader和RandomAccessFile

一 首先我們要知道 在程式中所有的資料都是以流的方式進行傳輸或儲存的   而流有兩種 位元組流用來處理位元組或二進位制物件 字元流主要用來處理字元或字串,一個字元佔兩個位元組 而上一篇的java 讀寫操作大檔案 BufferedReader和RandomAccessFile Buf

支援各種特殊字元的 CSV 解析類 (.net 實現)(C#CSV檔案)

CSV是一種十分簡潔的資料結構,在DOTNET平臺實際使用中發現微軟官方並沒有提供預設的方法,而網上好多例子發現實現並不嚴謹甚至一些含有明顯錯誤,所以後面自己實現了一個讀寫工具類,這裡發出來希望方便後面朋友(難免還是會有考慮不到的地方,可隨時郵件聯絡) 使用該工具可對csv檔案進行讀寫(甚至不用去了解CSV的

amlogic平臺android 系統linux核心中新增i2c裝置實現i2c的

上一篇,我介紹瞭如何在uboot中新增i2c裝置,以及移植i2c的讀寫介面。簡單來說uboot階段使用i2c裝置和平臺關聯性比較大,但不同平臺套路是差不多的。你可以將uboot階段看作是引導androi

Android平臺i2c裝置開發筆記二

二、 使用JNI在應用程式框架層新增服務訪問介面        APP應用不能直接訪問HAL層,需要JNI層訪問HAL模組並向上提供API介面。可以直接提供介面,但建議最好使用服務的方式提供訪問。        我們先看JNI如何訪問剛才的HAL模組。        進入原

Linux Kernel 裝置驅動之I2C之client資料API

傳送資料 int i2c_master_send(const struct i2c_client *client, const char *buf, int count) 接收資料 int i2c_master_recv(const struct i2c_client *c

Android 測試儲存裝置速度

使用Linux的dd命令可以很快捷的獲取儲存的讀寫速度。 寫入測試: for (int i = 0; i < arrayFilePath.size(); i++) {