蜗窝科技

外设的寄存器是否映射到了物理内存中?还是有独立的内存空间?

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 peter · 2016-05-19 · 5 帖

本文是原「蜗窝讨论区」的历史存档(2016-05-19),来自版块「Linux kernel技术问答」,共 5 帖。讨论区已停止服务,此处仅供查阅。

peter · 2016-05-19 11:35

SOC处理器中外设的寄存器是否映射到了物理内存中?也就是说在系统跑起来后,通过free看到的物理内存小于真正的物理内存大小,其中有一部分分配给了外设的寄存器?

Codingbelief · 2016-05-19 16:42

> SOC处理器中外设的寄存器是否映射到了物理内存中? SOC处理器有其物理地址空间,SOC 会为外设和物理内存分配不同的物理地址区域,这部分内容会在 SOC 的 Datasheet 中描述。在内核中,则会将这些不同的物理地址区域,映射到虚拟地址空间。最后,内核再通过虚拟地址访问到内存和外设。 ** > 也就是说在系统跑起来后,通过free看到的物理内存小于真正的物理内存大小,其中有一部分分配给了外设的寄存器?** free看到的物理内存小于真正的物理内存大小,应该是由于部分物理内存没有映射到内核,保留给其他模块使用(例如 GPU、TEE、Camera 等)。 外设的寄存器不会占用物理内存,会占用虚拟地址空间。

wowo · 2016-05-19 16:43

Codingbelief 写道: > SOC处理器中外设的寄存器是否映射到了物理内存中? SOC处理器有其物理地址空间,SOC 会为外设和物理内存分配不同的物理地址区域,这部分内容会在 SOC 的 Datasheet 中描述。在内核中,则会将这些不同的物理地址区域,映射到虚拟地址空间。最后,内核再通过虚拟地址访问到内存和外设。 ** > 也就是说在系统跑起来后,通过free看到的物理内存小于真正的物理内存大小,其中有一部分分配给了外设的寄存器?** free看到的物理内存小于真正的物理内存大小,应该是由于部分物理内存没有映射到内核,保留给其他模块使用(例如 GPU、TEE、Camera 等)。 外设的寄存器不会占用物理内存,会占用虚拟地址空间。

正解。

wowo · 2016-05-19 16:44

我多补充一些信息:

