板級文件中的struct resource結構體
linux對掛接在4G總線空間上的設備實體的管理方式 -- struct resource
/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,
};
/usr/src/linux/include/asm-i386/io.h
#define IO_SPACE_LIMIT 0xffff
0 ~ 0xffff <===> 64K