/usr/src/linux-2.6.21.5/include/linux/ioport.h
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
struct resource_list {
struct resource_list *next;
struct resource *res;
struct pci_dev *dev;
};
文章來源:http://gliethttp.cublog.cn
一個獨立的掛接在cpu匯流排上的裝置單元,一般都需要一段線性地址空間來描述裝置自身,linux是怎麼管理所有的這些外部"物理位址範圍段",進而給使用者和linux自身一個比較好的觀察4G匯流排上掛接的一個個裝置實體的簡潔、統一級聯視圖的呢?
linux採用struct resource結構體來描述一個掛接在cpu匯流排上的裝置實體(32位cpu的匯流排位址範圍是0~4G):
resource->start描述裝置實體在cpu匯流排上的線性起始物理地址;
resource->end -描述裝置實體在cpu匯流排上的線性結尾物理地址;
resource->name 描述這個裝置實體的名稱,這個名字開發人員可以隨意起,但最好貼切;
resource->flag 描述這個裝置實體的一些共性和特性的標誌位;
只需要瞭解一個裝置實體的以上4項,linux就能夠知曉這個掛接在cpu匯流排的上的裝置實體的基本使用方式,也就是[resource->start, resource->end]這段物理地址現在是空閑著呢,還是被什麼裝置佔用著呢?
linux會堅決避免將一個已經被一個裝置實體使用的匯流排物理地址區間段[resource->start, resource->end],再分配給另一個後來的也需要這個區間段或者區間段內部分地址的裝置實體,進而避免裝置之間出現對同一匯流排物理位址區段的重複引用,而造成對唯一物理地址的裝置實體二義性.
以上的4個屬性僅僅用來描述一個裝置實體自身,或者是裝置實體可以用來自治的單元,但是這不是linux所想的,linux需要管理4G物理匯流排的所有空間,所以掛接到匯流排上的形形色色的各種裝置實體,這就需要鏈在一起,因此resource結構體提供了另外3個成員:指標parent、sibling和child:分別為指向父親、兄弟和子資源的指標。
以root source為例,root->child(*pchild)指向root所有孩子中地址空間最小的一個;pchild->sibling是兄弟鏈表的開頭,指向比自己地址空間大的兄弟。
實體記憶體頁面是重要的資源。從另一個角度看,地址空間本身,或者實體儲存體器在地址空間中的位置,也是一種資源,也要加以管理 -- resource管理地址空間資源。
核心中有兩棵resource樹,一棵是iomem_resource, 另一棵是ioport_resource,分別代表著兩類不同性質的地址資源。兩棵樹的根也都是resource資料結構,不過這兩個資料結構描述的並不是用於具體操作對象的地址資源,而是概念上的整個地址空間。
將主板上的ROM空間納入iomem_resource樹中;系統固有的I/O類資源則納入ioport_resource樹
/usr/src/linux/kernel/resource.c
----------------------------------------
struct resource ioport_resource = {
.name = "PCI IO",
.start -= 0,
.end = IO_SPACE_LIMIT,
.flags -= IORESOURCE_IO,
};
struct resource iomem_resource = {
.name = "PCI mem",
.start -= 0,
.end = -1,
.flags -= IORESOURCE_MEM,
};