?? setup.c.txt
字號:
any problems,send mails to lysindybear@sina.com.cn
相關函數
/arch/i386/e820.c
這個函數是系統啟動以后的主要的初始化函數,包括對主板的識別,內存的識別
void __init setup_arch(char **cmdline_p)
……
parse_mem_cmdline(cmdline_p); //解析在lilo或者grub中所配置的參數,例如append mem="640M"
start_pfn = PFN_UP(__pa(&_end));
max_pfn = 0;
for (i = 0; i < e820.nr_map; i++) {
unsigned long start, end;
/* RAM? */
if (e820.map[i].type != E820_RAM)
continue;
start = PFN_UP(e820.map[i].addr);
end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
if (start >= end)
continue;
if (end > max_pfn)
max_pfn = end;
} //紀錄監測到的內存的開始和結束,按4k頁計算。最后將最大頁號記錄到變量max_pfn中
…… //對內存大小進行有效性驗證
highstart_pfn = highend_pfn = max_pfn;
if (max_pfn > MAXMEM_PFN) {
highstart_pfn = MAXMEM_PFN;
printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
pages_to_mb(highend_pfn - highstart_pfn));
} //紀錄highstart_pfn,也就是high_memory的開始頁號
…… //對內存按照啟動要求配置bootmem,啟動以后用不著了
paging_init(); //這是最為重要的一個函數,進行頁表初始化
probe_roms(); //監測所有的ROM
for (i = 0; i < e820.nr_map; i++) {
request_resource(&iomem_resource, res);
…… //為監測到的內存使用request_resource將資源放入到資源樹中
}
請求io資源
for (i = 0; i < STANDARD_IO_RESOURCES; i++)
request_resource(&ioport_resource, standard_io_resources+i);
}
static void __init probe_roms(void) //統一將系統中的ROM資源放入資源樹中
// video ROM 的范圍 C000:0000 - C7FF:0000, 監察 signature
for (base = 0xC0000; base < 0xE0000; base += 2048)
request_resource(&iomem_resource, rom_resources + roms);//加入資源樹中
// 擴展 roms 在 C800:0000 - DFFF:0000
for (base = 0xC8000; base < 0xE0000; base += 2048)
request_resource(&iomem_resource, rom_resources + roms);//加入資源樹中
/* 最后檢查主板上的 rom 范圍 E000:0000 */
base = 0xE0000;
romstart = bus_to_virt(base);
request_resource(&iomem_resource, rom_resources + roms);//加入資源樹中
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -