Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在arm linux中读取内核映像?_Linux_Linux Kernel_Arm - Fatal编程技术网

如何在arm linux中读取内核映像?

如何在arm linux中读取内核映像?,linux,linux-kernel,arm,Linux,Linux Kernel,Arm,我试图读取内核映像并计算该映像的校验和值。首先,我使用smc指令触发异常,在异常处理程序中,我尝试读取图像的第一个字节。我真的不知道地址是什么,但从一些文档中,我知道内核映像是以0x20008000、0x30008000或0xC0008000这样的地址解压缩的(他们称之为ZRELADDR,我真的不知道这是否是正确的地址…)。所以我试着这样读记忆: uint32_t test; test = * (uint32_t *)0x30008000; DMSG("test : %x\n",test);

我试图读取内核映像并计算该映像的校验和值。首先,我使用smc指令触发异常,在异常处理程序中,我尝试读取图像的第一个字节。我真的不知道地址是什么,但从一些文档中,我知道内核映像是以0x20008000、0x30008000或0xC0008000这样的地址解压缩的(他们称之为ZRELADDR,我真的不知道这是否是正确的地址…)。所以我试着这样读记忆:

uint32_t test;
test = * (uint32_t *)0x30008000;
DMSG("test : %x\n",test);
但系统因数据中止异常而崩溃

core data-abort at address 0x30008000
 fsr 0x00000005  ttbr0 0x7df7006a  ttbr1 0x7df7006a  cidr 0x0
 cpu #0          cpsr 0x200001b3
 r0 0x00000090      r4 0x7df4bf51    r8 0x00000000   r12 0x00000000
 r1 0x09010000      r5 0x806665e0    r9 0x00000000    sp 0x7df77f50
 r2 0x0000000d      r6 0x7f002000   r10 0x00000000    lr 0x7df273ff
 r3 0x30008000      r7 0x7df77f60   r11 0x00000000    pc 0x7df052f0
ERR TEE-CORE:tee_pager_handle_fault:602: Unexpected page fault! Trap CPU
PANIC: tee_pager_handle_fault core/arch/arm/mm/tee_pager.c:603
我想我走错了路。有人知道如何在运行时环境中读取内核映像吗

谢谢你的帮助


编辑:感谢您的回复。我说的是安全内核。我试图在TrustZone下检查内核的完整性,并确保内核没有被破坏。所以我想像哈希值这样的校验和可能会对我有所帮助。另外,我是一个新手,试图熟悉arm的内存系统,所以我尝试从简单读取某些特定的内存地址开始。我曾尝试按照Artless Noise所说的读取0xc0000000,但同样的错误再次出现。我再次尝试在System.map中查找“_test”和“stext”地址,即0x80008000,错误再次出现。

RAM的开头通常映射为0xC0000000。这取决于配置页面偏移量:

 - VMSPLIT_3G: 0xC0000000
 - VMSPLIT_2G: 0x80000000
 - VMSPLIT_1G: 0x40000000
请注意,这是一个虚拟地址,如果您有MMU(通常情况),则物理地址将取决于您的实际体系结构(它可能是0x00000000,也可能不是0x00000000)。内核在此之后加载了几页,偏移量为0x8000

因此,您可能可以在0xC0008000处找到(未压缩的)内核,但它也可能位于其他地方

您还可以尝试将内存的ioremap()偏移量设置为0x8000


您能给我们提供更多关于您正在处理的特定SoC的信息吗?

如果您处于安全模式,并且您相信它在安全模式下访问物理地址,那么您可以从这些宏的下面推断物理地址

内核加载的物理地址是PHYS_OFFSET+TEXT_OFFSET(TEXT OFFSET是0x8000)

物理量偏移定义将取决于配置的ARM补丁和物理量VIRT补丁


如果定义了CONFIG_ARM_PATCH_PHYS_VIRT,那么PHYS_OFFSET将等于u pv_PHYS_OFFSET,否则PHYS_OFFSET将在内核配置文件中定义为CONFIG_PHYS_OFFSET。

为什么使用smc?你说的是安全内核吗?如果您在内核上下文中谈论普通linux内核0xC0008000应该没问题,那么它也可能有助于解释为什么需要此校验和以及打算如何使用它,因为从表面上看它似乎毫无价值:运行内核映像的校验和与存储中相同映像的校验和极不可能匹配,甚至是同一运行映像在不同的时间点(想想静态变量、模块重新定位等),甚至内核空间都使用虚拟地址(您建议的地址是物理地址)。您可以尝试“0xc0000000”或找到一个变量/定义,该变量/定义将告诉您实际的开始/结束。另外,可能有一个地图文件供您查看(甚至是System.map)。我已经编辑了这个问题。非常感谢您的回复。我正在使用QEMU模拟cortex-A15。我已尝试0xC0008000,但错误仍然存在。当我处于安全模式时,我想我访问的内存地址应该是物理地址。如果应该的话,那么如何将“0xC0008000”这样的虚拟地址映射到物理地址?谢谢您的回答。事实上,我已经大致了解了这个例外情况。这是因为我使用的安全操作系统(OP-TEE)没有将我想要访问的物理地址映射到虚拟地址。我还得到了一个旁路解决方案-禁用MMU。禁用MMU后,我可以直接访问物理地址。