CentOS裝置管理

來源:互聯網
上載者:User

Linux的裝置管理

  • Linux的裝置管理的主要任務是控制裝置完成輸入輸出操作,所以又稱輸入輸出(I/O)子系統。

  • 它的任務是把各種裝置硬體的複雜物理特性的細節屏蔽起來,提供一個對各種不同裝置使用統一方式進行操作的介面。

  • Linux把裝置看作是特殊的檔案,系統通過處理檔案的介面—虛擬檔案系統VFS來管理和控制各種裝置。

§6.1裝置管理概述

  1. Linux裝置的分類

  • 裝置被分為三類,塊裝置、字元裝置和網路裝置。

  • 字元裝置是以字元為單位輸入輸出資料的裝置,一般不需要使用緩衝區而直接對它進行讀寫。

  • 塊裝置是以一定大小的資料區塊為單位輸入輸出資料的,一般要使用緩衝區在裝置與記憶體之間傳送資料。

  • 網路裝置是通過通訊網路傳輸資料的裝置,一般指與通訊網路連接的網路介面卡(網卡)等。

Linux使用套介面(socket)以檔案I/O方式提供了對網路資料的訪問。

  1. 裝置驅動程式

  • 系統對裝置的控制和操作是由裝置驅動程式完成的。

  • 裝置驅動程式是由裝置服務子程式和中斷處理常式組成。裝置服務子程式包括了對裝置進行各種操作的代碼,中斷處理子程式處理裝置中斷。

  • 裝置驅動程式的主要功能是:

  • 對裝置進行初始化

  • 啟動或停止裝置的運行

  • 把裝置上的資料傳送到記憶體

  • 把資料從記憶體傳送到裝置

  • 檢測裝置狀態

  • 驅動程式是與裝置相關的。

  • 驅動程式的代碼由核心統一管理,

  • 驅動程式在具有特權級的核心態下運行。

  • 裝置驅動程式是輸入輸出子系統的一部分。

  • 驅動程式是為某個進程服務的,其執行過程仍處在進程啟動並執行過程中,即處於進程上下文中。

  • 若驅動程式需要等待裝置的某種狀態,它將阻塞當前進程,把進程加入到該種裝置的等待隊列中。。

  • Linux的驅動程式分為兩個基本類型:字元裝置驅動程式和塊裝置驅動程式。

三.裝置的識別

  • 對裝置的識別使用裝置類型、主裝置號、次裝置號

  • 裝置類型:字元裝置還是塊裝置。

  • 按照裝置使用的驅動程式不同而賦予裝置不同的主裝置號。主裝置號是與驅動程式一一對應的,同時還使用次裝置號來區分一種裝置中的各個具體裝置。次裝置號用來區分使用同一個驅動程式的個體裝置。

  • 例如,系統中的塊裝置IDE硬碟的主裝置號是8,

而多個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

四.裝置檔案

  • Linux裝置管理的基本特點是把物理裝置看成檔案,採用處理檔案的介面和系統調用來管理控制裝置。

  • 從抽象的觀點出發,Linux的裝置又稱為裝置檔案。

  • 裝置檔案也有檔案名稱,裝置檔案名稱一般由兩部分組成

  • 第一部分2~3個字元,表示裝置的種類,如串口裝置是cu,並口裝置是lp,IDE普通硬碟是hd,SCIS硬碟是sd,磁碟片是fp等。

  • 第二部分通常是字母或數字,用於區分同種裝置中的單個裝置,如hda、hdb、hdc…分別表示第一塊、第二塊、第三塊IED硬碟。而hda1、hda2…表示第一塊硬碟中的第一、第二個磁碟分割。

  • 裝置檔案一般置於/dev目錄下,如/dev/hda2、/dev/lp0等。

  • Linux使用虛擬檔案系統VFS做為統一的操作介面來處理檔案和裝置。

  • 與普通的目錄和檔案一樣,每個裝置也使用一個VFSinode來描述,其中包含著該種裝置的主、次裝置號。

  • 對裝置的操作也是通過對檔案操作的file_operations結構體來調用驅動程式的裝置服務子程式。

  • 例如,當進程要求從某個裝置上輸入資料時,由該裝置的

file_operations結構體得到服務子程式的操作函數入口,然後調用其中的read()函數完成資料輸入操作。

  • 同樣,使用file_operations中的open()、close()、write()

分別完成對裝置的啟動、停止裝置運行,向裝置輸出資料的操作。

§6.2 Linux的I/O控制

Linux的I/O控制方式有三種:查詢等待方式、

中斷方式和DMA(記憶體直接存取)方式.

