这是我的实验作业:我是内核空间的初学者。
我做了一个简单的系统调用实现,它按预期工作。但是,我想更进一步,看看给我的系统调用提供不正确的数据,看看它是否能处理它。
例如,我在系统调用中使用了access_ok。我真的想传递一个无效的用户空间指针,看看我是否在系统调用中正确地使用了access_ok。
该怎么做呢?我看到了,如果我传递内核空间指针,access_ok将会失败。但是我该如何写一个驱动程序来做到这一点呢?
发布于 2013-02-06 13:02:36
因为您正在尝试将无效的用户空间指针传递给宏access_ok(类型,地址,大小);。
所以它只是检查提供的指针是否不在内核空间区域,如果它在内核空间内存中,那么将返回零(0),否则将返回true,所以通过这种方式,您可以检查所需的结果。如果您提供的是内核内存之外的任何地址,则可以接受(提供的地址可能不是调用此系统调用的进程的地址空间,在本例中,提供的VERIFY_READ或VERIFY_WRITE类型将决定执行操作)。
在access_ok()的手册页中,请参阅http://mirror.linux.org.au/linux-mandocs/2.6.12.6/access_ok.html。请注意,根据体系结构的不同,此函数可能只检查指针是否在用户空间范围内-调用此函数后,内存访问函数仍可能返回-EFAULT
如果你想把指针传递给内核,你可以这样做: 1->定义一个包含指针地址的结构。2->在内核模块或驱动程序中添加相同的结构。所以内核和用户都知道这个结构。3->在您的系统调用中添加一个参数作为char __user var。4->在已定义结构的用户空间中创建一个结构变量,并在用户空间应用程序中调用时将其传递到系统调用中。5->在为系统调用定义代码的内核模块或驱动程序中,创建一个与在用户空间中使用的结构相同的结构变量。现在做你想做的任何事。
`
struct new_struct
{
void *p; //set this pointer which you want to send...
};
//from user-application...
int main()
{
....
struct new_struct req_kernel;
your_system_call_function(...,(void *)&req_kernel,...);
}
//this is inside your kernel...
your_system_call(...,char __user optval,...)
{
.....
struct new_struct req;
if (copy_from_user(&req, optval, sizeof(req)))
return -EFAULT;
//now you have the address or pointer which you want in kernel with struct req...
}`
https://stackoverflow.com/questions/14719560
复制相似问题