簡體   English   中英

我可以使用ARM的LDR指令訪問什么地址

[英]What address I could access with LDR instruction of ARM

我是ARM匯編代碼的新手。

我剛檢查了指令集,發現有一條指令LDR可以用作“LDR {} {} Rd,”。

關於這條指令,我有兩個問題:1)這里的地址是物理地址還是虛擬地址? 2)我怎么知道加載哪個地址“合法”或“可讀”? 我不知道我可以訪問哪個地址。

我只是想測試這條指令,所以任何有效的地址對我都有幫助。

非常感謝你。

這取決於程序運行的ARM架構究竟是什么。 如果它是像Cortex-M0這樣的小型微控制器(ARMv6-M),則使用物理地址。 在特定處理器的參考手冊中,您可以檢查哪些地址有效(例如,RAM的地址范圍是什么)。 您還需要記住,通常地址必須與字大小對齊(同樣,它取決於架構的特定版本)。

如果您使用“大”ARM處理器,如Cortex-A(ARMv7-A)或64位ARM(ARMv8-A)之一,您還使用(最可能)某種高級操作系統(例如Linux)和處理器本身有一個MMU。 在這種情況下,您傳遞虛擬地址。 如果使用帶有標准3:1拆分的32位Linux,則所有低於0xC0000000的地址(已對齊)都可供用戶空間程序訪問。 順便說一句,您可以使用其他指令(如LDRB,LDRH)訪問未對齊的地址。

如果您正在使用Linux, 我的文章可能會有所幫助。 這篇文章目前相當混亂,但至少在內部有一組很好的外部鏈接到其他文章。

ARMv7-A -R Architecture Reference Manual明確指出

指令中使用的地址,作為數據或指令地址,是虛擬地址(VA)。

PC,LR或SP中保存的地址是VA。

VA映射從零到VA空間的大小。 對於ARMv7,最大VA空間為4GB,最大VA范圍為0x00000000 - 0xFFFFFFFF。

同樣很清楚,該VA被轉換為物理地址,而物理地址又用於利用物理存儲器執行期望的操作。 進一步說明了禁用內存管理單元(實際內存映射)的影響,但這並沒有否定地址是虛擬地址的事實。

使用最新的ARM體系結構,除非您正在編寫內核(必須處理設置分頁和地址轉換),否則您將使用虛擬地址進行操作。 如果您在某些操作系統下運行代碼,那么您就是安全的。

這導致您回答第二個問題。 當您受到操作系統的保護時,您可以自由嘗試訪問您希望的任何地址,但在最壞情況下訪問隨機地址將導致操作系統終止您的特定應用程序。 要確定您可以訪問哪些地址,可以嘗試在gdb下運行程序,並使用info proc mappings gdb命令列出所有映射的內存。

  1. 除非您正在編寫內核/引導加載程序代碼,否則所有地址始終是虛擬的。 即使您願意,也不能使用物理地址。 (假設您正在編寫將在Linux等全面操作系統下運行的用戶空間代碼。更一般地說,要么總是擁有虛擬地址,要么總是擁有物理地址。您不能編寫使用某些物理地址的代碼。虛擬內存訪問。如果要對某個物理地址執行某些操作,則必須將其映射到虛擬地址空間。)

  2. 當OS啟動進程時,堆棧指針通常指向有效內存。 您放入數據或bss段的任何內容也應該是可讀的。

除此之外的任何事情都超出了單一答案的范圍。 谷歌上了一個介紹教程。

但是,由於你特別提到了ldr ,它不僅僅是一個簡單的指令(將編譯時常量放入寄存器的加載或偽指令):請參閱為什么在ARM中使用LDR而不是MOV(反之亦然)部件?

我真的不知道ARM asm,我沒有意識到答案是特定於arch的。 1.和2.適用於所有CPU上的用戶空間代碼(在具有受保護內存的普通操作系統上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM