【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )
文章目錄
- 一、x86 架構下的堆內存
- 二、x86 架構下的棧內存 與 函數調用
一、x86 架構下的堆內存
在可用內存中 , 申請內存塊 , 這部分內存塊就是堆內存 ;
- C 語言中使用 malloc 等函數申請堆內存 ; 調用 free 函數釋放內存 ;
- Java 語言中使用 new 關鍵字創建的對象 , 一般都是放在堆內存中 ; GC 垃圾回收期自動釋放內存 ;
應用程序 , 通過 " 系統調用 " 向系統申請內存塊 , 系統分配內存塊 , 將分配的地址返回給申請內存的應用程序 ; 這里的 " 系統調用 " 就是調用 malloc 等函數 , 申請內存 ;
堆內存是由系統分配的 , malloc 是 stdlib 標準庫中的函數 , 其真正的實現是調用了系統中斷 ( int3 軟中斷 ) , 將申請內存的字節大小 size 放到寄存器中 , 中斷發生后 , 切換到系統層面 , 在系統管理的內存塊中 , 分配 size 大小的內存 , 將這塊內存的首地址返回 ;
對于 Java 語言的 new 關鍵字在堆內存中創建對象 , Java 運行環境氛圍兩層 , 上層是 Java 虛擬機 ( JVM ) , 下層是 Windows / Linux / Mac 操作系統 ;
Java 虛擬機啟動時 , 首先要根據啟動時的 內存設置參數 , 維護一個指定大小的內存空間 ; JVM 申請的內存 , 可以一次性分配完畢 , 也可以選擇使用多少分配多少的策略 ;
new 創建對象 , 由 JVM 向 操作系統 申請一塊內存 , 然后返回內存的首地址給客戶端 ;
二、x86 架構下的棧內存 與 函數調用
" 棧 " 是內存中的一塊連續的地址 , 棧內存是一塊連續的有順序的內存 ;
- 棧底處于內存低地址 , 棧頂處于內存高地址 ;
- 棧底處于內存高地址 , 棧頂處于內存低地址 ;
上述兩種情況 , 都有可能出現 ;
調用函數時 , 首先將參數入棧 , 每傳入一個參數 , 棧指針都要向上移動 ;
執行 func(arg0, arg1, arg2) 函數 , 將函數參數放入棧時 , 從右到左依次入棧 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】x86 CPU
- 下一篇: 【Android 插件化】插件化框架整理