2012-03-12 107 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切换到内核代码。内核是第一个处理异常的人。内核将根据需要更改其内存以响应异常。它可能会从页面错误的某处(例如磁盘)加载数据。

相关问题