通过set_fs可以改变thread_info->addr_limit的大小。 /** For historical reasons, the following macros are grossly misnamed:*/#defineKERNEL_DS ((mm_segment_t) { ~0UL }) /* cf. access_ok() */#defineUSER_DS ((mm_segment_t) { TASK_SIZE-1 }) /* cf. access_ok() */#defineVERIFY_...
这个可以用set_fs()、get_fs()来解决。在读写文件前先得到当前fs: mm_segment_t old_fs=get_fs(); 并设置当前fs为内核fs:set_fs(KERNEL_DS); 在读写文件后再恢复原先fs: set_fs(old_fs); set_fs()、get_fs()等相关宏在文件include/asm/uaccess.h中定义。 个人感觉这个办法比较简单。 另外就是...
set_fs(KERNEL_DS); 并在读取完毕后再执行一下以下代码: set_fs(old_fs); 如果不这样做又直接给参数2传递在内核态申请的空间的话,vfs_read() 函数会直接返回一个 -14 的错误码回来。这个错误码被定义在 ./kernel/include/uapi/asm-generic/errno-base.h 中。一定要注意要在申请内存之前先执行 set_fs(...
file->f_op->write的流程可能会调用access_ok->__range_ok,而__range_ok会判断访问的buf是否在0~addr_limit之间,如何是就ok,否则invalid,这显然是为用户准备的检查。addr_limit一般设为__PAGE_OFFSET,在内核空间,buf肯定>__PAGE_OFFSET,必须修改addr_limit,这就是set_fs的由来。 ps: 在 x86 linux 系統上...
set_fs static inline void set_fs(mm_segment_t fs) 该函数的作用是改变kernel对内存地址检查的处理方式, 其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间, 默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。
*/set_fs(USER_DS); 这个是一个体系结构相关的代码, 其定义如下 其定义在arch/对应体系/include/asm/uaccess.h中 arm64的定义如下 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 staticinlinevoidset_fs(mm_segment_t fs){current_thread_info()->addr_limit=fs;/* ...
mm_segment_t old_fs=get_fs(); 并设置当前fs为内核fs:set_fs(KERNEL_DS); 在读写文件后再恢复原先fs: set_fs(old_fs); set_fs()、get_fs()等相关宏在文件include/asm/uaccess.h中定义。 个人感觉这个办法比较简单。 另外就是用flip_open函数打开文件,得到struct file *的指针fp。使用指针fp进行相应...
set_fs(KERNEL_DS);//设置为数据段 if((from_fd = sys_open(s_file,O_RDONLY,0)) == -1) return-1; if((to_fd = sys_open(t_file,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1) return-2; while(bytes_read=sys_read(from_fd,buffer,1))//读源文件,一个字符一个字符的读 ...
The kernel will set up special mappings (page * table entries on i386) for each page that the kernel needs to * access. */ // /*高端内存区域 // 此区域是32位时代的产物,内核和用户地址空问按1:3划分,内核地址空间只有1GB,不能把1GB以上的内存直接 // 映射到内核地址。*/ ZONE_HIGHMEM, #...
arch_prctl(ARCH_SET_FS, 0x7fa9e9c0a580) = 0 mprotect(0x7fa9e9bff000, 12288, PROT_READ) = 0 mprotect(0x55b3058ca000, 4096, PROT_READ) = 0 mprotect(0x7fa9e9c4a000, 4096, PROT_READ) = 0 munmap(0x7fa9e9c0b000, 71314) = 0 ...