&,取地址符號,可以獲得一個變量在內存中的存儲地址,但是獲得的地址有異同,有的是偏移地址,有的是全局虛擬地址。
1、對於棧中的變量來說,&地址取得的是變量的偏移地址:
測試程序:test.c
編譯後運行,結果如下:
查看test的maps文件得:
計算得到變量test的真實虛擬地址爲:0x7ffd8c365000 & 0xffff00000000 | 0x8c383bc8 = 0x7ffd8c383bc8
根據頁表映射機制,編寫內核模塊根據虛擬地址計算出真實的物理地址爲:
可得test變量的物理地址爲0x7ffd8c383bc8 & 0xfff | 0xa9a28000 = 0xa9a28bc8。
最後,查看系統內存,證實變量test的值:
2、對於靜態全局變量(位於數據段中)來說,&取得的是全局虛擬地址:
測試程序test.c
編譯後運行,結果如下:
查看test的maps文件得:
計算得到變量test的真實虛擬地址爲:0x601038.
根據頁表映射機制,編寫內核模塊根據虛擬地址計算出真實的物理地址爲:
可得test變量的物理地址爲0x601038 & 0xfff | 0xa6e7e000 = 0xa6e7e038。
最後,查看系統內存,證實變量test的值: