簡體   English   中英

關於從內核訪問用戶空間內存

[英]About accessing userspace memory from kernel

我正在XNU內核上進行kext開發,有一個名為copyin及其朋友的KPI函數,類似於Linux內核上的copy_from_user

因此,我大多數時候都使用copyin,它在內核空間而不是相對易變的用戶空間處理數據更為安全,但是有時我需要從用戶空間處理大量內存(例如2MB),我只需要讀取,是直接訪問用戶空間內存的借口? (這會導致意外的問題嗎?)

用戶空間中的數據具有條目,因此我至少每次都需要讀取,此外,我也不需要從用戶空間過程中對該內存進行任何寫操作,我列出了三種我可以考慮的方法,希望有人可以給出我的建議,我真的很感激!

  1. 在內核空間分配足夠大小的可分頁內存(IOMallocPageable),並調用copyin從用戶空間復制整個數據
  2. Alloc還會分配可分頁的內存,並且大小足以容納一個條目,使用copyin進行讀取和處理,然后再次讀取相同的內存
  3. 使用stac禁用smap,直接從用戶空間讀取

第一種方法,如果我不寫,那可以映射到相同的物理圖,所以不需要浪費的內存嗎? 哪種方式效率更高?

如果您有用戶空間地址,則可以將其重新映射到內核-將IOMemoryDescriptor::withAddressRange與相關任務(流程任務)一起使用,並通過IOMemoryDescriptor::createMappingInTask將其映射到內核。

確保權限正確。

只是一個友好的提示- stac / clac指令由上下文切換代碼處理程序重寫,你將必須確保它不被在你復制階段調用。 完成-不太有趣。

暫無
暫無

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

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