kernel启动后,通过free或者cat /proc/meminfo,看到的Total memory,并不是真实的memory大小。因为在kernel睁开眼,看到memory之前,有些memory已经被“吃掉(reserved)”了。 reserved的memory主要有三类,以ARM64为例(可参考arm64_memblock_init,使用的内核版本是4.0.5) memblock_reserve(__pa(_text), _end - _text); / kernel image的代码段 / early_init_fdt_scan_reserved_mem(; / 命令行或者DTS中明确指明的 / dma_contiguous_reserve(arm64_dma_phys_limit); / 连续内存 /

以我手上一个树莓派为例,修改/boot/cmdline.txt,增加“memblock=debug”后启动,如下: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait memblock=debug

可以看到相应的reserved的信息: [ 0.000000] Machine model: Raspberry Pi 2 Model B Rev 1.1 [ 0.000000] memblock_reserve: [0x00000000008240-0x0000000093f79b] flags 0x0 memblock_reserve+0x18/0x1c [ 0.000000] memblock_reserve: [0x00000000004000-0x00000000007fff] flags 0x0 memblock_reserve+0x18/0x1c [ 0.000000] memblock_reserve: [0x0000003afecb00-0x0000003afeffab] flags 0x0 memblock_reserve+0x18/0x1c [ 0.000000] memblock_reserve: [0x0000003a400000-0x0000003abfffff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] cma: Reserved 8 MiB at 0x3a400000 [ 0.000000] MEMBLOCK configuration: [ 0.000000] memory size = 0x3b000000 reserved size = 0x113ea08 [ 0.000000] memory.cnt = 0x1 [ 0.000000] memory[0x0] [0x00000000000000-0x0000003affffff], 0x3b000000 bytes flags: 0x0 [ 0.000000] reserved.cnt = 0x4 [ 0.000000] reserved[0x0] [0x00000000004000-0x00000000007fff], 0x4000 bytes flags: 0x0 [ 0.000000] reserved[0x1] [0x00000000008240-0x0000000093f79b], 0x93755c bytes flags: 0x0 [ 0.000000] reserved[0x2] [0x0000003a400000-0x0000003abfffff], 0x800000 bytes flags: 0x0 [ 0.000000] reserved[0x3] [0x0000003afecb00-0x0000003afeffab], 0x34ac bytes flags: 0x0 [ 0.000000] Memory policy: Data cache writealloc [ 0.000000] memblock_reserve: [0x0000003affffd8-0x0000003affffff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003affe000-0x0000003affefff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003affd000-0x0000003affdfff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003affc000-0x0000003affcfff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003affb000-0x0000003affbfff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff8000-0x0000003aff9fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003affa000-0x0000003affafff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffe48-0x0000003affffd7] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff7000-0x0000003aff7fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff6000-0x0000003aff6fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff5000-0x0000003aff5fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff4000-0x0000003aff4fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff3000-0x0000003aff3fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003aff2000-0x0000003aff2fff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] On node 0 totalpages: 241664 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 8699904 bytes align=0x0 nid=0 from=0x0 max_addr=0x0 alloc_node_mem_map.constprop.7+0x7c/0xa4 [ 0.000000] memblock_reserve: [0x00000039bb4000-0x0000003a3fffff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] free_area_init_node: node 0, pgdat 80876f80, node_mem_map b9bb4000 [ 0.000000] Normal zone: 2124 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 241664 pages, LIFO batch:31 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 120 bytes align=0x0 nid=0 from=0x0 max_addr=0x0 free_area_init_node+0x2bc/0x358 [ 0.000000] memblock_reserve: [0x0000003afffdc0-0x0000003afffe37] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 12288 bytes align=0x0 nid=0 from=0x0 max_addr=0x0 zone_wait_table_init+0x88/0xf4 [ 0.000000] memblock_reserve: [0x0000003afe9b00-0x0000003afecaff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 28 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 setup_arch+0x5f8/0x934 [ 0.000000] memblock_reserve: [0x0000003afffd80-0x0000003afffd9b] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_reserve: [0x0000003afe12dc-0x0000003afe9aff] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffda4-0x0000003afffdbe] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffd64-0x0000003afffd7e] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffd48-0x0000003afffd60] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffd30-0x0000003afffd47] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffd18-0x0000003afffd2f] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffcfc-0x0000003afffd14] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffce4-0x0000003afffcfb] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] memblock_reserve: [0x0000003afffccc-0x0000003afffce3] flags 0x0 memblock_alloc_range_nid+0x74/0x88 [ 0.000000] [bcm2709_smp_init_cpus] enter (9420->f3003010) [ 0.000000] [bcm2709_smp_init_cpus] ncores=4 [ 0.000000] memblock_virt_alloc_try_nid: 462 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 start_kernel+0xdc/0x3dc [ 0.000000] memblock_reserve: [0x0000003afffac0-0x0000003afffc8d] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 462 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 start_kernel+0x100/0x3dc [ 0.000000] memblock_reserve: [0x0000003afff8c0-0x0000003afffa8d] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 462 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 start_kernel+0x124/0x3dc [ 0.000000] memblock_reserve: [0x0000003afff6c0-0x0000003afff88d] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 4096 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_alloc_alloc_info+0x54/0x90 [ 0.000000] memblock_reserve: [0x0000003aff1000-0x0000003aff1fff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 4096 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_embed_first_chunk+0x510/0x7bc [ 0.000000] memblock_reserve: [0x0000003aff0000-0x0000003aff0fff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 196608 bytes align=0x1000 nid=-1 from=0x7fffffff max_addr=0x0 pcpu_dfl_fc_alloc+0x2c/0x34 [ 0.000000] memblock_reserve: [0x0000003afb1000-0x0000003afe0fff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] __memblock_free_early: [0x0000003afbd000-0x0000003afbcfff] pcpu_dfl_fc_free+0x14/0x18 [ 0.000000] __memblock_free_early: [0x0000003afc9000-0x0000003afc8fff] pcpu_dfl_fc_free+0x14/0x18 [ 0.000000] __memblock_free_early: [0x0000003afd5000-0x0000003afd4fff] pcpu_dfl_fc_free+0x14/0x18 [ 0.000000] __memblock_free_early: [0x0000003afe1000-0x0000003afe0fff] pcpu_dfl_fc_free+0x14/0x18 [ 0.000000] PERCPU: Embedded 12 pages/cpu @bafb1000 s20416 r8192 d20544 u49152 [ 0.000000] memblock_virt_alloc_try_nid: 4 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x32c/0xa20 [ 0.000000] memblock_reserve: [0x0000003afffe40-0x0000003afffe43] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 4 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x34c/0xa20 [ 0.000000] memblock_reserve: [0x0000003afffcc0-0x0000003afffcc3] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 16 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x36c/0xa20 [ 0.000000] memblock_reserve: [0x0000003afff680-0x0000003afff68f] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 16 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x38c/0xa20 [ 0.000000] memblock_reserve: [0x0000003afff640-0x0000003afff64f] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] pcpu-alloc: s20416 r8192 d20544 u49152 alloc=12*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [ 0.000000] memblock_virt_alloc_try_nid: 120 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x784/0xa20 [ 0.000000] memblock_reserve: [0x0000003afff5c0-0x0000003afff637] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 68 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x7cc/0xa20 [ 0.000000] memblock_reserve: [0x0000003afff540-0x0000003afff583] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] memblock_virt_alloc_try_nid: 68 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 pcpu_setup_first_chunk+0x910/0xa20 [ 0.000000] memblock_reserve: [0x0000003afff4c0-0x0000003afff503] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] __memblock_free_early: [0x0000003aff1000-0x0000003aff1fff] pcpu_free_alloc_info+0x1c/0x20 [ 0.000000] __memblock_free_early: [0x0000003aff0000-0x0000003aff0fff] pcpu_embed_first_chunk+0x7a4/0x7bc [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 239540 [ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2709.boardrev=0xa21041 bcm2709.serial=0xcfed5978 smsc95xx.macaddr=B8:27:EB:ED:59:78 bcm2708_fb.fbswap=1 bcm2709.uart_clock=3000000 bcm2709.disk_led_gpio=47 bcm2709.disk_led_active_low=0 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait memblock=debug [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 16384 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 alloc_large_system_hash+0x158/0x25c [ 0.000000] memblock_reserve: [0x0000003afad000-0x0000003afb0fff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 524288 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 alloc_large_system_hash+0x158/0x25c [ 0.000000] memblock_reserve: [0x0000003af2d000-0x0000003afacfff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes) [ 0.000000] memblock_virt_alloc_try_nid_nopanic: 262144 bytes align=0x0 nid=-1 from=0x0 max_addr=0x0 alloc_large_system_hash+0x158/0x25c [ 0.000000] memblock_reserve: [0x0000003aeed000-0x0000003af2cfff] flags 0x0 memblock_virt_alloc_internal+0x154/0x190 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000] Memory: 939420K/966656K available (6024K kernel code, 534K rwdata, 1660K rodata, 448K init, 757K bss, 19044K reserved, 8192K cma-reserved)

peter · 2016-05-19 21:45

谢谢两位的分析,学习了!