Chinaunix

标题: 关于内核中使用 sys_* 系统调用接口,谁出来解释一下即使是__user 类型也可以使用 [打印本页]

作者: tuibo    时间: 2011-02-18 12:26
标题: 关于内核中使用 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)
对地址是否为用户空间,内核空间进行了判断, 并作不同的处理,从而规避了可能的问题出现。   这部分没有细看过,
还请高手解释一下!
作者: qianhulou    时间: 2011-02-18 13:00
我刚读内核代码 我的个人理解是 __user 这个宏表示 这个地址在用户空间 ,也就是内核态访问用户空间
作者: amarant    时间: 2011-02-18 13:41
这个判断就是以TASK_SIZE比较下就可以了
作者: linyunxian    时间: 2011-02-19 15:54
本帖最后由 linyunxian 于 2011-02-19 16:15 编辑

这个属性用于在打开内核编译检查时[ make C =1 ] 使用。否则为空。
作者: yimikeer    时间: 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'
作者: omycle    时间: 2012-08-19 12:21
本帖最后由 omycle 于 2012-08-19 12:23 编辑

回复 5# yimikeer


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

另外,如果module需要调用其他module的函数,需要那个被调用的函数 EXPORT_SYMBOL




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2