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

举例
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)
对地址是否为用户空间,内核空间进行了判断, 并作不同的处理,从而规避了可能的问题出现。   这部分没有细看过,
还请高手解释一下!

作者: tuibo   发布时间: 2011-02-18

我刚读内核代码 我的个人理解是 __user 这个宏表示 这个地址在用户空间 ,也就是内核态访问用户空间

作者: qianhulou   发布时间: 2011-02-18

这个判断就是以TASK_SIZE比较下就可以了

作者: amarant   发布时间: 2011-02-18