首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在系统调用实现中测试否定或失败案例

在系统调用实现中测试否定或失败案例
EN

Stack Overflow用户
提问于 2013-02-06 08:32:29
回答 1查看 356关注 0票数 1

这是我的实验作业:我是内核空间的初学者。

我做了一个简单的系统调用实现,它按预期工作。但是,我想更进一步,看看给我的系统调用提供不正确的数据,看看它是否能处理它。

例如,我在系统调用中使用了access_ok。我真的想传递一个无效的用户空间指针,看看我是否在系统调用中正确地使用了access_ok。

该怎么做呢?我看到了,如果我传递内核空间指针,access_ok将会失败。但是我该如何写一个驱动程序来做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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->在为系统调用定义代码的内核模块或驱动程序中,创建一个与在用户空间中使用的结构相同的结构变量。现在做你想做的任何事。

`

代码语言:javascript
复制
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...
        }

`

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14719560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档