/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映射的設備寄存器。