关于linux uboot下的MMU 了解

在平台头文件通常有

#ifdef CONFIG_ENABLE_MMU
#define virt_to_phys(x) virt_to_phy_smdkc110(x)
#else
#define virt_to_phys(x) (x)
#endif

 

这里居然是虚拟地址转换成物理地址,没有物理地址转换成虚拟地址的东西?

在do_movi 函数里面有


  if (addr >= 0xc0000000)
   addr = virt_to_phys(addr);

在do_bootm函数也有

 addr = virt_to_phys(addr);

这个定义

#ifdef CONFIG_ENABLE_MMU
#define virt_to_phys(x) virt_to_phy_smdkc110(x)
#else
#define virt_to_phys(x) (x)
#endif

可以解释,即使我在关掉MMU的情况下,不改默认的启动环境变量,照样也能正常启动内核,因为在上面的两个关键函数里面都转换成最终的物理地址了!

#define CONFIG_BOOTCOMMAND "movi read kernel C0008000; movi read rootfs 30A00000 180000; bootm C0008000 30A00000"

看看 virt_to_phy_smdkc110(x)
这个怎么来的吧。

 

#ifdef CONFIG_ENABLE_MMU

#ifdef CONFIG_MCP_SINGLE
ulong virt_to_phy_smdkc110(ulong addr)
{
	if ((0xc0000000 <= addr) && (addr < 0xd0000000))
		return (addr - 0xc0000000 + 0x20000000);
	else
		printf("The input address don't need "\
			"a virtual-to-physical translation : %08lx\n", addr);

	return addr;
}
#else
ulong virt_to_phy_smdkc110(ulong addr)
{
	if ((0xc0000000 <= addr) && (addr < 0xd0000000))
		return (addr - 0xc0000000 + 0x30000000);
	else if ((0x30000000 <= addr) && (addr < 0x50000000))
		return addr;
	else
		printf("The input address don't need "\
			"a virtual-to-physical translation : %08lx\n", addr);

	return addr;
}
#endif

#endif

你可能感兴趣的:(关于linux uboot下的MMU 了解)