主頁 > 企業開發 > 儲存到記憶體中和從記憶體中加載是如何進行的

儲存到記憶體中和從記憶體中加載是如何進行的

2021-10-18 02:17:05 企業開發

我正在做一個二進制分析專案,我正在建立一個將匯編翻譯成llvm的提升器。我建立了一個記憶體模型,但對str和ldr arm匯編指令如何在記憶體上作業感到有點困惑。所以我的問題是:例如,給定一個記憶體地址0000b8f0,我想在其中存盤一個64位的十進制數值20000000。str指令是將整個20000000存盤在地址0000b8f0中,還是將其分成幾個位元組并將第一個位元組存盤在0000b8f0中,第二個位元組存盤在0000b8f1中,第三個位元組存盤在0000b8f2中,依此類推。 ...同樣,從一個地址(0000b8f0)加載時,ldr指令是只取存盤在0000b8f0的位元組還是取0000b8f0-0000b8f4的全部位元組。

對不起,如果我的問題非常基本,但我需要確保我正確地實作str和ldr對我的記憶體模型的影響。

uj5u.com熱心網友回復:

從邏輯上講1,記憶體是一個8位位元組的陣列。

字加載/存盤一次訪問一個以上的位元組,就像C語言中的SIMD本征,或者像((char*)my_int)[2]加載一個int的第三個位元組的反義詞。

C的記憶體模型是圍繞著支持更廣泛訪問的位元組尋址機器而設計的(比如PDP-11或ARM),所以如果你了解char*在C中是如何訪問其他物件的物件表示的,例如,為什么memcpy可以作業,這就是你所習慣的。

