1. 程式人生 > >linux通過結構體struct resource描述一個具體的硬體

linux通過結構體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;
};


    一個獨立的掛接在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
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(737) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議