📄 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 + -