前言

在上一篇博文 页表查询过程简述 中,简单阐述了处理器访问页表的基本原理,以ARMv8 为例简单介绍了分页的机制。这一篇会接着继续阐述进程在编译时和运行时,其内存的分布情况。最后简单阐述在arm64 系统中虚拟地址的分布情况。

内存

简单地说,存就是一个数据货架。内存有一个最小的存储单位,大多数都是一个字节。内存用内存地址(memory address )来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址从0开始,每次增加1。这种线性增加的存储器地址称为线性地址(linear address)。为了方便,我们用十六进制数来表示内存地址,比如0x00000003、0x1A010CB0。这里的“0x”用来表示十六进制。“0x”后面跟着的,就是作为内存地址的十六进制数。

内存地址的编号有上限。地址空间的范围和地址总线(address bus)的位数直接相关。CPU通过地址总线来向内存说明想要存取数据的地址。以英特尔32位的80386型CPU为例,这款CPU有32个针脚可以传输地址信息。每个针脚对应了一位。如果针脚上是高电压,那么这一位是1。如果是低电压,那么这一位是0。32位的电压高低信息通过地址总线传到内存的32个针脚,内存就能把电压高低信息转换成32位的二进制数,从而知道CPU想要的是哪个位置的数据。用 十六进制 表示,32位地址空间就是从0x00000000 到0xFFFFFFFF。

内存的存储单元采用了 随机读取存储器RAMRandom Access Memory)。所谓的“随机读取”,是指存储器的读取时间和数据所在位置无关。与之相对,很多存储器的读取时间和数据所在位置有关。就拿磁带来说,我们想听其中的一首歌,必须转动带子。如果那首歌是第一首,那么立即就可以播放。如果那首歌恰巧是最后一首,我们快进到可以播放的位置就需要花很长时间。我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。

内存提供的存储空间,除了能满足内核的运行需求,还通常能支持运行中的进程。即使进程所需空间超过内存空间,内存空间也可以通过少量拓展来弥补。换句话说,内存的存储能力,和计算机运行状态的数据总量相当。内存的缺点是不能持久地保存数据。一旦断电,内存中的数据就会消失。因此,计算机即使有了内存这样一个主存储器,还是需要硬盘这样的外部存储器来提供持久的储存空间。

虚拟地址的由来

为什么会出现虚拟内存呢?这就要从最初的操作系统来说起了,最初的操作系统并没有现在那么完善,刚开始的时候,程序是直接装载到物理内存中的。这就导致了下面的一些问题:

  • 程序编写困难。
  • 修改内存数据导致程序崩溃。

先说问题1、为什么会导致程序编写困难呢?因为,操作系统是同时运行好多程序的,编写的程序是直接操作物理内存的,编写的时候就要考虑,自己的程序操作的内存地址,是否已经被其他程序占用了,如果被占用了的话,就要重新编写程序,重新安排程序的操作地址。

再看问题2。因为是直接操作物理内存,这就意味着一个程序可以操作内存中的所有地址,如果有恶意程序修改了其他程序在用的地址中的数据,这就可能导致其他程序崩溃。

虚拟内存概念的出现就解决了上面的问题,虚拟内存的概念出现后,程序的编写就不再直接操作物理内存了,对每个程序来说,它们就相当于拥有了所有的内存空间,可以随意操作,就不用担心自己操作的内存地址被其他程序占用的问题了。同时,因为程序操作的是虚拟内存地址,这样就不会出现因为修改了其他应用程序内存地址中的数据而导致其他应用程序崩溃的问题了。

虚拟内存

每个进程都拥有自己的虚拟内存地址,不同的硬件对应不同的虚拟内存。

对于32位的处理器x86来说,每个进程可以拥有4G的虚拟内存。其中,0x08048000 ~ 0xBFFFFFFF(3G大小,最低的128M内存没用)表示用于空间,0xC0000000 ~ 0xFFFFFFFF(1G大小)表示内核空间。

对于64位的处理器来说,一般会保留48位的虚拟内存,大概是 256TB 的虚拟内存空间。为什么不是所有的 64 位,这个应该是综合考虑,虚拟地址对应物理地址最终需要形成一个映射的页表,64位的虚拟内存可能造成资源的浪费,48位对应于目前的物理内存的硬件限制已经是足够了。其中( 针对的是 4 级页表),0x0000000000000000~0x00007FFFFFFFFFFF 表示用户空间, 0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF 表示内核空间。

在我司的android项目中基本是设置的39bit物理地址,48bit虚拟地址,可以通过如下的配置项查看

CONFIG_ARM64_VA_BITS_39=y
CONFIG_ARM64_VA_BITS=39
CONFIG_ARM64_PA_BITS_48=y
CONFIG_ARM64_PA_BITS=48

从进程角度看内存分布

Linux 系统中,应用程序常用的可执行文件格式是可执行与可链接格式(Executable Linkable FormatELF),它是一种对象文件的格式,用以定义不同类型的对象文件中都放了什么东西,以及以什么格式存放这些东西。ELF 结构如图所示:

elf文件结构图

当编译好源代码后,可执行文件的分布信息可以通过命令objdump 或 readelf 获取。此处以wpa_supplicant进程为例。

读取文件ELF Header

iliuqi:/ # readelf -h /vendor/bin/hw/wpa_supplicant
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           arm64
  Version:                           0x1
  Entry point address:               0xd5000
  Start of program headers:          64 (bytes into file)
  Start of section headers:          3580392 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         11
  Size of section headers:           64 (bytes)
  Number of section headers:         27
  Section header string table index: 25

读取文件的程序头(program headers)

flame:/ # readelf -l /vendor/bin/hw/wpa_supplicant

Elf file type is DYN (Shared object file)
Entry point 0xd5000
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz MemSiz  Flg Align
  PHDR           0x000040 0x0000000000000040 0x0000000000000040 0x00268 0x00268 R   0x8
  INTERP         0x0002a8 0x00000000000002a8 0x00000000000002a8 0x00015 0x00015 R   0x1
      [Requesting program interpreter: /system/bin/linker64]
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0xd4294 0xd4294 R   0x1000
  LOAD           0x0d5000 0x00000000000d5000 0x00000000000d5000 0x27af20 0x27af20 R E 0x1000
  LOAD           0x350000 0x0000000000350000 0x0000000000350000 0x0bb58 0x0bb58 RW  0x1000
  LOAD           0x35bb58 0x000000000035cb58 0x000000000035cb58 0x00d14 0x08c08 RW  0x1000
  DYNAMIC        0x35a1a0 0x000000000035a1a0 0x000000000035a1a0 0x00350 0x00350 RW  0x8
  GNU_RELRO      0x350000 0x0000000000350000 0x0000000000350000 0x0bb58 0x0c000 R   0x1
  GNU_EH_FRAME   0x0ad45c 0x00000000000ad45c 0x00000000000ad45c 0x06ef4 0x06ef4 R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x00000 0x00000 RW  0
  NOTE           0x0002c0 0x00000000000002c0 0x00000000000002c0 0x00038 0x00038 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.android.ident .note.gnu.build-id .dynsym .gnu.version .gnu.version_r .gnu.hash .dynstr .rela.dyn .rela.plt .rodata .eh_frame_hdr .eh_frame
   03     .text .plt
   04     .preinit_array .init_array .fini_array .data.rel.ro .dynamic .got .got.plt
   05     .data
   06     .dynamic
   07     .preinit_array .init_array .fini_array .data.rel.ro .dynamic .got .got.plt
   08     .eh_frame_hdr
   09
   10     .note.android.ident .note.gnu.build-id

