簡體   English   中英

如何將 mmap() 64 位地址轉換為 32 位進程?

[英]How to mmap() 64-bit address into 32-bit process?

我正在嘗試將駐留在 64 位地址上的設備內存映射到 64 位操作系統上的 32 位進程。 我正在使用以下幾行

baseaddr = addr & ~(sysconf(_SC_PAGE_SIZE) - 1);
fd = open("/dev/mem", O_RDONLY | O_SYNC);
base_ptr = mmap(0, 4096, PROT_READ, MAP_PRIVATE, fd, baseaddr);

baseaddr 是 uint64_t 並且大於 4GB。

我用-D_FILE_OFFSET_BITS=64編譯。 當我運行程序時,它返回EINVAL 它以前在沒有-D_FILE_OFFSET_BITS=64情況下工作,但它只使用 baseaddr 的低 32 位 - 我通過 pmap -d 的輸出顯示我所需地址的低 32 位得出結論。

任何想法我做錯了什么?

您應該在這里使用mmap64 地址必須映射到 32 位進程可以使用的區域。 但是,我強烈建議您獲得此應用程序的真正 64 位版本。 你正朝着這里的一個兔子洞前進,那個洞里有很多兔子便便,如果你注意到我的漂移......

好的,我的最終解決方案是添加混合的 32/64 匯編代碼,該代碼切換到長模式,加載具有所需值的長寄存器,然后在沒有任何類型的包裝器的情況下進行系統調用並切換回受保護。 奇跡般有效。

暫無
暫無

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

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