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

时间:2015-09-22 01:17:08

标签: linux linux-kernel arm

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

from pyx509.models import PKCS7
pkcs7 = PKCS7.from_der(here_goes_your_pks7_signature_data_der_encoded)
signer_info = pkcs7.content.signerInfos[0]
auth_attrs = signer_info.auth_attributes
for attr in auth_attrs.attributes:
    if attr.type == '1.2.840.113549.1.9.4':  # Message Digest OID
        message_digest = attr.value
        print "Digest: %s#%s" % (signer_info.oid2name(signer_info.digest_algorithm), messageDigest)

但系统因数据中止异常而崩溃,

uint32_t test;
test = * (uint32_t *)0x30008000;
DMSG("test : %x\n",test);

我想我走错了路。有谁知道如何在运行时环境中读取内核映像?

感谢您的帮助!

编辑:感谢您的回复。我说的是安全内核。我试图在TrustZone下检查内核的完整性,并确保内核不会受到损害。所以我猜哈希值之类的校验和可能对我有帮助。另外,我是一个试图熟悉arm内存系统的新手,所以我试着从简单读取一些特定的内存地址开始。我试图读取0xc0000000,因为Artless Noise说,但同样的错误再次出现。我再次尝试在System.map中找到“_test”和“stext”地址,即0x80008000,并再次发生错误。

2 个答案:

答案 0 :(得分:0)

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

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

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

所以,你可以在0xC0008000找到(未压缩的)内核,但它也可能位于其他地方。

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

您能否就我们正在进行的特定SoC提供更多信息?

答案 1 :(得分:0)

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

内核加载的物理地址为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。