程序在编译、链接时会尽量把相同权限属性的段分配在同一空间里,如把可读、可执行的段放在一起,包括代码段、init 段等;把可读、可写的段放在一起,包括数据段和未初始化的数据段等。ELF 把这些属性相似并且链接在一起的段叫做分段(segment) 。进程在加载时是按照这些分段来映射可执行文件的。

描述这些分段的结构叫做程序头(program header)。上面的信息提示有 11 个程序头,起始偏移地址是0x40(见 PHDR)。

LOAD 类型的分段在加载时需要映射,其他的分段在加载时起辅助作用。第一个LOAD 段只是只读权限,包括 .rodata、.dynsym 等,映射的虚拟地址从 0 开始,长度为0xd4294;第二个LOAD 段有读和执行权限,包括 .text 段、.plt 段,映射的虚拟地址从 0x0d5000开始,长度为0x27af20。

读取文件的节信息(section headers)

flame:/ # readelf -S /vendor/bin/hw/wpa_supplicant
There are 27 section headers, starting at offset 0x36a1e8:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0  0  0
  [ 1] .interp           PROGBITS        00000000000002a8 0002a8 000015 00   A  0  0  1
  [ 2] .note.android.ident NOTE            00000000000002c0 0002c0 000018 00   A  0  0  4
  [ 3] .note.gnu.build-id NOTE            00000000000002d8 0002d8 000020 00   A  0  0  4
  [ 4] .dynsym           DYNSYM          00000000000002f8 0002f8 005e80 18   A  8  1  8
  [ 5] .gnu.version      VERSYM          0000000000006178 006178 0007e0 02   A  4  0  2
  [ 6] .gnu.version_r    VERNEED         0000000000006958 006958 0000c0 00   A  8  4  4
  [ 7] .gnu.hash         GNU_HASH        0000000000006a18 006a18 000604 00   A  4  0  8
  [ 8] .dynstr           STRTAB          000000000000701c 00701c 00940b 00   A  0  0  1
  [ 9] .rela.dyn         RELA            0000000000010428 010428 012330 18   A  4  0  8
  [10] .rela.plt         RELA            0000000000022758 022758 003ea0 18  AI  4 22  8
  [11] .rodata           PROGBITS        0000000000026600 026600 086e5c 00 AMS  0  0 16
  [12] .eh_frame_hdr     PROGBITS        00000000000ad45c 0ad45c 006ef4 00   A  0  0  4
  [13] .eh_frame         PROGBITS        00000000000b4350 0b4350 01ff44 00   A  0  0  8
  [14] .text             PROGBITS        00000000000d5000 0d5000 278538 00  AX  0  0 4096
  [15] .plt              PROGBITS        000000000034d540 34d540 0029e0 00  AX  0  0 16
  [16] .preinit_array    PREINIT_ARRAY   0000000000350000 350000 000010 00  WA  0  0  8
  [17] .init_array       INIT_ARRAY      0000000000350010 350010 000018 00  WA  0  0  8
  [18] .fini_array       FINI_ARRAY      0000000000350028 350028 000010 00  WA  0  0  8
  [19] .data.rel.ro      PROGBITS        0000000000350038 350038 00a168 00  WA  0  0  8
  [20] .dynamic          DYNAMIC         000000000035a1a0 35a1a0 000350 10  WA  8  0  8
  [21] .got              PROGBITS        000000000035a4f0 35a4f0 000170 00  WA  0  0  8
  [22] .got.plt          PROGBITS        000000000035a660 35a660 0014f8 00  WA  0  0  8
  [23] .data             PROGBITS        000000000035cb58 35bb58 000d14 00  WA  0  0  8
  [24] .bss              NOBITS          000000000035d870 35c86c 007ef0 00  WA  0  0 16
  [25] .shstrtab         STRTAB          0000000000000000 35c86c 00010f 00      0  0  1
  [26] .gnu_debugdata    PROGBITS        0000000000000000 35c97b 00d868 00      0  0  1
Key:
  (W)rite, (A)lloc, e(X)ecute, (M)erge, (S)trings, (I)nfo
  (L)ink order, (O)S, (G)roup, (T)LS, (C)ompressed, x=unknown

共有27段,这里的段指的是 section,与上面的分段 segment 是不同的。segment 是将这些27段section 链接成了11 segment。

例如第14、15 段的 .text 和 .plt:

  • .text:从0xd5000开始,size 为0x278538
  • .plt: 从0x34d540开始,size 为0x0029e0

正好对应 segment 的03,即第二个 LOAD,从0xd5000开始,size 为0x27af20;

上面是从 静态的角度 来看进程的内存管理,下面从 动态角度 来看下。Linux 操作系统提供了 proc 文件系统来窥探 Linux 内核的执行情况,每个进程执行之后,在 /proc/pid/maps 节点会列出当前进程的地址映射情况。

