我正在尝试打电话
sys_readlink(const char __user *path, char __user *buf, int bufsiz)
直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。
那么,是否有可能从内核分配用户空间内存?
kmalloc(size, GFP_USER)
与kmalloc(size, GFP_KERNEL)
内核内存相似并返回指向内核内存的指针。
您可以使用以下方法临时禁用内存地址有效性检查: set_fs
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
/* Your syscall here */
set_fs(old_fs);
问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用
问题内容: 我在Linux中编写了一个自定义设备驱动程序,该驱动程序必须能够非常快速地响应中断。用户空间实现中已经存在处理此问题的代码,但是它太慢了,因为它依赖于软件不断检查中断线的状态。经过研究,我发现您可以从内核模块注册这些中断线,并执行由函数指针提供的功能。但是我们要执行的代码是在用户空间中,是否有一种方法可以从内核空间模块调用用户空间中的函数? 问题答案: 从内核调用用户空间功能很不走运,
问题内容: 我知道udev在linux系统上运行,并且它通过netlink套接字接收从内核发送的uevent。 但是,我的问题是: 内核如何发出事件?它必须是通过添加/删除设备触发的,然后将事件发送给udev。内核如何做到这一点?(是否可以找到任何代码示例?) udev仅通过netlink套接字接收这些uevent。这是udev做到这一点的唯一方法。它是否正确? 当uevent从内核发出时,我知道
我开发了kervel驱动程序,并与dell进行了通信。尝试做一个快照功能和行走功能 我的结构是 在我的快照函数中,我这样做。 在walk函数中,我执行以下操作 当我在我的驱动程序条目中(当驱动程序加载时)使用这个函数时,所有的工作都很好。但当我从dll中调用它时,只有2秒钟的时间“Word Fine”,然后我就会出现蓝屏。 当我尝试从SM_MSI结构中删除Name变量时,所有工作都很完美。!!所以
问题内容: Linux内核内部用户内存和内核内存的区别是什么 (就给内核空间提供安全性而言)? 我可以从用户空间在内核地址空间中写入什么不同的方式? 我知道的一种方法是通过系统调用 。我们可以使用多个系统调用,但最后它们都是系统调用。即使在系统调用中,我们也将数据发送到内核空间,在此它(驱动程序或相应的模块)调用诸如copy_from_user()之类的函数将数据从用户空间复制到内核空间。在这里,
问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(