Linux对I/O端口资源的管理〔1〕
博主按:下文原作者在linux2.4.0基礎(chǔ)上分析的,我現(xiàn)在的內(nèi)核是2.6.32。在有區(qū)別的地方我會用紅色文字標(biāo)出,作為對原文的一些補(bǔ)充吧。
本文主要從內(nèi)核實現(xiàn)的角度分析linux 2.4.0內(nèi)核IO子系統(tǒng)中對IO端口資源的管理的實現(xiàn)原理。本文是為那些想要深入分析Linux的IO子系統(tǒng)的讀者和設(shè)備驅(qū)動程序開發(fā)人員而寫的。
Copyright ?0? 2002 by 詹榮開
E-mail:zhanrk@sohu.com
linux-2.4.0
Version 1.0.0,2002-10-1
關(guān)鍵詞:設(shè)備管理、驅(qū)動程序、I/O端口、資源
申明:這份文檔是按照自由軟件開放源代碼的精神發(fā)布的,任何人可以免費獲得、使用和重新發(fā)布,但是你沒有限制別人重新發(fā)布你發(fā)布內(nèi)容的權(quán)利。發(fā)布本文的目的是希望它能對讀者有用,但沒有任何擔(dān)保,甚至沒有適合特定目的的隱含的擔(dān)保。更詳細(xì)的情況請參閱GNU通用公共許可證(GPL),以及GNU自由文檔協(xié)議(GFDL)。
幾乎每一種外設(shè)都是通過讀寫設(shè)備上的寄存器來進(jìn)行的。外設(shè)寄存器也稱為“I/O端口”,通常包括:控制寄存器、狀態(tài)寄存器和數(shù)據(jù)寄存器三大類,而且一 個外設(shè)的寄存器通常被連續(xù)地編址。CPU對外設(shè)IO端口物理地址的編址方式有兩種:一種是I/O映射方式(I/O-mapped),另一種是內(nèi)存映射方式 (Memory-mapped)。而具體采用哪一種則取決于CPU的體系結(jié)構(gòu)。
有些體系結(jié)構(gòu)的CPU(如,PowerPC、m68k等)通常只實現(xiàn)一個物理地址空間(RAM)。在這種情況下,外設(shè)I/O端口的物理地址就被映射到 CPU的單一物理地址空間中,而成為內(nèi)存的一部分。此時,CPU可以象訪問一個內(nèi)存單元那樣訪問外設(shè)I/O端口,而不需要設(shè)立專門的外設(shè)I/O指令。這就 是所謂的“內(nèi)存映射方式”(Memory-mapped)。
而另外一些體系結(jié)構(gòu)的CPU(典型地如X86)則為外設(shè)專門實現(xiàn)了一個單獨地地址空間,稱為“I/O地址空間”或者“I/O端口空間”。這是一個與 CPU地RAM物理地址空間不同的地址空間,所有外設(shè)的I/O端口均在這一空間中進(jìn)行編址。CPU通過設(shè)立專門的I/O指令(如X86的IN和OUT指 令)來訪問這一空間中的地址單元(也即I/O端口)。這就是所謂的“I/O映射方式”(I/O-mapped)。與RAM物理地址空間相比,I/O地址空 間通常都比較小,如x86 CPU的I/O空間就只有64KB(0-0xffff)。這是“I/O映射方式”的一個主要缺點。
linux將基于I/O映射方式的或內(nèi)存映射方式的I/O端口通稱為“I/O區(qū)域”(I/O region)。在討論對I/O區(qū)域的管理之前,我們首先來分析一下Linux是如何實現(xiàn)“I/O資源”這一抽象概念的。
3.1 linux對I/O資源的描述
linux設(shè)計了一個通用的數(shù)據(jù)結(jié)構(gòu)resource來描述各種I/O資源(如:I/O端口、外設(shè)內(nèi)存、DMA和IRQ等)。該結(jié)構(gòu)定義在include/linux/ioport.h頭文件中:
struct resource {
??? const char *name;
??? unsigned long start, end;
??? unsigned long flags;
??? struct resource *parent, *sibling, *child;
};
2.6.32中start和end的類型是resource_size_t,在64位系統(tǒng)下是u64,32位系統(tǒng)下是u32
各成員的含義如下:
1. name指針:指向此資源的名稱。
2. start和end:表示資源的起始物理地址和終止物理地址。它們確定了資源的范圍,也即是一個閉區(qū)間[start,end]。
3. flags:描述此資源屬性的標(biāo)志(見下面)。
4. 指針parent、sibling和child:分別為指向父親、兄弟和子資源的指針。
屬性flags是一個unsigned long類型的32位標(biāo)志值,用以描述資源的屬性。比如:資源的類型、是否只讀、是否可緩存,以及是否已被占用等。下面是一部分常用屬性標(biāo)志位的定義(ioport.h):
/*
* IO resources have these defined flags.
*/
#define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
#define IORESOURCE_IO 0x00000100 /* Resource type */
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_IRQ 0x00000400
#define IORESOURCE_DMA 0x00000800
#define IORESOURCE_PREFETCH 0x00001000 /* No side effects */
#define IORESOURCE_READONLY 0x00002000
#define IORESOURCE_CACHEABLE 0x00004000
#define IORESOURCE_RANGELENGTH 0x00008000
#define IORESOURCE_SHADOWABLE 0x00010000
#define IORESOURCE_BUS_HAS_VGA 0x00080000
#define IORESOURCE_UNSET 0x20000000
#define IORESOURCE_AUTO 0x40000000
#define IORESOURCE_BUSY 0x80000000
/* Driver has marked this resource busy */
指針parent、sibling和child的設(shè)置是為了以一種樹的形式來管理各種I/O資源。
轉(zhuǎn)載于:https://www.cnblogs.com/java-time/archive/2011/01/20/tt43.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Linux对I/O端口资源的管理〔1〕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Aspx页面中直接编写javascrip
- 下一篇: 79式冲锋枪的升级改造