flame:/ # cat /proc/3305/maps
5d099d9000-5d09aae000 r--p 00000000 fe:04 426240                         /vendor/bin/hw/wpa_supplicant
5d09aae000-5d09d29000 r-xp 000d5000 fe:04 426240                         /vendor/bin/hw/wpa_supplicant
5d09d29000-5d09d35000 r--p 00350000 fe:04 426240                         /vendor/bin/hw/wpa_supplicant
5d09d35000-5d09d37000 rw-p 0035b000 fe:04 426240                         /vendor/bin/hw/wpa_supplicant
5d09d37000-5d09d3f000 rw-p 00000000 00:00 0                              [anon:.bss]
7be3e0c000-7be497a000 ---p 00000000 00:00 0
7be497a000-7be497c000 rw-p 00000000 00:00 0
7be497c000-7be4e0c000 ---p 00000000 00:00 0
7be4e0c000-7be4e0d000 ---p 00000000 00:00 0
7be4e0d000-7be4f08000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3403]
7be4f08000-7be4f09000 ---p 00000000 00:00 0
7be4f09000-7be52da000 ---p 00000000 00:00 0
7be52da000-7be52dc000 rw-p 00000000 00:00 0
7be52dc000-7be5f09000 ---p 00000000 00:00 0
7be5f09000-7be5f0a000 ---p 00000000 00:00 0
7be5f0a000-7be6005000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3396]
7be6005000-7be6006000 ---p 00000000 00:00 0
7be6006000-7be62d8000 ---p 00000000 00:00 0
7be62d8000-7be62da000 rw-p 00000000 00:00 0
7be62da000-7be7006000 ---p 00000000 00:00 0
7be7006000-7be7007000 ---p 00000000 00:00 0
7be7007000-7be7102000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3395]
7be7102000-7be7103000 ---p 00000000 00:00 0
7be7103000-7be74c6000 ---p 00000000 00:00 0
7be74c6000-7be74c8000 rw-p 00000000 00:00 0
7be74c8000-7be8a88000 ---p 00000000 00:00 0
7be8a88000-7be8a8a000 rw-p 00000000 00:00 0
7be8a8a000-7be9103000 ---p 00000000 00:00 0
7be9103000-7be9104000 ---p 00000000 00:00 0
7be9104000-7be91ff000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3394]
7be91ff000-7be9200000 ---p 00000000 00:00 0
7be9200000-7be9600000 rw-p 00000000 00:00 0                              [anon:libc_malloc]
7be9606000-7be9607000 ---p 00000000 00:00 0
7be9607000-7be9702000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3393]
7be9702000-7be9703000 ---p 00000000 00:00 0
7bea703000-7bea704000 ---p 00000000 00:00 0
7bea704000-7bea7ff000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:3391]
7bea7ff000-7bea800000 ---p 00000000 00:00 0
7bea800000-7beb000000 rw-p 00000000 00:00 0                              [anon:libc_malloc]
7beb002000-7beb2ea000 ---p 00000000 00:00 0                              [anon:cfi shadow]
7beb2ea000-7beb2eb000 r--p 00000000 00:00 0                              [anon:cfi shadow]
7beb2eb000-7beb3e5000 ---p 00000000 00:00 0                              [anon:cfi shadow]
7beb3e5000-7beb3e6000 r--p 00000000 00:00 0                              [anon:cfi shadow]
7beb3e6000-7c6b002000 ---p 00000000 00:00 0                              [anon:cfi shadow]
7c6b002000-7c6b041000 r--p 00000000 fe:04 25757617                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.0.so
7c6b041000-7c6b0a4000 r-xp 0003f000 fe:04 25757617                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.0.so
7c6b0a4000-7c6b0b3000 r--p 000a2000 fe:04 25757617                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.0.so
7c6b0b3000-7c6b0b4000 rw-p 000b0000 fe:04 25757617                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.0.so
7c6b0d2000-7c6b12b000 r--p 00000000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b12b000-7c6b19d000 r-xp 00059000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b19d000-7c6b1e7000 --xp 000cb000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b1e7000-7c6b1e9000 r-xp 00115000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b1e9000-7c6b1f9000 r--p 00117000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b1f9000-7c6b1fa000 rw-p 00126000 07:a8 228                            /apex/com.android.vndk.v32/lib64/libcrypto.so
7c6b1fa000-7c6b200000 rw-p 00000000 00:00 0                              [anon:.bss]
7c6b201000-7c6b266000 r--p 00000000 fe:02 17181764                       /system/lib64/libbinder.so
7c6b266000-7c6b2d6000 r-xp 00065000 fe:02 17181764                       /system/lib64/libbinder.so
7c6b2d6000-7c6b2e5000 r--p 000d5000 fe:02 17181764                       /system/lib64/libbinder.so
7c6b2e5000-7c6b2e6000 rw-p 000e3000 fe:02 17181764                       /system/lib64/libbinder.so
7c6b344000-7c6b38f000 r--p 00000000 fe:04 13147881                       /vendor/lib64/android.hardware.wifi.supplicant@1.3.so
7c6b38f000-7c6b3d5000 r-xp 0004b000 fe:04 13147881                       /vendor/lib64/android.hardware.wifi.supplicant@1.3.so
7c6b3d5000-7c6b3e2000 r--p 00091000 fe:04 13147881                       /vendor/lib64/android.hardware.wifi.supplicant@1.3.so
7c6b3e2000-7c6b3e3000 rw-p 0009d000 fe:04 13147881                       /vendor/lib64/android.hardware.wifi.supplicant@1.3.so
7c6b400000-7c6e600000 ---p 00000000 00:00 0
7c6e640000-7c6e6b8000 r--p 00000000 fe:04 13147835                       /vendor/lib64/android.hardware.wifi.supplicant@1.0.so
7c6e6b8000-7c6e75e000 r-xp 00078000 fe:04 13147835                       /vendor/lib64/android.hardware.wifi.supplicant@1.0.so
7c6e75e000-7c6e773000 r--p 0011e000 fe:04 13147835                       /vendor/lib64/android.hardware.wifi.supplicant@1.0.so
7c6e773000-7c6e774000 rw-p 00132000 fe:04 13147835                       /vendor/lib64/android.hardware.wifi.supplicant@1.0.so
7c6e800000-7c6f800000 ---p 00000000 00:00 0
7c6f857000-7c6f859000 r--p 00000000 fe:04 21990247                       /vendor/lib64/libmdmdetect.so
7c6f859000-7c6f85c000 r-xp 00002000 fe:04 21990247                       /vendor/lib64/libmdmdetect.so
7c6f85c000-7c6f85d000 r--p 00005000 fe:04 21990247                       /vendor/lib64/libmdmdetect.so
7c6f85d000-7c6f85e000 rw-p 00005000 fe:04 21990247                       /vendor/lib64/libmdmdetect.so
7c6f889000-7c6f88a000 r--p 00000000 fe:02 19331533                       /system/lib64/libvndksupport.so
7c6f88a000-7c6f88b000 r-xp 00001000 fe:02 19331533                       /system/lib64/libvndksupport.so
7c6f88b000-7c6f88c000 r--p 00002000 fe:02 19331533                       /system/lib64/libvndksupport.so
7c6f88c000-7c6f88d000 rw-p 00002000 fe:02 19331533                       /system/lib64/libvndksupport.so
7c6f8c3000-7c6f8d9000 r--p 00000000 fe:04 24334224                       /vendor/lib64/libqmiservices.so
7c6f8d9000-7c6f8db000 r-xp 00016000 fe:04 24334224                       /vendor/lib64/libqmiservices.so
7c6f8db000-7c6f8ec000 r--p 00018000 fe:04 24334224                       /vendor/lib64/libqmiservices.so
7c6f8ec000-7c6f8ee000 rw-p 00028000 fe:04 24334224                       /vendor/lib64/libqmiservices.so
7c6f929000-7c6f92b000 r--p 00000000 fe:02 17272443                       /system/lib64/libcgrouprc.so
7c6f92b000-7c6f92c000 r-xp 00002000 fe:02 17272443                       /system/lib64/libcgrouprc.so
7c6f92c000-7c6f92d000 r--p 00003000 fe:02 17272443                       /system/lib64/libcgrouprc.so
7c6f92d000-7c6f92e000 rw-p 00003000 fe:02 17272443                       /system/lib64/libcgrouprc.so
7c6f967000-7c6f985000 r--p 00000000 07:a8 265                            /apex/com.android.vndk.v32/lib64/libprocessgroup.so
7c6f985000-7c6f9b6000 r-xp 0001e000 07:a8 265                            /apex/com.android.vndk.v32/lib64/libprocessgroup.so
7c6f9b6000-7c6f9b8000 r--p 0004f000 07:a8 265                            /apex/com.android.vndk.v32/lib64/libprocessgroup.so
7c6f9b8000-7c6f9b9000 rw-p 00050000 07:a8 265                            /apex/com.android.vndk.v32/lib64/libprocessgroup.so
7c6f9d6000-7c6f9e3000 r--p 00000000 fe:02 17181781                       /system/lib64/libbinder_ndk.so
7c6f9e3000-7c6f9f1000 r-xp 0000d000 fe:02 17181781                       /system/lib64/libbinder_ndk.so
7c6f9f1000-7c6f9f3000 r--p 0001b000 fe:02 17181781                       /system/lib64/libbinder_ndk.so
7c6f9f3000-7c6f9f4000 rw-p 0001c000 fe:02 17181781                       /system/lib64/libbinder_ndk.so
7c6fa1a000-7c6fa1b000 r--p 00000000 07:68 45                             /apex/com.android.runtime/lib64/bionic/libdl_android.so
7c6fa1b000-7c6fa1c000 r-xp 00001000 07:68 45                             /apex/com.android.runtime/lib64/bionic/libdl_android.so
7c6fa1c000-7c6fa1d000 r--p 00002000 07:68 45                             /apex/com.android.runtime/lib64/bionic/libdl_android.so
7c6fa7c000-7c6faec000 r--p 00000000 fe:04 13211264                       /vendor/lib64/android.hardware.wifi.supplicant@1.4.so
7c6faec000-7c6fb53000 r-xp 00070000 fe:04 13211264                       /vendor/lib64/android.hardware.wifi.supplicant@1.4.so
7c6fb53000-7c6fb67000 r--p 000d7000 fe:04 13211264                       /vendor/lib64/android.hardware.wifi.supplicant@1.4.so
7c6fb67000-7c6fb68000 rw-p 000ea000 fe:04 13211264                       /vendor/lib64/android.hardware.wifi.supplicant@1.4.so
7c6fbc3000-7c6fbd0000 r--p 00000000 07:a8 192                            /apex/com.android.vndk.v32/lib64/android.hardware.security.keymint-V1-ndk_platform.so
7c6fbd0000-7c6fbde000 r-xp 0000d000 07:a8 192                            /apex/com.android.vndk.v32/lib64/android.hardware.security.keymint-V1-ndk_platform.so
7c6fbde000-7c6fbe0000 r--p 0001b000 07:a8 192                            /apex/com.android.vndk.v32/lib64/android.hardware.security.keymint-V1-ndk_platform.so
7c6fbe0000-7c6fbe1000 rw-p 0001c000 07:a8 192                            /apex/com.android.vndk.v32/lib64/android.hardware.security.keymint-V1-ndk_platform.so
7c6fc00000-7c70600000 ---p 00000000 00:00 0
7c70646000-7c70650000 r--p 00000000 fe:04 16345379                       /vendor/lib64/libcert_parse.wpa_s.so
7c70650000-7c70676000 r-xp 0000a000 fe:04 16345379                       /vendor/lib64/libcert_parse.wpa_s.so
7c70676000-7c70677000 r--p 00030000 fe:04 16345379                       /vendor/lib64/libcert_parse.wpa_s.so
7c70677000-7c70678000 rw-p 00030000 fe:04 16345379                       /vendor/lib64/libcert_parse.wpa_s.so
7c70678000-7c7067c000 rw-p 00000000 00:00 0                              [anon:.bss]
7c70696000-7c706a5000 r--p 00000000 07:a8 260                            /apex/com.android.vndk.v32/lib64/libnl.so
7c706a5000-7c706b7000 r-xp 0000f000 07:a8 260                            /apex/com.android.vndk.v32/lib64/libnl.so
7c706b7000-7c706b9000 r--p 00021000 07:a8 260                            /apex/com.android.vndk.v32/lib64/libnl.so
7c706b9000-7c706bb000 rw-p 00022000 07:a8 260                            /apex/com.android.vndk.v32/lib64/libnl.so
7c706cd000-7c70705000 r--p 00000000 fe:04 13147858                       /vendor/lib64/android.hardware.wifi.supplicant@1.1.so
7c70705000-7c70736000 r-xp 00038000 fe:04 13147858                       /vendor/lib64/android.hardware.wifi.supplicant@1.1.so
7c70736000-7c7073f000 r--p 00069000 fe:04 13147858                       /vendor/lib64/android.hardware.wifi.supplicant@1.1.so
7c7073f000-7c70740000 rw-p 00071000 fe:04 13147858                       /vendor/lib64/android.hardware.wifi.supplicant@1.1.so
7c70740000-7c7078f000 r--p 00000000 fe:02 17272387                       /system/lib64/libc++.so
7c7078f000-7c707f2000 r-xp 0004f000 fe:02 17272387                       /system/lib64/libc++.so
7c707f2000-7c707f9000 r--p 000b2000 fe:02 17272387                       /system/lib64/libc++.so
7c707f9000-7c707fa000 rw-p 000b8000 fe:02 17272387                       /system/lib64/libc++.so
7c707fa000-7c707fd000 rw-p 00000000 00:00 0                              [anon:.bss]
7c70800000-7c70804000 r--p 00000000 fe:04 24264173                       /vendor/lib64/libqmi_cci.so
7c70804000-7c7080c000 r-xp 00004000 fe:04 24264173                       /vendor/lib64/libqmi_cci.so
7c7080c000-7c7080d000 r--p 0000c000 fe:04 24264173                       /vendor/lib64/libqmi_cci.so
7c7080d000-7c7080e000 rw-p 0000c000 fe:04 24264173                       /vendor/lib64/libqmi_cci.so
7c70857000-7c7089a000 r--p 00000000 07:a8 245                            /apex/com.android.vndk.v32/lib64/libhidlbase.so
7c7089a000-7c708f3000 r-xp 00043000 07:a8 245                            /apex/com.android.vndk.v32/lib64/libhidlbase.so
7c708f3000-7c708fe000 r--p 0009c000 07:a8 245                            /apex/com.android.vndk.v32/lib64/libhidlbase.so
7c708fe000-7c708ff000 rw-p 000a6000 07:a8 245                            /apex/com.android.vndk.v32/lib64/libhidlbase.so
7c70912000-7c7095b000 r--p 00000000 07:a8 219                            /apex/com.android.vndk.v32/lib64/libc++.so
7c7095b000-7c709b5000 r-xp 00049000 07:a8 219                            /apex/com.android.vndk.v32/lib64/libc++.so
7c709b5000-7c709bc000 r--p 000a3000 07:a8 219                            /apex/com.android.vndk.v32/lib64/libc++.so
7c709bc000-7c709bd000 rw-p 000a9000 07:a8 219                            /apex/com.android.vndk.v32/lib64/libc++.so
7c709bd000-7c709c0000 rw-p 00000000 00:00 0                              [anon:.bss]
7c709e2000-7c709e3000 r--p 00000000 fe:04 21888698                       /vendor/lib64/libkeystore-wifi-hidl.so
7c709e3000-7c709e5000 r-xp 00001000 fe:04 21888698                       /vendor/lib64/libkeystore-wifi-hidl.so
7c709e5000-7c709e6000 r--p 00003000 fe:04 21888698                       /vendor/lib64/libkeystore-wifi-hidl.so
7c70a24000-7c70a3f000 r--p 00000000 07:a8 270                            /apex/com.android.vndk.v32/lib64/libssl.so
7c70a3f000-7c70a75000 r-xp 0001b000 07:a8 270                            /apex/com.android.vndk.v32/lib64/libssl.so
7c70a75000-7c70a78000 r--p 00051000 07:a8 270                            /apex/com.android.vndk.v32/lib64/libssl.so
7c70a78000-7c70a79000 rw-p 00053000 07:a8 270                            /apex/com.android.vndk.v32/lib64/libssl.so
7c70a90000-7c70a9b000 r--p 00000000 07:a8 204                            /apex/com.android.vndk.v32/lib64/android.system.keystore2-V1-ndk_platform.so
7c70a9b000-7c70aa8000 r-xp 0000b000 07:a8 204                            /apex/com.android.vndk.v32/lib64/android.system.keystore2-V1-ndk_platform.so
7c70aa8000-7c70aaa000 r--p 00018000 07:a8 204                            /apex/com.android.vndk.v32/lib64/android.system.keystore2-V1-ndk_platform.so
7c70aaa000-7c70aab000 rw-p 00019000 07:a8 204                            /apex/com.android.vndk.v32/lib64/android.system.keystore2-V1-ndk_platform.so
7c70ad3000-7c70ae7000 r--p 00000000 fe:02 17181724                       /system/lib64/libbase.so
7c70ae7000-7c70b12000 r-xp 00014000 fe:02 17181724                       /system/lib64/libbase.so
7c70b12000-7c70b13000 r--p 0003f000 fe:02 17181724                       /system/lib64/libbase.so
7c70b13000-7c70b14000 rw-p 0003f000 fe:02 17181724                       /system/lib64/libbase.so
7c70b53000-7c70b5d000 r--p 00000000 fe:04 13211357                       /vendor/lib64/android.system.wifi.keystore@1.0.so
7c70b5d000-7c70b65000 r-xp 0000a000 fe:04 13211357                       /vendor/lib64/android.system.wifi.keystore@1.0.so
7c70b65000-7c70b67000 r--p 00012000 fe:04 13211357                       /vendor/lib64/android.system.wifi.keystore@1.0.so
7c70b67000-7c70b68000 rw-p 00013000 fe:04 13211357                       /vendor/lib64/android.system.wifi.keystore@1.0.so
7c70bbb000-7c70bbc000 r--p 00000000 fe:04 21705078                       /vendor/lib64/libidl.so
7c70bbc000-7c70bbf000 r-xp 00001000 fe:04 21705078                       /vendor/lib64/libidl.so
7c70bbf000-7c70bc0000 r--p 00004000 fe:04 21705078                       /vendor/lib64/libidl.so
7c70be7000-7c70beb000 r--p 00000000 07:a8 193                            /apex/com.android.vndk.v32/lib64/android.hardware.security.secureclock-V1-ndk_platform.so
7c70beb000-7c70bee000 r-xp 00004000 07:a8 193                            /apex/com.android.vndk.v32/lib64/android.hardware.security.secureclock-V1-ndk_platform.so
7c70bee000-7c70bef000 r--p 00007000 07:a8 193                            /apex/com.android.vndk.v32/lib64/android.hardware.security.secureclock-V1-ndk_platform.so
7c70bef000-7c70bf0000 rw-p 00007000 07:a8 193                            /apex/com.android.vndk.v32/lib64/android.hardware.security.secureclock-V1-ndk_platform.so
7c70c01000-7c70c12000 r--p 00000000 07:a8 214                            /apex/com.android.vndk.v32/lib64/libbase.so
7c70c12000-7c70c3a000 r-xp 00011000 07:a8 214                            /apex/com.android.vndk.v32/lib64/libbase.so
7c70c3a000-7c70c3b000 r--p 00039000 07:a8 214                            /apex/com.android.vndk.v32/lib64/libbase.so
7c70c3b000-7c70c3c000 rw-p 00039000 07:a8 214                            /apex/com.android.vndk.v32/lib64/libbase.so
7c70c41000-7c70c43000 r--p 00000000 fe:04 24334211                       /vendor/lib64/libqmi_encdec.so
7c70c43000-7c70c46000 r-xp 00002000 fe:04 24334211                       /vendor/lib64/libqmi_encdec.so
7c70c46000-7c70c47000 r--p 00005000 fe:04 24334211                       /vendor/lib64/libqmi_encdec.so
7c70c80000-7c70c93000 r--p 00000000 07:68 46                             /apex/com.android.runtime/lib64/bionic/libm.so
7c70c93000-7c70cb8000 r-xp 00013000 07:68 46                             /apex/com.android.runtime/lib64/bionic/libm.so
7c70cb8000-7c70cb9000 r--p 00038000 07:68 46                             /apex/com.android.runtime/lib64/bionic/libm.so
7c70cb9000-7c70cba000 rw-p 00038000 07:68 46                             /apex/com.android.runtime/lib64/bionic/libm.so
7c70cd2000-7c70cdf000 r--p 00000000 07:a8 283                            /apex/com.android.vndk.v32/lib64/libutils.so
7c70cdf000-7c70ceb000 r-xp 0000d000 07:a8 283                            /apex/com.android.vndk.v32/lib64/libutils.so
7c70ceb000-7c70cec000 r--p 00019000 07:a8 283                            /apex/com.android.vndk.v32/lib64/libutils.so
7c70cec000-7c70ced000 rw-p 00019000 07:a8 283                            /apex/com.android.vndk.v32/lib64/libutils.so
7c70d0d000-7c70d22000 r--p 00000000 fe:04 25757631                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.1.so
7c70d22000-7c70d37000 r-xp 00015000 fe:04 25757631                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.1.so
7c70d37000-7c70d3b000 r--p 0002a000 fe:04 25757631                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.1.so
7c70d3b000-7c70d3c000 rw-p 0002d000 fe:04 25757631                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.1.so
7c70d4a000-7c70d9a000 r--p 00000000 fe:04 13147868                       /vendor/lib64/android.hardware.wifi.supplicant@1.2.so
7c70d9a000-7c70de6000 r-xp 00050000 fe:04 13147868                       /vendor/lib64/android.hardware.wifi.supplicant@1.2.so
7c70de6000-7c70df3000 r--p 0009c000 fe:04 13147868                       /vendor/lib64/android.hardware.wifi.supplicant@1.2.so
7c70df3000-7c70df4000 rw-p 000a8000 fe:04 13147868                       /vendor/lib64/android.hardware.wifi.supplicant@1.2.so
7c70e23000-7c70e81000 r--p 00000000 fe:04 13211282                       /vendor/lib64/android.hardware.wifi@1.0.so
7c70e81000-7c70f03000 r-xp 0005e000 fe:04 13211282                       /vendor/lib64/android.hardware.wifi@1.0.so
7c70f03000-7c70f16000 r--p 000e0000 fe:04 13211282                       /vendor/lib64/android.hardware.wifi@1.0.so
7c70f16000-7c70f17000 rw-p 000f2000 fe:04 13211282                       /vendor/lib64/android.hardware.wifi@1.0.so
7c70f55000-7c70f5f000 r--p 00000000 fe:04 25757613                       /vendor/lib64/vendor.qti.hardware.wifi.keystore@1.0.so
7c70f5f000-7c70f68000 r-xp 0000a000 fe:04 25757613                       /vendor/lib64/vendor.qti.hardware.wifi.keystore@1.0.so
7c70f68000-7c70f6a000 r--p 00013000 fe:04 25757613                       /vendor/lib64/vendor.qti.hardware.wifi.keystore@1.0.so
7c70f6a000-7c70f6b000 rw-p 00014000 fe:04 25757613                       /vendor/lib64/vendor.qti.hardware.wifi.keystore@1.0.so
7c70fa8000-7c70fad000 r--p 00000000 fe:02 18157925                       /system/lib64/liblog.so
7c70fad000-7c70fb7000 r-xp 00005000 fe:02 18157925                       /system/lib64/liblog.so
7c70fb7000-7c70fb8000 r--p 0000f000 fe:02 18157925                       /system/lib64/liblog.so
7c70fb8000-7c70fb9000 rw-p 0000f000 fe:02 18157925                       /system/lib64/liblog.so
7c70fc9000-7c70fd3000 r--p 00000000 fe:02 17523528                       /system/lib64/libcutils.so
7c70fd3000-7c70fdf000 r-xp 0000a000 fe:02 17523528                       /system/lib64/libcutils.so
7c70fdf000-7c70fe1000 r--p 00016000 fe:02 17523528                       /system/lib64/libcutils.so
7c70fe1000-7c70fe2000 rw-p 00017000 fe:02 17523528                       /system/lib64/libcutils.so
7c71000000-7c72e00000 ---p 00000000 00:00 0
7c72e4f000-7c72e5e000 r--p 00000000 fe:02 19282027                       /system/lib64/libutils.so
7c72e5e000-7c72e6c000 r-xp 0000f000 fe:02 19282027                       /system/lib64/libutils.so
7c72e6c000-7c72e6d000 r--p 0001d000 fe:02 19282027                       /system/lib64/libutils.so
7c72e6d000-7c72e6e000 rw-p 0001d000 fe:02 19282027                       /system/lib64/libutils.so
7c72e9c000-7c72eec000 r--p 00000000 07:68 42                             /apex/com.android.runtime/lib64/bionic/libc.so
7c72eec000-7c72fa7000 r-xp 00050000 07:68 42                             /apex/com.android.runtime/lib64/bionic/libc.so
7c72fa7000-7c72fae000 r--p 0010b000 07:68 42                             /apex/com.android.runtime/lib64/bionic/libc.so
7c72fae000-7c72fb1000 rw-p 00111000 07:68 42                             /apex/com.android.runtime/lib64/bionic/libc.so
7c72fb1000-7c731c1000 rw-p 00000000 00:00 0                              [anon:.bss]
7c731c1000-7c731c2000 r--p 00000000 00:00 0                              [anon:.bss]
7c731c2000-7c731ca000 rw-p 00000000 00:00 0                              [anon:.bss]
7c73200000-7c76400000 ---p 00000000 00:00 0
7c76442000-7c76443000 r--p 00000000 07:68 44                             /apex/com.android.runtime/lib64/bionic/libdl.so
7c76443000-7c76444000 r-xp 00001000 07:68 44                             /apex/com.android.runtime/lib64/bionic/libdl.so
7c76444000-7c76445000 r--p 00002000 07:68 44                             /apex/com.android.runtime/lib64/bionic/libdl.so
7c76445000-7c76446000 ---p 00000000 00:00 0
7c76446000-7c76447000 r--p 00000000 00:00 0                              [anon:.bss]
7c76447000-7c764ab000 rw-p 00000000 00:00 0                              [anon:linker_alloc]
7c764ab000-7c764b2000 r--p 00000000 07:a8 231                            /apex/com.android.vndk.v32/lib64/libcutils.so
7c764b2000-7c764ba000 r-xp 00007000 07:a8 231                            /apex/com.android.vndk.v32/lib64/libcutils.so
7c764ba000-7c764bc000 r--p 0000f000 07:a8 231                            /apex/com.android.vndk.v32/lib64/libcutils.so
7c764bc000-7c764bd000 rw-p 00010000 07:a8 231                            /apex/com.android.vndk.v32/lib64/libcutils.so
7c764c8000-7c764df000 r--p 00000000 fe:04 25757637                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.2.so
7c764df000-7c764f6000 r-xp 00017000 fe:04 25757637                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.2.so
7c764f6000-7c764fb000 r--p 0002e000 fe:04 25757637                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.2.so
7c764fb000-7c764fc000 rw-p 00032000 fe:04 25757637                       /vendor/lib64/vendor.qti.hardware.wifi.supplicant@2.2.so
7c76518000-7c7651c000 r--p 00000000 fe:04 21797882                       /vendor/lib64/libkeystore-engine-wifi-hidl.so
7c7651c000-7c76521000 r-xp 00004000 fe:04 21797882                       /vendor/lib64/libkeystore-engine-wifi-hidl.so
7c76521000-7c76522000 r--p 00009000 fe:04 21797882                       /vendor/lib64/libkeystore-engine-wifi-hidl.so
7c76522000-7c76523000 rw-p 00009000 fe:04 21797882                       /vendor/lib64/libkeystore-engine-wifi-hidl.so
7c76565000-7c76567000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c765af000-7c766ad000 r--p 00000000 00:1c 5                              /dev/binderfs/hwbinder
7c766ad000-7c766ae000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c766b8000-7c766b9000 ---p 00000000 00:00 0
7c766b9000-7c766c1000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c766c1000-7c766c2000 ---p 00000000 00:00 0
7c766c2000-7c766ca000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c766ca000-7c766cb000 ---p 00000000 00:00 0
7c766cb000-7c766d3000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c766d3000-7c766d4000 ---p 00000000 00:00 0
7c766d4000-7c766dc000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c766dc000-7c766dd000 ---p 00000000 00:00 0
7c766dd000-7c766e5000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c766e5000-7c76705000 r--s 00000000 00:10 99                             /dev/__properties__/u:object_r:bootloader_prop:s0
7c7670e000-7c76711000 r--p 00000000 fe:02 18354726                       /system/lib64/libnetd_client.so
7c76711000-7c76715000 r-xp 00003000 fe:02 18354726                       /system/lib64/libnetd_client.so
7c76715000-7c76716000 r--p 00007000 fe:02 18354726                       /system/lib64/libnetd_client.so
7c76716000-7c76717000 rw-p 00007000 fe:02 18354726                       /system/lib64/libnetd_client.so
7c7671b000-7c7673b000 r--s 00000000 00:10 222                            /dev/__properties__/u:object_r:hwservicemanager_prop:s0
7c7673b000-7c7675b000 r--s 00000000 00:10 243                            /dev/__properties__/u:object_r:log_file_logger_prop:s0
7c7675b000-7c7675c000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c76763000-7c76783000 r--s 00000000 00:10 199                            /dev/__properties__/u:object_r:exported_dumpstate_prop:s0
7c76783000-7c767a3000 r--s 00000000 00:10 220                            /dev/__properties__/u:object_r:heapprofd_prop:s0
7c767a3000-7c767c3000 r--s 00000000 00:10 237                            /dev/__properties__/u:object_r:libc_debug_prop:s0
7c767c3000-7c767e3000 r--s 00000000 00:10 215                            /dev/__properties__/u:object_r:gwp_asan_prop:s0
7c767e3000-7c76803000 r--s 00000000 00:10 153                            /dev/__properties__/u:object_r:debug_prop:s0
7c76803000-7c76823000 r--s 00000000 00:10 353                            /dev/__properties__/u:object_r:userdebug_or_eng_prop:s0
7c76823000-7c76843000 r--s 00000000 00:10 535                            /dev/__properties__/properties_serial
7c76843000-7c76864000 r--s 00000000 00:10 71                             /dev/__properties__/property_info
7c76868000-7c76888000 r--s 00000000 00:10 246                            /dev/__properties__/u:object_r:log_tag_prop:s0
7c76888000-7c768a8000 r--s 00000000 00:10 108                            /dev/__properties__/u:object_r:build_prop:s0
7c768a8000-7c768c8000 r--s 00000000 00:10 482                            /dev/__properties__/u:object_r:vendor_socket_hook_prop:s0
7c768c8000-7c76990000 r--p 00000000 00:00 0                              [anon:linker_alloc]
7c76990000-7c76991000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c76993000-7c76997000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c7699b000-7c7699d000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c7699f000-7c769a1000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c769a3000-7c769a8000 rw-p 00000000 00:00 0                              [anon:System property context nodes]
7c769a8000-7c769a9000 ---p 00000000 00:00 0
7c769a9000-7c769ac000 rw-p 00000000 00:00 0                              [anon:stack_and_tls:main]
7c769ac000-7c769ad000 ---p 00000000 00:00 0
7c769ad000-7c769b2000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c769b2000-7c769b3000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_lob]
7c769b3000-7c769b8000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c769b8000-7c769d8000 r--s 00000000 00:10 520                            /dev/__properties__/u:object_r:vndk_prop:s0
7c769d8000-7c769d9000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_lob]
7c769d9000-7c76a3d000 r--p 00000000 00:00 0                              [anon:linker_alloc]
7c76a3d000-7c76a5d000 r--s 00000000 00:10 153                            /dev/__properties__/u:object_r:debug_prop:s0
7c76a5d000-7c76a5e000 ---p 00000000 00:00 0
7c76a5e000-7c76a66000 rw-p 00000000 00:00 0
7c76a66000-7c76a67000 ---p 00000000 00:00 0
7c76a67000-7c76a87000 r--s 00000000 00:10 535                            /dev/__properties__/properties_serial
7c76a87000-7c76a8c000 rw-p 00000000 00:00 0                              [anon:System property context nodes]
7c76a8c000-7c76aad000 r--s 00000000 00:10 71                             /dev/__properties__/property_info
7c76aad000-7c76b11000 r--p 00000000 00:00 0                              [anon:linker_alloc]
7c76b11000-7c76b13000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c76b13000-7c76b14000 r--p 00000000 00:00 0                              [anon:atexit handlers]
7c76b14000-7c76b16000 rw-p 00000000 00:00 0                              [anon:bionic_alloc_small_objects]
7c76b16000-7c775aa000 ---p 00000000 00:00 0
7c775aa000-7c775ac000 rw-p 00000000 00:00 0
7c775ac000-7c77b16000 ---p 00000000 00:00 0
7c77b16000-7c77b17000 ---p 00000000 00:00 0
7c77b17000-7c77b1f000 rw-p 00000000 00:00 0                              [anon:thread signal stack]
7c77b1f000-7c77b20000 rw-p 00000000 00:00 0                              [anon:arc4random data]
7c77b21000-7c77b22000 r--p 00000000 00:00 0                              [anon:atexit handlers]
7c77b22000-7c77b23000 rw-p 00000000 00:00 0                              [anon:arc4random data]
7c77b23000-7c77b25000 r--p 00000000 00:00 0                              [vvar]
7c77b25000-7c77b26000 r-xp 00000000 00:00 0                              [vdso]
7c77b26000-7c77b6e000 r--p 00000000 07:68 16                             /apex/com.android.runtime/bin/linker64
7c77b6e000-7c77c6a000 r-xp 00048000 07:68 16                             /apex/com.android.runtime/bin/linker64
7c77c6a000-7c77c73000 r--p 00144000 07:68 16                             /apex/com.android.runtime/bin/linker64
7c77c73000-7c77c75000 rw-p 0014c000 07:68 16                             /apex/com.android.runtime/bin/linker64
7c77c75000-7c77c7d000 rw-p 00000000 00:00 0                              [anon:.bss]
7c77c7d000-7c77c7e000 r--p 00000000 00:00 0                              [anon:.bss]
7c77c7e000-7c77c80000 rw-p 00000000 00:00 0                              [anon:.bss]
7fc0ce9000-7fc0d0b000 rw-p 00000000 00:00 0                              [stack]

