linux - 如何读取arm linux中的内核镜像?

标签 linux linux-kernel arm

我正在尝试读取内核镜像并计算该镜像的校验和值。首先,我使用 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。这取决于 CONFIG_PAGE_OFFSET:

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

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

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

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

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

关于linux - 如何读取arm linux中的内核镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706906/

相关文章:

sql - 在 Redshift 中使用 json_extract_path_text 时如何跳过错误?

c - Linux 内核模块 Makefile 不能包含相对路径

node.js - Beaglebone (ARM) 上的串口 Node 错误

c - 如何编译/链接/构建小型可加载内核模块(LKM)?

caching - Linux perf 如何计算缓存引用和缓存未命中事件

c - ARM 程序集 - 是否保证寄存器足够大以容纳指针?

ARM 。从 super 用户模式访问用户 R13 和 R14

linux - linux "comm"工具比较文件时如何显示行号

linux - 上传文件到busybox机器

Linux XAMPP 突然需要 32 位兼容库