我正在使用具有1GB RAM的32位嵌入式系统,该系统具有不寻常的配置。存在由外部硬件使用的32MB RAM(DDR)区域。在Linux内核执行之前,该区域具有由硬件定义的大小和对齐要求,并且物理地址和大小在引导期间是固定的。该系统还有两个独立的CPU(在同一个CPU上不是2个核心),每个CPU运行Linux,共享相同的1GB RAM,同时还需要同时访问32MB的RAM区域。
我需要为每个CPU提供任意数量的RAM来运行Linux,我还需要允许每个CPU访问32MB区域。我通过在内核命令行上指定内存映射来完成所有这些工作(例如,对于CPU1 memmap = 512M @ 0和CPU2 memmap = 512M @ 512M),并使用memmap = 32M $ XXXX来保留32MB区域。当内核启动时,我使用ioremap将32MB区域映射到每个内核虚拟地址空间,以便它可以访问该区域。
但是,我发现,为了保持软件与现有内核驱动程序的兼容性,我需要将32MB区域映射到两个内核中。 "逻辑"地址空间,以便phys_to_virt和virt_to_phys可以工作。当然,在使用ioremap时,32MB区域会映射到vmalloc区域,因此phys_to_virt和virt_to_phys不会按需运行。
我没有找到任何方法来完成我需要对现有命令行或构建配置选项做的事情。
从高层来看,我认为内核'页表条目没有指定物理/逻辑内存映射中的间隙(即memmap = 32M $ XXXX),我需要做的是确保那些页表条目具有相同的信息,就像差距是从未指定。或者找到一种方法来预约"在将逻辑地址空间映射到页表之后,来自内核的物理RAM的特定区域。无论哪种方式,任何操作都需要在内核开始使用内存之前完成。