一定要注意的是不能直接訪問用戶空間數據,內核代碼可以通過特殊的函數來訪問用戶空間數據,copy_to_user copy_from_user這兩個函數就是內核代碼訪問用戶空間數據的函數,但是內核不能直接通過像是memcpy函數來直接操作用戶空間數據。
按照linux設備驅動書本上的說法,我的理解,三個原因描述如下。
其一,驅動程序架構不同或者內核的配置不同,用戶空間數據指針可能運行在內核模式下根本就是無效的,可能沒有那個虛擬地址映射到的物理地址,也有可能直接指向一些隨機數。
其二,用戶空間的內存數據是分頁的,運行在內核模式下的用戶空間指針可能直接就不在內存上,而是在swap交換的其他存儲設備上,這樣就會發生頁面錯誤。頁面錯誤是內核所不允許的,會導致該進程死亡。
其三,內核代碼訪問用戶內存指針,就給內核開了後門,用戶程序可以利用這一點來任意的訪問操作全部地址空間,這樣內核就沒有安全性可言了。