2012-03-12 89 views
17

用戶內存和內核內存在Linux內核(內核空間安全性)方面有什麼區別?如何從用戶空間訪問內核空間?

我可以從用戶空間在內核地址空間中寫入什麼不同的方式?

我知道的一種方法是通過系統調用。我們可以使用多個系統調用,但最後他們都是系統調用。即使在系統調用中,我們也會將數據發送到內核空間,在那裏它(驅動程序或相應模塊)調用像copy_from_user()這樣的函數將數據從用戶空間複製到內核空間。這裏我們完全沒有寫入地址空間。我們只是傳遞一個包含需要複製到內核緩衝區的數據的用戶指針。

我的問題是有什麼辦法可以訪問存在於內核空間中的物理地址並對其執行操作?

二,除了系統調用,還有其他的方式可以從用戶應用程序寫入內核空間嗎?

我提到這個link從stackoverflow。但我認爲我的問題沒有在那裏回答,而是從不同的角度來看。因此我想問一個不同的問題。

請分享您的知識... 謝謝。

+0

首先了解x86分頁如何工作:https://stackoverflow.com/questions/18431261/how-does-x86-paging-work,這將有所幫助。 – 2017-05-31 13:14:25

+1

另請參閱[如何在不崩潰Linux內核的情況下訪問mmaped/dev/mem?](https://stackoverflow.com/q/11891979/608639),[/ dev/mem的mmap失敗且參數無效,但地址爲頁面對齊](https://stackoverflow.com/q/39134990/608639)和[如何從用戶空間訪問內核空間?](https://stackoverflow.com/q/9662193/608639) – jww 2017-07-11 03:24:06

+0

您可能想要閱讀[vDSO](https://en.wikipedia.org/wiki/VDSO)。 – 2018-02-13 12:51:04

回答

18

我可以在 用戶空間的內核地址空間中寫入什麼不同的內容?

我不知道是否還有一些其他方法,但可以使用/dev/mem &系統調用mmap()訪問物理內存。

的/ dev/MEM是作爲主 存儲器的計算機的的圖像的字符設備文件。例如,它可以用來檢查系統(甚至是補丁)。 mem中的字節地址被解釋爲物理內存地址。

更多/dev/memhttp://linux.about.com/library/cmd/blcmdl4_mem.htm

更多mmap()http://linux.die.net/man/2/mmap

可以使用mmap()映射的/dev/mem一個部分,在用戶程序中使用。一個簡單的例子代碼:

#define MAPPED_SIZE //place the size here 
#define DDR_RAM_PHYS //place the physical address here 

int _fdmem; 
int *map = NULL; 
const char memDevice[] = "/dev/mem"; 

/* open /dev/mem and error checking */ 
_fdmem = open(memDevice, O_RDWR | O_SYNC); 

if (_fdmem < 0){ 
printf("Failed to open the /dev/mem !\n"); 
return 0; 
} 
else{ 
printf("open /dev/mem successfully !\n"); 
} 

/* mmap() the opened /dev/mem */ 
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS)); 

/* use 'map' pointer to access the mapped area! */ 
for (i=0,i<100;i++) 
printf("content: 0x%x\n",*(map+i)); 

/* unmap the area & error checking */ 
if (munmap(map,MAPPED_SIZE)==-1){ 
perror("Error un-mmapping the file"); 
} 

/* close the character device */ 
close(_fdmem); 

但是,請確保該地區你映射沒有被使用,例如內核,或者它會讓你的系統崩潰/掛了,你將被迫使用重啓硬件電源按鈕。

希望它有幫助。

+0

謝謝。是的,我認爲你在這裏提到的完美。即使在嵌入式c編程中,對於內存映射IO,我們也遵循相同的步驟,我們可以直接訪問寄存器。我認爲同樣的事情也可以用於內核空間。 – 2012-03-12 08:11:29

+0

我相信你需要用足夠的特權(root或類似的)來執行這些命令和函數。 – 2012-03-12 08:21:01

+0

是的,我總是使用root運行我的用戶程序。 – 2012-03-12 08:36:04

3

用戶內存和內核內存在內核中的區別究竟有多大? Linux內核(在內核空間安全性方面)?

不知道我是否理解你的問題。

對於內核來說技術上沒有太大的區別,它只是內存。爲什麼?因爲運行在最高特權CPU模式下的內核可以訪問所有內存。

我可以從 用戶空間在內核地址空間中寫入什麼不同的內容?

除非在內核或內核模式設備驅動程序中存在安全漏洞,否則至少不能直接執行此操作。然而,內核(或其驅動程序之一)可能會將數據從用戶模式應用程序的內存複製到內核內存。

...有沒有什麼辦法可以訪問內核空間中存在的物理地址 並對其執行操作?

同樣的事情,如果存在虛擬到物理地址轉換,您應該無法使用物理地址訪問內存。即使內核本身在啓用後也無法避免該翻譯。它必須在頁表中創建適當的虛擬到物理地址映射以訪問任意物理地址處的內存。

除了系統調用,還有沒有其他的方式,我可以寫進去 內核空間從用戶應用?

您還可以通過觸發異常(例如除以0,頁面錯誤,一般保護錯誤等)強制CPU切換到內核代碼。內核是第一個處理異常的人。內核將根據需要更改其內存以響應異常。它可能會從頁面錯誤的某處(例如磁盤)加載數據。

相關問題