Linux的裝置管理
§6.1裝置管理概述
Linux裝置的分類
Linux使用套介面(socket)以檔案I/O方式提供了對網路資料的訪問。
裝置驅動程式
對裝置進行初始化
啟動或停止裝置的運行
把裝置上的資料傳送到記憶體
把資料從記憶體傳送到裝置
檢測裝置狀態
三.裝置的識別
對裝置的識別使用裝置類型、主裝置號、次裝置號
裝置類型:字元裝置還是塊裝置。
而多個SCSI硬碟及其各個分區分別賦予次裝置號1、2、3…。
[root@localhost /]# ls /dev/sda* -l
brw-r----- 1 root disk 8, 0 11-07 12:31/dev/sda
brw-r----- 1 root disk 8, 1 11-07 12:31/dev/sda1
brw-r----- 1 root disk 8, 2 11-07 12:31/dev/sda2
四.裝置檔案
file_operations結構體得到服務子程式的操作函數入口,然後調用其中的read()函數完成資料輸入操作。
分別完成對裝置的啟動、停止裝置運行,向裝置輸出資料的操作。
§6.2 Linux的I/O控制
Linux的I/O控制方式有三種:查詢等待方式、
中斷方式和DMA(記憶體直接存取)方式.
一.查詢等待方式
static inline intlp_char_polled(charlpchar, intminor)
{
int status, wait = 0;
unsigned long count = 0;
struct lp_stats *stats;
do {/*查詢等待迴圈*/
status = LP_S(minor);
count ++;
if(need_resched)
schedule();
} while(!LP_READY(minor,status)&&count < LP_CHAR(minor));
if (count == LP_CHAR(minor)) { /*逾時退出*/
return 0;
}
outb_p(lpchar, LP_B(minor)); /*向裝置輸出字元*/
.
.
二.中斷方式
static struct irqaction *irq_action[NR_IRQS+1];
struct irqaction {
void (*handler)(int, void *, struct pt_regs *); /*指向插斷服務常式*/
unsigned longflags; /*中斷標誌*/
unsigned longmask; /*中斷掩碼*/
void *dev_id; /*
struct irqaction *next; /*指向下一個描述符*/
};
的irqaction結構體,並把它登記到irq_action[]數組中。
intrequest_irq(unsigned intirq,
void (*handler)(int, void *, struct pt_regs *),
unsigned longirqflags,
const char *devname,
void *dev_id);
§6.3字元裝置與塊裝置管理
一.字元裝置管理
#define MAX_CHRDEV 128
staticstruct device_structchrdevs[MAX_CHRDEV];
struct device_struct {
const char *name;/*指向裝置名稱字串*/
structfile_operations*fops; /*指向檔案操作函數的指標*/
};
二.塊裝置管理
static struct device_struct blkdevs[MAX_BLKDEV]
struct blk_dev_struct blk_dev[MAX_BLKDEV];
structblk_dev_struct{
void (*request_fn)(void);
struct request *current_request;
struct requestplug;
struct tq_structplug_tq;
};
request_fn:指向裝置讀寫請求函數的指標
current_request:指向request結構的指標。
當緩衝區需要與裝置進行資料交換時,
緩衝機制就在blk_dev_struct中加入一個request結構。
每個request結構對應一個緩衝區對裝置的讀寫請求。
在request結構中有一個指向緩衝區資訊的指標,
由它決定緩衝區的位置和大小等。