我们遇到了一些新问题,有些人会说是好问题。我们当时还没有引导加载程序,但是我们需要在启动时将命令行传递给内核。我们将命令行硬编码到内核中的parse_options(). 完成之后,我们使console_init()和serial_console_setup()按预期方式工作。它们不再忽略命令行,但 RTS 和 DTR 仍然保持低电平。
另一个重要问题是内存映射。文件arch/ppc/mm/init.c包含一个名为MMU_init(). 此函数实际上是一个大型的 switch 语句,按机器类型划分。每台机器都使用setbat()和ioremap()函数来映射其内存。BAT 机制是一种将虚拟地址转换为物理地址的方法。因此,setbat()通过指定虚拟地址、物理地址和页面大小来使用。并非所有大小都可以在此处使用;您应该使用有限大小集合中的一种,范围从 128KB 到 256MB。我们映射了我们的 IO 内存,以便虚拟地址等于物理地址。
如前所述,还有另一种内存映射方法 -ioremap(). ioremap()用于将物理地址映射到虚拟地址,使其可供内核使用。该函数不分配任何内存,只是返回一个虚拟地址,通过该地址可以访问内存区域。以下代码片段来自MMU_init():
case _MACH_mymachine: setbat(0, LOW_IO_VIRT_BASE, LOW_IO_PHYS_BASE, LOW_IO_SIZE, IO_PAGE); ioremap(UNIVERSE_BASE,UNIVERSE_SIZE); /* Universe VME */ ioremap(EEPRO100_BASE,EEPRO100_SIZE); /* Ethernet EEPRO100 */ break; |