(我沒有使用C語言的例子,將一個int*指向一個char陣列,因為C語言中的嚴格鋸齒規則使得這種行為無法定義。 在ISO C中,只有char*被允許別名為其他型別。Asm對于訪問任何寬度的記憶體位元組有明確的行為,與早期存盤的任何部分或全部重疊,就像GNU C在編譯時使用-fno-strict-aliasing來禁用基于型別的別名分析/優化。


str是一個32位的字存盤;它一次寫入所有4個位元組。如果你從0000b8f1...2...3加載,你會得到第2、3或4個位元組,所以str相當于4條獨立的strb指令(通過移位來提取正確的位元組),除了明顯缺乏原子性和性能。

str總是從一個32位暫存器中存盤4個位元組。如果一個暫存器持有一個像2這樣的值,那就意味著上面的位元組都是0。

ARM可以存盤32位暫存器中的4個位元組。

ARM可以是big-endian或little-endian。 我認為現代 ARM 系統最常采用小-endian 方式,就像 x86 一樣,因此數值中最不重要的位元組被存盤在最低地址。


位于0000b8f0的位元組不能單獨容納20000000;一個位元組沒有那么大,如果這是你所問的。

注意,0000b8f4 是下一個字的低位元組;它是一個 4 位元組對齊的地址。

另外,用int64_t存盤20000000將需要兩個32位存盤。例如,兩個str指令,或ARMv8的stp來做一對暫存器的64位存盤,或一個stm存盤-多重指令的兩個暫存器。 或者八個strb位元組存盤指令。


腳注 1:這是從軟體的角度來看的,而不是記憶體控制器、資料總線或 DRAM 芯片的物理組織方式。 甚至是快取,因此位元組存盤,有時甚至是加載的效率會低于 ARM 上的整字,甚至除了只移動 strstp 的 1/4 或 1/8 的資料量之外,也是如此

uj5u.com熱心網友回復:

如果你問的是軟體是如何作業的,從高層次的角度來看,如果你瞇起眼睛是的。 地址0x0000b8f0是基礎地址,值0x20000000被存盤為

0xb8f0 0x00 0xb8f1 0x00 0xb8f2 0x00 0xb8f3 0x20

但是,硬體是一個完全不同的故事。 首先,你有許多總線,在像ARM這樣的內核中,你可能有一個內部L1快取(你可能啟用也可能不啟用)。 以及芯片供應商連接的AHB/axi/等總線。 這些通常都是32或64位寬(核心總線的外部,芯片的內部)。 因此,假設沒有mmu,這將是一個地址為0xb8f0的單一總線事務,資料為0x20000000或0xXXXXXX20000000,其中的XXes可能是垃圾,往往是陳舊的,而不是假設為零,為什么要浪費門? 內部或外部的快取在物理上不會由位元組寬的部件創建,它們可能是32位寬或64位加奇偶校驗或cc,所以是33或65或40或72或其他。 我們并不假定內部的srams是8位寬的倍數,單元庫中有數百種尺寸和形狀(寬度和深度)的srams。

假設在總線上的讀取被假定為總線寬度,這是很常見的,所以如果你讀取一個單一的位元組,或者認為你來自軟體,它可能會導致一個完整的32或64或更寬的,讀取,因為它穿越總線,所有這些位元組/位將回來,處理器(核心)本身將隔離它感興趣的位元組,并對它做任何指令想要的東西(例如ldrb)。 另一方面,如果你想存盤一個位元組,那么硬體需要這樣做,所以使用了一些方案,對于axi/ahb等,使用了一個位元組屏蔽,所以如果是32位總線,那么有4位位元組屏蔽/啟用,每個位元組通道一個。 因此,將一個位元組存盤到地址0x0123基本上是寫到0x0120,位元組掩碼為0b1000,以表明該位元組通道正在獲得資料,該位元組在適當的位元組通道上(其他位元組被認為是垃圾/陳舊,沒有預期)。

假設你有一個快取,哪個層并不重要。 如前所述,它們最好是供給它們的總線的倍數,所以如果是32位的總線,那么就是32位加奇偶校驗或ecc寬(33、40,等等)。 一個單位元組的存盤會導致一個讀-修改-寫的程序,因為快取的sram本身只能在32或64位寬的事務中讀/寫(而且地址是這樣的,你不使用/需要較低的地址位,它們被剝離以使基于字或雙字的尋址),所以邏輯會讀取整個字或雙字,修改你想寫的一個位元組,然后再寫回sram中。 這是一種性能上的沖擊,這取決于整體架構是否能夠輕松檢測到它,以及你所損失的整體性能(你可能有很多其他開銷,就像 x86 一樣,無法看到它)。

硬體中一個字大小的存盤絕不等同于在四個不同地址的四個位元組大小的存盤。 根據另一位回答這個問題的人的要求,我已經在這個網站上證明了這一點。 從軟體的角度來看,是的,如上圖所示(假設是小結尾或be-8大恩典),這是一個功能上的等價物。 如果你做了一個字的寫入,你可以做位元組的讀取來訪問那些基于位元組地址的位元組,如果你做了位元組的寫入,你可以做一個字的讀取,并在該讀取中看到那些單獨交易的位元組。

同時也要理解,一個存盤復數,stm,不被認為是單獨的32位事務。 無論是32位還是64位總線,每一個事務都有一個開銷,如果不是更多的話,總線的處理器端會對總線的芯片/總線控制器端說,我想做一個寫,好的,我已經準備好讓你寫。 你要宣告一個長度,即你要發送的總線寬度專案的數量。 因此,在32位總線上的一個stmia sp!,{r0,r1,r2,r3}將是一個有4個資料周期的單一事務,握手后在資料總線上有4個時鐘。 對于64位寬的總線,這不是假設,這就是為什么arm現在要求堆疊指標有64位對齊。 如果地址是64位對齊的,那么它就是一個長度為2的事務,所以資料總線上有兩個時鐘。 但是,如果它不是64位對齊,而是32位對齊,那就是三個事務,一個是32位的值(位元組屏蔽,把總線切成兩半),一個是64位事務,然后是32位事務。 如果處理器支持無對齊(甚至不是32位也不是16位),那么我還沒有見過這樣的內核,所以不知道,但我認為這也是一個以上的交易。


所以純粹從軟體編譯器的角度來看。 一個字大小的存盤就是一個字大小的存盤,四個位元組,一個基礎地址的32位數字。 在功能上等同于在基址 0、 1、 2、 3的四個位元組大小的寫入。 但在性能上不等同,也不等同于指令。 加載也是如此。

許多編譯器作者將在他們的設計中更進一步,盡可能地避免位元組大小的加載/存盤指令。 對于基于位元組/字符的

,你有兩個選擇
a = a   1;


r0 = r0   1
r0 = r0 & 0xff;
或 
左移算術24
右移算術24

或者

r0 = r0   1

后者知道進入該加法時,r0的上位已經按照變數型別(有符號或無符號)進行了填充,盡管是一個32位的暫存器和一個8位的變數型別,但仍然是32位的表示。 編譯器決定什么時候必須修改它以表示實際寬度。 即使有

a = a   1;
*bptr = a。

使用8位變數和8位指標,你仍然可以在ARM中使用32位暫存器來完成這個任務。

添加r0,r0,#1
 strb r0,[r1]

由于存盤將忽略/屏蔽暫存器的前24位,因此不需要預處理。


甚至更短。用str指令寫0x20000000到0xb8f0是一條指令,并且是一個離開處理器的單一事務(或內部到L1快取)。 它不是四個單獨的位元組寫入。 如果你選擇使用strb四次,四個位元組的寫入是一個功能上的等價物(同時假設在isr試圖讀取這個字大小的值時沒有發生中斷)。 但是你必須自己明確地進行四個位元組的寫入。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/320395.html

標籤:

上一篇:使用asp.netmvc搜索兩列欄位

下一篇:MARIE:如何列印一個名字

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more