如何为使用ARCH_MULTIPLATFORM = y的ARM平台指定物理内存偏移?

时间:2019-01-06 16:33:03

标签: linux linux-kernel memory-address device-tree

背景:

我正在将内核升级到基于ARMv7的SoC上的4.9版。较早的内核使用单一平台构建(ARCH_MULTIPLATFORM = n),因此PHYS_OFFSET已启用以接受我的系统自定义物理RAM起始地址。使用新内核,启用设备树并打开ARCH_MULTIPLATFORM时,内核配置中没有用于设置phy_offset值的选项。

问题:

我平台的物理内存起始地址为0x8000_0000。但是视频子系统使用前16MB作为视频帧缓冲区,因此系统RAM的物理起始地址为0x8100_0000。我指定了设备树内存节点,如下所示:

memory {
         device_type = "memory";
         reg = <0x81000000 0X1e000000>;
     };

系统启动后,内核将无问题运行,直到打开视频为止。视频子系统开始使用分配的内存区域(0x80000000至81000000)时,Linux崩溃。
通过分析内存分配,可以发现系统RAM正在使用RAM的帧缓冲区,尽管设备树中的起始地址被省略了,但是内存分配没有变化。

EVONLY_ENV$cat /proc/iomem
40415000-40415fff : serial
40416000-40416fff : serial
40430000-40430fff : serial
40431000-40431fff : serial
40432000-40432fff : serial
40500000-40500fff : /amba/eth0@40500000
40600000-40600fff : /amba/eth1@40600000
80000000-8effffff : System RAM
80008000-807fffff : Kernel code
80e00000-80e7860f : Kernel data

还尝试添加一个保留内存节点,该节点的帧缓冲区由no-map指令保留:

 memory {
     device_type = "memory";
     reg = <0x80000000 0x20000000>;
 };

 reserved-memory {
     #address-cells = <1>;
     #size-cells = <1>;
     ranges;

     /*16 MB video RAM at the start*/
     vid_ram: vram@80000000 {
         reg = <0x80000000 0x1000000>;
         no-map;
     };

如何完全省略内核用于分页的初始16MB RAM空间?
有任何设备树选项可以做到吗?还是任何命令行选项?

问题一经解决(我的旧内核版本的输出没有设备树和多平台支持),我正在寻找以下系统RAM分配方案:

EVONLY_ENV$cat /proc/iomem
40100800-401008ff : pdriver
40415000-4041501f : serial
40416000-4041601f : serial
40430000-4043001f : serial
40431000-4043101f : serial
40432000-4043201f : serial
40c00000-40c001ff : sdhc0
40c01000-40c011ff : sdhc1
40c02000-40c021ff : emmc
70800000-77ffffff : PCI Memory Space
81000000-8fffffff : System RAM
81008000-81626be7 : Kernel code
81d9c000-81e5dff3 : Kernel data

0 个答案:

没有答案