阅读:1263回复:4
请问如何锁定用户空间数据构建散离表?
或许这个题目挺怪,但请让我解释一下:
一般大家写驱动程序时(如一个字符型设备)实现write函数: charDev_write(struct file *filp,char *buff,size_t cont,loff_t * offset)时,一般都是先调用: _copy_from_user(void *to,void *from,long count)或者: get_user(local,ptr) 等先将数据从用户空间拷贝到kernel空间,然后再由设备driver处理。但是若数据量很大(cont很大),若采用此法实现数据移动,会影响性能(速度)。 因此还有另一种技术,及采用锁定用户空间数据的方法,将用户空间连续数据映射为内核空间离散的数据,经过此转换(映射)将得到一个内核散离表(satterlist)基地址 。利用此地址设备driver也可处理这些数据。 我是听人说还有这种技术的(但是如何实现,他也不清楚。若没有这钟技术,可别骂我),但究竟如何实现,用什么系统调用实现还请热心高手指点,或者介绍(推荐)相关资料也可! 非常感谢! |
|
沙发#
发布于:2004-03-01 19:10
个人观点,仅供参考:
1.系统在内核态下实际上可以访问地址空间内的所有部位。包括用户空间。之所以要使用_copy_from_user, 其原因在于需要进行安全性检查,do_getname(2.4.18内核)函数前面的E文给了很好的解释: /* In order to reduce some races, while at the same time doing additional checking and hopefully speeding things up, we copy filenames to the kernel data space before using them..*/ 2.至于你所说的”采用锁定用户空间数据的方法,将用户空间连续数据映射为内核空间离散的数据,经过此转换(映射)将得到一个内核散离表(satterlist)基地址”,从内核的实现上讲应该是可能的,或许是某个国外的kernel项目吧,可以在google上查。但原因可能并不是单纯的提高效率这么简单。并且,从安全的角度来看,也存在一些问题。 |
|
板凳#
发布于:2004-03-01 19:49
kernel_1998:
很感激您又一次回帖(你真是我的恩人,不止一次的回复)! 我今天苦等你一天,才有人回复!唉,我真是愁的要命!请你能告诉我哪个kernle项目(我查了好多都没有相关资料)。 在线等! |
|
地板#
发布于:2004-03-02 09:25
具体是不是一个kernel project我也不太清楚。不过我想问一下:
(1)你具体是要完成一个什么任务或者说你想通过这个内容学习什么东西? (2)你认为该项技术的价值在什么地方? |
|
地下室#
发布于:2004-03-02 10:55
kerne-_1998:
请问你能告诉我你的email地址吗? 我现在无法给你发附件! |
|