簡單內存知識_程序中各變量所在區域

寫在前面:小生純業餘選手,開此博僅僅是爲了積累,純當筆記來用。如有看官光臨小生博客,請不要相信我的代碼就是正確的。如果您發現了錯誤也懇請耽誤您一點時間,請您在下面指出來,不勝感激!

如果發現一些筆記的說法完全是錯誤的請建議我刪除!


內存管理筆記(本次暫且用圖片)


內存從物理上來講:內存就是一堆硬件,存儲着若干狀態和狀態的組合,來唯一的代表一些數據。


從操作系統內核上講:操作系統是用來管理硬件資源的軟件,內核把物理內存與客戶(應用程序)隔離開,客戶是通過內核來存儲數據,而不直接訪問物理內存。於是,就有了虛擬地址,然後內核把虛擬地址映射到物理地址。虛擬地址就是一個整型的編號,當客戶通過malloc獲取內存地址實際上是虛擬地址。當然,能被分配的虛擬地址必須是通過內核映射到物理地址的虛擬地址,否則,該虛擬地址是不能使用的。


從程序上來看就是STL,數據結構,智能指針,malloc,new等等。


*各個獨立的程序是不能相互訪問他們各自的內存空間的,它們可能擁有相同的虛擬地址,但是虛擬地址所映射到實際物理內存時不一樣的!

首先,分析一個程序各部分分配在那些內存區域


如下截圖來自/proc/{pid}/maps



由以上程序可以分析得出,代碼中不同位置的變量存放在內存的那些區域,當然這裏是通過我們已經知道的關於變量存放區域的知識逆向分析出各個地址塊到底是代碼區(函數,全局常量)還是全局區(全局變量靜態全局,靜態局部)還是堆區(malloc分配得到)還是棧區(局部變量,局部常量)


*代碼區內存的權限比其他內存塊要多一個x(可執行)權限,所以很容易判斷出代碼區。

上面用cout輸出的函數地址看不懂,用printf()得到的地址可以看出函數是在代碼區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章