这里的地址空间,在Linux 内核中使用一个专门的术语 VMA。可以通过另外一个与maps 平行目录下的 smpas( /proc/pid/smaps) 查看映射细节。此指令的输出结果较多,下面只截取一段作为演示

7fc0ce9000-7fc0d0b000 rw-p 00000000 00:00 0                              [stack]
Size:                136 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                  24 kB
Pss:                  24 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        24 kB
Referenced:           24 kB
Anonymous:            24 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                 12 kB
SwapPss:              12 kB
Locked:                0 kB
THPeligible:    0
VmFlags: rd wr mr mw me gd ac

ARM 64位系统的虚拟地址分布

详细可以查看 kernel/Documentation/arm64/memory.rst

这里简单列举下 4KB 页面 + 3 级页表下的虚拟地址分布( 48bits):(低128TB 为用户空间,高128TB 为内核空间)

虚拟内存的结构在之前的 Linux 5.4 之前(VA_BITS为39,PAGE_SHIFT为12) dmesg 打印信息中是可以看到的:


[    0.000000] Memory: 2736316K/2883584K available (4796K kernel code, 488K rwdata, 1360K rodata, 448K init, 341K bss, 130884K reserved, 16384K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     modules : 0xffffff8000000000 - 0xffffff8008000000   (   128 MB)
[    0.000000]     vmalloc : 0xffffff8008000000 - 0xffffffbebfff0000   (   250 GB)
[    0.000000]       .text : 0xffffff8008080000 - 0xffffff8008530000   (  4800 KB)
[    0.000000]     .rodata : 0xffffff8008530000 - 0xffffff8008690000   (  1408 KB)
[    0.000000]       .init : 0xffffff8008690000 - 0xffffff8008700000   (   448 KB)
[    0.000000]       .data : 0xffffff8008700000 - 0xffffff800877a200   (   489 KB)
[    0.000000]        .bss : 0xffffff800877a200 - 0xffffff80087cf76c   (   342 KB)
[    0.000000]     fixed   : 0xffffffbefe7fd000 - 0xffffffbefec00000   (  4108 KB)
[    0.000000]     PCI I/O : 0xffffffbefee00000 - 0xffffffbeffe00000   (    16 MB)
[    0.000000]     vmemmap : 0xffffffbf00000000 - 0xffffffc000000000   (     4 GB maximum)
[    0.000000]               0xffffffbf00000000 - 0xffffffbf02c00000   (    44 MB actual)
[    0.000000]     memory  : 0xffffffc000000000 - 0xffffffc0b0000000   (  2816 MB)

代码位于: arch/arm64/mm/init.c 中的 mem_init() 函数。

但在 4.16 版本之后这部分的打印被删掉了:

commit 071929dbdd865f779a89ba3f1e06ba8d17dd3743
Author: Laura Abbott <labbott@redhat.com>
Date:   Tue Dec 19 11:28:10 2017 -0800
 
    arm64: Stop printing the virtual memory layout
  
    Printing kernel addresses should be done in limited circumstances, mostly
    for debugging purposes. Printing out the virtual memory layout at every
    kernel bootup doesn't really fall into this category so delete the prints.
    There are other ways to get the same information.
  
    Acked-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Laura Abbott <labbott@redhat.com>
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>

如果想要查看,可以revert 这笔提交。

下面的dmesg 为 Linux5.15(VA_BITS为39,PAGE_SHIFT为12)版本下:

<6>[    0.000000] Memory: 1710264K/1909760K available (19644K kernel code, 3040K rwdata, 14368K rodata, 3200K init, 21723K bss, 183112K reserved, 16384K cma-reserved)
<5>[    0.000000] Virtual kernel memory layout:
<5>[    0.000000] modules : 0xffffffc008000000 - 0xffffffc010000000   (   128 MB)
<5>[    0.000000] vmalloc : 0xffffffc010000000 - 0xfffffffebfff0000   (   250 GB)
<5>[    0.000000]   .text : 0xffffffc010080000 - 0xffffffc0113b0000   ( 19648 KB)
<5>[    0.000000] .rodata : 0xffffffc0113b0000 - 0xffffffc0121e0000   ( 14528 KB)
<5>[    0.000000]   .init : 0xffffffc0121e0000 - 0xffffffc012500000   (  3200 KB)
<5>[    0.000000]   .data : 0xffffffc012500000 - 0xffffffc0127f8200   (  3041 KB)
<5>[    0.000000]    .bss : 0xffffffc0127f8200 - 0xffffffc013d2ee60   ( 21724 KB)
<5>[    0.000000] fixed   : 0xfffffffefe5f9000 - 0xfffffffefea00000   (  4124 KB)
<5>[    0.000000] PCI I/O : 0xfffffffefec00000 - 0xfffffffeffc00000   (    16 MB)
<5>[    0.000000] vmemmap : 0xfffffffeffe00000 - 0xffffffffffe00000   (     4 GB maximum)
<5>[    0.000000]           0xffffffff00014000 - 0xffffffff01e00000   (    29 MB actual)
<5>[    0.000000] memory  : 0xffffff8008500000 - 0xffffff8080000000   (  1915 MB)

内存大致结构图如下:

VA_BITS=39, PAGE_SHIFT=12(每页4K)

从Linux 内核的角度看内存

用户空间层可以理解为Linux 内核内存管理为用户空间暴露的系统调用(如brk、mmap等系统调用)接口。通常libc 库会封装成常见的C 函数,如malloc()、mmap()等。

内核空间首先会处理和内存管理相关的系统调用,如sys_brk、sys_mmap、sys_advise等。接下来会涉及到VMA 管理、缺页中断、匿名页面、页面高速缓存、页面回收、RMAP、slab 分配器、页面管理等模块。

最下面是硬件层,包括处理器中的MMU、TLB 和高速缓存部件,以及板载的物理内存,如LPDDR 或 DDR。