裝置驅動程式與核心模組

字元裝置(character device)

/ kar-AK-ter /

想像你打開一個水龍頭:水成一道水流流出,一滴接著一滴,你無法伸進水管中間直接抓住第十公升的水。字元裝置是核心對任何「以一串依序排列的位元組」與之溝通的裝置的模型:序列埠、鍵盤、/dev/random、音訊裝置。你像讀寫檔案一樣讀寫它,但通常無法像在真正檔案裡那樣自由地尋找到任意位置。

在核心內部,字元驅動程式由一個 struct cdev 表示,註冊時帶有主編號與次編號,並提供一張 file_operations 表——一串函式指標,對應 open、read、write、ioctl、release 等。當使用者空間開啟 /dev/mychar 並呼叫 read() 時,核心找到那個裝置節點的 cdev 並呼叫驅動程式的 .read 處理常式,後者產生位元組(常從硬體取得)並用 copy_to_user 交還。傳輸單位概念上是一個位元組,而驅動程式決定每次呼叫回傳多少位元組——讀取 100 位元組合理地可能回傳較少。

字元裝置之所以重要,是因為它是最簡單也最常見的驅動程式類型,也是人們最先寫的那一種。一個澄清:「字元」不代表文字——它代表無緩衝、以位元組為粒度的存取,相對於區塊裝置那種固定大小、可隨機定址的區塊。字元裝置完全可以承載原始二進位資料;這個詞區分的是位元組串流模型與區塊模型,而非文字與二進位。

static const struct file_operations fops = { .owner = THIS_MODULE, .read = my_read, .write = my_write, .open = my_open, .release = my_release, }; // 註冊一個綁到 fops 並帶有(主編號、次編號)的 cdev

字元驅動程式大致上就是一張 file_operations 表,加上一個註冊到某裝置編號的 cdev。

「字元」指的是位元組串流存取,而非文字;二進位資料完全沒問題。對照的是區塊裝置(固定大小、可隨機定址的區塊),而不是二進位與文字之分。

又称
char devicecdev字元型裝置