免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2531 | 回复: 5
打印 上一主题 下一主题

关于内核中使用 sys_* 系统调用接口,谁出来解释一下即使是__user 类型也可以使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-18 12:26 |只看该作者 |倒序浏览
举例
asmlinkage long sys_mount(char __user *dev_name, char __user *dir_name,
                                char __user *type, unsigned long flags,
                                void __user *data);
init/do_mounts.c 中就多次调用。

static int __init do_mount_root(char *name, char *fs, int flags, void *data)
{
        int err = sys_mount(name, "/root", fs, flags, data);
        if (err)
                return err;

        sys_chdir((const char __user __force *)"/root");
        ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;
        printk("VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
               current->fs->pwd.mnt->mnt_sb->s_type->name,
               current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ?
               " readonly" : "", MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
        return 0;
}

内核中直接调用时,给的确是内核空间的地址,个人猜测
static inline unsigned long __must_check copy_from_user(void *to,
                                          const void __user *from,
                                          unsigned long n)
对地址是否为用户空间,内核空间进行了判断, 并作不同的处理,从而规避了可能的问题出现。   这部分没有细看过,
还请高手解释一下!

论坛徽章:
0
2 [报告]
发表于 2011-02-18 13:00 |只看该作者
我刚读内核代码 我的个人理解是 __user 这个宏表示 这个地址在用户空间 ,也就是内核态访问用户空间

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 2011-02-18 13:41 |只看该作者
这个判断就是以TASK_SIZE比较下就可以了

论坛徽章:
0
4 [报告]
发表于 2011-02-19 15:54 |只看该作者
本帖最后由 linyunxian 于 2011-02-19 16:15 编辑

这个属性用于在打开内核编译检查时[ make C =1 ] 使用。否则为空。

论坛徽章:
0
5 [报告]
发表于 2012-08-18 20:05 |只看该作者
我想问下怎么在内核中使用系统调用呀,我使用syscalls.h里声明的sys_***系统调用,make时总是
    make -C /lib/modules/2.6.32.59alter/build M=/home/lsm/syslook modules
make[1]: Entering directory `/usr/src/kernels/linux-2.6.32.59'
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "sys_******" [***.ko] undefined!make[1]: Leaving directory `/usr/src/kernels/linux-2.6.32.59'

论坛徽章:
0
6 [报告]
发表于 2012-08-19 12:21 |只看该作者
本帖最后由 omycle 于 2012-08-19 12:23 编辑

回复 5# yimikeer


    系统调用是user mode进入kernel mode的窗户。module本身已经在kernel mode了,不需要系统调用。

另外,如果module需要调用其他module的函数,需要那个被调用的函数 EXPORT_SYMBOL
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP