- 论坛徽章:
- 0
|
在看do_execve函数时经常用到set_fs(KERNEL_DS),比如下面的函数
int copy_strings_kernel(int argc,char ** argv, struct linux_binprm *bprm)
{
int r;
mm_segment_t oldfs = get_fs();
set_fs(KERNEL_DS);
r = copy_strings(argc, (char __user * __user *)argv, bprm);
set_fs(oldfs);
return r;
}
set_fs(KERNEL_DS)是把thread_info下面的addr_limit字段设成KERNEL_DS。
我的理解是这么做是给(char __user * __user *)argv服务。__user定义告诉gcc利用sparse做静态编译检查,确定*argv和**argv都是合法的,也就是说sparse工具会比较*argv,**argv和addr_limit来判断合法性,是这样吗?
还有一个问题是为什么search_binary_handler里需要用到set_fs(USER_DS)。 |
|