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