簡體   English   中英

使用 C 在 ARM9 上未對齊的 memory 訪問異常的解決方法是什么?

[英]What is the workaround for unaligned memory access exception on ARM9 using C?

架構 ARM9。 編程語言 C。

我們有一個第三方堆棧,其中一個調用需要一個指向 memory 位置的指針 ( pBuffer )。 在堆棧中,它們可以自由地在傳遞的指針周圍移動並根據需要訪問它。 不幸的是,他們偏移了傳入的指針並將其傳遞到另一個 function 試圖從奇數/未對齊的 memory 位置執行此操作

         ((uint16 *)pBuffer)[index] = value;

其中valueuint16類型, index是邊界檢查和索引pBuffer 這會導致未對齊的 memory 訪問異常。 pBuffer指向堆上的char *

如前所述,即使我們可以窺視第三方堆棧,我們也不能正式更新代碼。 所以我們通知提供商,他們會在下一個版本中提供更新。

我想了解是否有解決此問題的方法。 如何在不違反未對齊訪問的情況下執行上述任務? 解決此類問題的最佳方法是什么。

逐字節復制值。 將其轉換為(無符號)char 指針,然后一次復制一個字節。

它不漂亮,但聽起來你沒有很多選擇。

如果您控制 pBuffer,作為一種變通方法,您可以將其聲明為 uint32_t 數組(或任何與您的體系結構的 alignment 匹配的數組)。 通過將緩沖區聲明為 uint32_t,編譯器將選擇正確的 alignment。 您可以在調用目標 function 時將其轉換為 uint8_t*。

這應該適用於您發布的示例代碼,但如果第三方代碼將任何未對齊的偏移量應用於緩沖區,仍可能會失敗。

有三種可能性,目前我無法從你的問題中確定是哪種情況。

情況 1:索引總是奇數。 解決方案:memmove() pBuffer over 1 bytes 情況2:索引有時是奇數,您可以預先預測它何時會是奇數。 解決方案:當你知道索引是奇數時,memmove() pBuffer 超過 1 個字節。 案例 3:索引有時是奇數,您無法預測何時會是奇數。 這是不幸的,因為代碼出錯。

暫無
暫無

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

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