2012-01-17 99 views
1

首先,malloc的從用戶空間的緩衝區,並與所有的「A」
填充緩衝區然後,通過緩衝到內核的指針,使用的網絡連接套接字,
最後,我可以閱讀和使用直接從用戶空間傳遞的原始指針寫入緩衝區。
爲什麼?
爲什麼直接從內核直接訪問用戶空間內存是允許的?內核不能直接操作未映射到內核地址空間的內存。內核讀取/寫入用戶空間內存

+0

@BaliC Linux設備驅動程序,第三版,第15章,內存映射 和DMA,高位和低位內存部分表示內核不能直接操作未映射到內核地址空間的內存。 – Ali 2012-01-17 09:45:54

+0

對不起我的錯誤,它看起來像功課! :) – 2012-01-17 09:46:45

回答

0

的一點是,訪問用戶直接在內核中只涉及有時工作。

只要您嘗試在分配它的同一進程的上下文中訪問用戶地址,並且該進程已將其故障並且正在使用具有3:1內存映射的內核(而不是有時使用4:4映射),並且內核沒有換出分配的頁面 - 訪問將起作用。

的問題是,所有這些條件並非總是如此,他們可以從程序到另一個的運行時間甚至改變。因此,內核驅動程序編寫者不需要能夠訪問用戶地址。

可能發生的最糟糕的事情是你認爲它的工作原理,有它一直在實驗室工作,有它在客戶現場,每隔一段時間崩潰。這是書籍聲明的原因。

0

在這本書 - 詞「的內核不能直接操作沒有映射到內核的地址空間記憶」是關於物理內存。換句話說 - 內核只有800-900 MB(在x86上)可以一次映射到物理內存。要訪問整個物理內存內核需要不斷重映射此區域。

Netlink根本不處理物理內存 - 它被設計用於用戶空間< - >用戶空間或用戶空間< - > kernelspace之間的雙向通信。