一.查詢等待方式

  • 查詢等待方式又稱輪詢方式(polling mode)。

  • 對於不支援中斷方式的機器只能採用這種方式來控制I/O過程,所以Linux中也配備了查詢等待方式。

  • 例如,並行介面的驅動程式中預設的控制方式就是查詢等待方式。

  • 如函數lp_char_polled()就是以查詢等待方式向與並口串連的裝置輸出一個字元。

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)); /*向裝置輸出字元*/

  .

   .

二.中斷方式

  • 在硬體支援中斷的情況下,驅動程式可以使用中斷方式控制I/O過程。

  • 對I/O過程式控制制使用的中斷是硬體中斷,當某個裝置需要服務時就向CPU發出一個中斷脈衝訊號,CPU接收到訊號後根據插斷要求號IRQ啟動插斷服務常式。

  • 在中斷方式中,Linux裝置管理的一個重要任務就是在CPU接收到插斷要求後,能夠執行該裝置驅動程式的插斷服務常式。

  • 為此,Linux設定了名字為irq_action的中斷常式描述符表:

static struct irqaction *irq_action[NR_IRQS+1];

  • NR_IRQS表示中斷源的數目。

  • irq_action[]是一個指向irqaction結構的指標數組,它指向的irqaction結構是各個裝置插斷服務常式的描述符。

struct irqaction {

void (*handler)(int, void *, struct pt_regs *); /*指向插斷服務常式*/

unsigned longflags; /*中斷標誌*/

unsigned longmask; /*中斷掩碼*/

void *dev_id; /*

struct irqaction *next; /*指向下一個描述符*/

};

  • 在驅動程式初始化時,調用函數request_irq()建立該驅動程式

的irqaction結構體,並把它登記到irq_action[]數組中。

  • request_irq()函數的原型如下:

intrequest_irq(unsigned intirq,

void (*handler)(int, void *, struct pt_regs *),

unsigned longirqflags,

const char *devname,

void *dev_id);

  • 參數irq是裝置中斷求號,在向irq_action[]數組登記時,它做為數組的下標。

  • 把中斷號為irq的irqaction結構體的首地址寫入irq_action[irq]。這樣就把裝置的插斷要求號與該裝置的服務常式聯絡在一起了。

  • 當CPU接收到插斷要求後,根據中斷號就可以通過irq_action[]找到該裝置的插斷服務常式。

§6.3字元裝置與塊裝置管理

  • 在Linux中,一個裝置在使用之前必須向系統進行註冊,裝置註冊是在裝置初始化時完成的。

一.字元裝置管理

  • 在系統核心保持著一張字元裝置註冊表,每種字元裝置佔用一個表項。

  • 字元裝置註冊表是結構數組chrdevs[]:

#define MAX_CHRDEV 128

staticstruct device_structchrdevs[MAX_CHRDEV];

  • 註冊表的表項是device_struct結構:

struct device_struct {

const char *name;/*指向裝置名稱字串*/

structfile_operations*fops; /*指向檔案操作函數的指標*/

};

  • 在字元裝置註冊表中,每個表項對應一種字元裝置的驅動程式。所以字元裝置註冊表實質上是驅動程式的註冊表。

  • 使用同一個驅動程式的每種裝置有一個唯一的主裝置號。所以註冊表的每個表項與一個主裝置號對應。

  • 在Linux中正是使用主裝置號來對註冊表數組進行索引, 即chrdevs[]數組的下標值就是主裝置號。

  • device_struct結構中有指向file_operations結構的指標f_ops。file_operations結構中的函數指標指向裝置驅動程式的服務常式。

  • 在開啟一個裝置檔案時,由主裝置號就可以找到裝置驅動程式。

二.塊裝置管理

  • 塊裝置在使用前也要向系統註冊。

  • 塊裝置註冊在系統的塊裝置註冊表中,塊裝置註冊表是結構數組blkdevs[]

  • 它的元素也是device_struct結構

static struct device_struct blkdevs[MAX_BLKDEV]

  • 在塊裝置註冊表中,每個表項對應一種塊裝置,

  • 註冊表blkdevs[]數組的的下標是主裝置號。

  • 塊裝置是以塊為單位傳送資料的,裝置與記憶體之間的資料傳送必須經過緩衝。

  • 當對裝置讀寫時,首先把資料置於緩衝區內,應用程式需要的資料由系統在緩衝區內讀寫。

  • 只有在緩衝區內已沒有要讀的資料,或緩衝區已滿而無寫入的空間時,才啟動裝置控制器進行裝置與緩衝區之間的資料交換。

  • 裝置與緩衝區的資料交換是通過blk_dev[]數組實現的:

struct blk_dev_struct blk_dev[MAX_BLKDEV];

  • 每個塊裝置對應數組中的一項,數組的下標值與主裝置號對應。

  • 數組元素是blk_dev_struct結構:

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結構中有一個指向緩衝區資訊的指標,

由它決定緩衝區的位置和大小等。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.