linux字符設備

1. 字符設備的定義

linux下有三種設備, 字符設備, 塊設備, 網絡設備等等, 它們均以一個文件節點形式顯示在文件系統的/dev目錄下(crw--w---- 1 root tty 4, 0 7月  11 09:11 tty0, 其中c代表字符設備類型).

字符設備是指這些設備中無需緩衝即可直接進行讀寫的設備,  如鼠標,鍵盤,串口設備等, 它與塊設備的區別在於是字符操作的基本單位是字節.

下面爲字符設備結構示意圖:



2. 字符設備的性質及特點

a) 字符設備屬於設備文件系統的一種, 相當於底層硬件向上層提供的邏輯設備文件, 宛如將一個數據端口(數據寄存器)與一個文件對接起來,設備驅動程序直接對文件操作, 於是便直接對端口進行了讀寫操作. 同樣作爲文件, 字符設備驅動也必須實現文件的基本的操作open(),close(),write(),read()等,當然終端重定向操作也是支持的.

b) 字符設備文件文件的讀寫是以單個字節爲單位的, 不需要設立硬件緩衝區. 設備像訪問字節流一樣被操作系統訪問. 字節流就像在硬件端口和文件系統搭建起了一個傳送管道, 字節逐個通過管道傳輸並呈現給讀寫雙方. 這個流特性在驅動程序中是以緩衝隊列來實現的.

例如: 控制檯的結構體中的讀寫緩衝隊列

struct tty_struct {
struct termios termios;
int pgrp;
int stopped;
void (*write)(struct tty_struct * tty);
struct tty_queue read_q;               //讀隊列
struct tty_queue write_q;              //寫隊列
struct tty_queue secondary;            //tty輔助隊列(存放規格化後的字符)
};

c) 字符設備由字符設備號標識.

字符設備號由主設備號和次設備號構成, 例如/dev/ttyS0的設備號爲(4,64);

主設備號標識設備對應驅動程序, 內核通過主設備號將設備和驅動程序一一對應起來, 次設備號由驅動程序使用, 用於驅動程序內部區分設備細節差別使用的代碼,內核其他部分不使用它.

d)

3. 字符設備的分類

字符設備主要包括控制終端設備和串行終端設備, 例如控制檯和鍵盤.

依據功能和硬件的上差別, 字符終端設備有如下分類:

- 串行端口終端(/dev/ttSn):

使用計算機串行端口連接的終端設備, 串行設備數據傳輸方式爲同一字符8個bit單線傳輸, 在命令行輸入 echo 'hello world' > /dev/ttyS0可將輸入寫入到對應設備.

- 僞終端(/dev/ttyp,/dev/ptyp):

對應底層不存在真實的硬件設備, 用於爲其他程序提供終端式樣的接口,如網絡登陸主機時網絡服務器和shell程序之間的終端接口.

- 控制終端(/dev/tty):

主設備號爲5, 進程控制終端,與進程相關聯,如登陸shell進程使用的就是終端/dev/tty.

- 控制檯(/dev/ttyn,/dev/console):

計算機輸入輸出的顯示器,當控制檯登陸時, 使用的就是tty1, 而ubuntu 圖形界面使用的tty7.

- 其他類型:

現行的linux針對許多不同的設備建有許多其他種類的設備特殊文件,如ISIDIN設備的/dev/ttyIn設備.

具體分類可參看http://www.cnblogs.com/yxmx/articles/1612627.html

4.字符設備與驅動程序的關係

字符設備與驅動程序的處在不同的層次上, 驅動程序實現了對硬件的控制邏輯, 並將其以統一接口的形式呈現給上層用戶.

這樣的話, 字符設備驅動程序就是硬件和文件組織系統間的接口, 它或解釋底層硬件中斷, 翻譯並轉交給用戶進程, 或將用戶進程發出的信號傳輸給硬件, 觸發硬件中斷.



例如,當用戶在鍵盤上鍵入了一個字符時,會引起鍵盤中斷響應(中斷請求信號 IRQ1, 對應中斷號INT 33 ),此時鍵盤中斷處理程序就會從鍵盤控制器讀入對應的鍵盤掃描碼,然後根據使用的鍵盤掃描碼映射表譯成相應字符,放入 tty 讀隊列 read_q 中。然後調用中斷處理程序的 C 函數 do_tty_interrupt() ,並調用寫控制檯函數 con_write() 。此時如果該終端的回顯( echo )屬性是設置的,則該字符會顯示到屏幕上.

並且, 進程對字符設備的讀寫通過文件系統實現的文件讀寫操作從用戶緩衝區讀取一個字符寫入寫隊列, 若寫隊列已滿, 則將寫隊列輸出到控制檯顯示出來.
整個操作過程見圖 7-3 所示 :                                                                                

                                                                                                               


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章