当前位置: 首页 > 面试题库 >

如何从用户空间访问(如果可能)内核空间?

钱睿范
2023-03-14
问题内容

Linux内核内部用户内存和内核内存的区别是什么 (就给内核空间提供安全性而言)?

我可以从用户空间在内核地址空间中写入什么不同的方式?

我知道的一种方法是通过系统调用
。我们可以使用多个系统调用,但最后它们都是系统调用。即使在系统调用中,我们也将数据发送到内核空间,在此它(驱动程序或相应的模块)调用诸如copy_from_user()之类的函数将数据从用户空间复制到内核空间。在这里,我们确实没有写地址空间。我们只是传递一个用户指针,其中包含需要复制到内核缓冲区的数据。

我的问题是,有什么方法可以访问内核空间中存在的物理地址并对其执行操作?

其次, 除了系统调用之外,还有其他方法可以从用户应用程序写入内核空间吗?

请分享您的知识…谢谢。


问题答案:

我可以从用户空间在内核地址空间中写入什么不同的方式?

我不确定是否还有其他方法,但是您可以使用/dev/mem&system call 访问物理内存mmap()

/ dev / mem 是字符设备文件,它是计算机主内存的映像。例如,它可以用于检查(甚至修补)系统。mem中的字节地址被解释为物理内存地址。

有关更多信息/dev/mem:http :
//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);

但是,请确保未映射您正在映射的区域(例如,内核使用了该区域),否则它将使系统崩溃/挂起,并且您将被迫使用硬件电源按钮重启。

希望能帮助到你。



 类似资料:
  • 问题内容: 我在Linux中编写了一个自定义设备驱动程序,该驱动程序必须能够非常快速地响应中断。用户空间实现中已经存在处理此问题的代码,但是它太慢了,因为它依赖于软件不断检查中断线的状态。经过研究,我发现您可以从内核模块注册这些中断线,并执行由函数指针提供的功能。但是我们要执行的代码是在用户空间中,是否有一种方法可以从内核空间模块调用用户空间中的函数? 问题答案: 从内核调用用户空间功能很不走运,

  • 问题内容: 我阅读了LKD 1中的一些段落,但 我无法理解以下内容: 从用户空间访问系统调用 通常,C库提供对系统调用的支持。用户应用程序可以从标准标头中提取函数原型,并与C库链接以使用您的系统调用(或库例程,后者又使用syscall调用)。但是,如果您只是编写了系统调用,则怀疑glibc是否已支持它! 幸运的是,Linux提供了一组宏,用于包装对系统调用的访问。它设置寄存器内容并发出陷阱指令。这

  • 问题内容: 我正在尝试打电话 直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。 那么,是否有可能从内核分配用户空间内存? 与 内核内存相似并返回指向内核内存的指针。 问题答案: 您可以使用以下方法临时禁用内存地址有效性检查:

  • 问题内容: 我知道udev在linux系统上运行,并且它通过netlink套接字接收从内核发送的uevent。 但是,我的问题是: 内核如何发出事件?它必须是通过添加/删除设备触发的,然后将事件发送给udev。内核如何做到这一点?(是否可以找到任何代码示例?) udev仅通过netlink套接字接收这些uevent。这是udev做到这一点的唯一方法。它是否正确? 当uevent从内核发出时,我知道

  • 问题内容: 在运行Linux的基于ARM的系统上,我有一个将内存映射到物理地址的设备。从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容? 问题答案: 您可以使用系统调用将设备文件映射到用户进程内存。通常,设备文件是物理内存到文件系统的映射。否则,您必须编写一个内核模块来创建此类文件或提供一种将所需内存映射到用户进程的方法。 另一种方法是将/ dev / mem的部分重新映射到用户内存。 编

  • 问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用