繁体   English   中英

如何在ARM Linux中读取内核映像?

[英]how to read kernel image in arm linux?

我正在尝试读取内核映像并计算该映像的校验和值。 首先,我使用了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的内存系统,因此我尝试从简单读取某些内存地址开始。 我尝试读取0xc0000000,如Artless Noise所说,但再次发生相同的错误。 我再次尝试在System.map中找到“ _test”和“ stext”地址,该地址为0x80008000,并且再次发生错误。

RAM的开头通常映射为0xC0000000。 这取决于CONFIG_PAGE_OFFSET:

 - VMSPLIT_3G: 0xC0000000
 - VMSPLIT_2G: 0x80000000
 - VMSPLIT_1G: 0x40000000

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

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

您还可以尝试ioremap()偏移RAM的0x8000。

您能否向我们提供有关您正在使用的特定SoC的更多信息?

如果您处于安全模式下,并且您认为在安全模式下它将访问物理地址,则可以从这些宏下面推断出物理地址。

内核加载的物理地址为PHYS_OFFSET + TEXT_OFFSET(文本偏移为0x8000),

PHYS_OFFSET定义将取决于CONFIG_ARM_PATCH_PHYS_VIRT补丁。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM