簡體   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