/proc/iomem

/proc/iomem這個文件記錄的是物理地址的分配情況,內存只佔用4G(32位CPU)物理地址的一部分,一般從地址0開始,每一行都代表一個資源(地址範圍和資源名), 可用物理內存的資源名爲“System RAM”,如

01000000-35aeffff : System RAM

這個是由e820表中的 E820_RAM類型的表項通過insert_resource這個API註冊到iomem_resource這顆資源樹上的,

if (e820.map[i].type != E820_RESERVED || res->start < (1ULL<<20)) {
                        res->flags |= IORESOURCE_BUSY; 
                        insert_resource(&iomem_resource, res);
                }


其它類型:

01200000-0188b446 : Kernel code
  0188b447-01bae6ff : Kernel data
  01c33000-01dbbfff : Kernel bss

這些地址範圍都是基於物理地址的

@  arch/x86/kernel/setup.c

    code_resource.start = virt_to_phys(_text);
    code_resource.end = virt_to_phys(_etext)-1;
    data_resource.start = virt_to_phys(_etext);
    data_resource.end = virt_to_phys(_edata)-1;
    bss_resource.start = virt_to_phys(&__bss_start);
    bss_resource.end = virt_to_phys(&__bss_stop)-1;


    insert_resource(&iomem_resource, &code_resource);

    insert_resource(&iomem_resource, &data_resource);

    insert_resource(&iomem_resource, &bss_resource); 


一般平臺設備的定義中會定義該設備所擁有的資源(MMIO)來申請該設備所佔用的物理地址範圍,然後在平臺驅動的註冊函數內部會調用insert_resource函數將設備的物理地址資源註冊到資源樹中。


API:  page_is_ram(pfn)

這個函數會判定給定的頁框號是否屬於物理內存,其實現主要是在iomem_resource 這顆資源樹上查找名爲"System Ram" 的資源,如果包含在其中的話,就說明該頁框號屬於物理內存而不是通過MMIO映射的設備寄存器。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章