设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 操作系统 >> Linux >> 详解Linux操作系统设备驱动兼容性
精品推荐
Linux点击TOP10
·Linux下安装LumaQQ
·口袋里的Linux:在您的U盘上运行SLAX
·Linux命令Man解释:PPPD(8) :点对点daemon协议
·虚拟网络计算工具VNC使用指南
·Linux系统中如何正确安装摄像头驱动
·Linux 内核文件系统与设备操作流程分析
·Linux 核心--4.内存管理
·Ethernet HOWTO Linux以太网-HOWTO (4)型号的信息
·Linux精彩桌面 GNOME桌面主题安装实例
·Linux下Flash/Shockwave播放器安装
操作系统点击TOP10
·Windows Vista完全硬盘安装法
·Windows Vista 激活不求人
·Windows Vista局域网网络连接设置
·Windows Vista系统动态桌面截图欣赏
·Windows XP中磁盘的分区应用
·Windows NT/2000/XP 出现蓝屏并显示“STOP 0x0000007f”错误
·让Windows XP变身Vista
·一招搞定Vista系统软件不兼容问题
·教你如何正确配置和优化Windows Vista
·只转两圈 加快Windows XP启动速度
精选专题

详解Linux操作系统设备驱动兼容性

作者: 来源:http://www.xgdown.com/ 时间:2006-12-27 11:14:53

详解Linux操作系统设备驱动兼容性(4)   核心的第一个2.1版引入了一种从核心代码访问用户空间的新(更好)方法。这个改变修正了一个长期存在的错误行为并增强了系统的性能。当你位核心2.1编译代码,并需要访问用户空间时,你需要包含,而不是。你还必须使用一个与2.0不同的函数集。不用说,头文件sysdep-2.1.h尽可能地照顾了这些不同,允许你在2.0上编译时使用2.1的语义。在用户访问中最令人注意的不同时verify_area没有了,因为多数验证都由CPU完成了。关于这个主题的细节见本章后面的“处理核心空间错误”。

  可被用来访问用户空间的新的函数集是:

  

int Access_ok(int type, unsigned long addr, unsigned long size);

  如果当前进程被允许访问地址addr处的内存,函数返回真(1),否则为假(0)。这个函数取代verify_area,尽管它进行较少的检查。和老的verify_area接收一样的参数,但是要快的多。在你复引用一个用户空间地址之前,这个函数应该被调用对之进行检查;如果你没有检查,用户有可能会访问和修改核心内存。本章后面的“虚拟内存”一节更细致地解释了这个问题。幸运的是,下面描述的大多数函数都替你进行了这个检查,因此你实际上并不需要调用access_ok,除非你选择这样做。因此你实际上并不需要调用access_ok,除非你选择这样做。int get_user(lvalue, address);在2.1核中使用的宏get_user与我们在2.0中使用的并不相同。其返回值在成功时为0,否则为一个负的错误代码(总是-EFAULT)。这个函数的净效果是将从地址address取得的数据赋给lvalue。在通常的C语言含义中,这个宏的第一个参数必须是一个lvalue*。与2.0版中的这个函数类似,数据项的实际大小依赖于address参数类型。这个函数在内部调用access_ok。

  

int __get_user(lvalue, address);

  这个函数完全类似get_user,但它不内部调用access_ok。当你访问一个已经从同一核心函数内部检查过的用户地址时,你应该调用__get_user。

  

get_user_ret(lvalue, address, retval);

  这个宏是调用get_user的快捷方式,如果函数失败则返回retval。

  

int put_user(expression, address);
int __put_user(expression, address);
put_user_ret(expression, address, retval);

  这些函数与它们的get_对应者非常类似,只是它们是向用户空间写,而不是读。成功时,值expression被写到地址address。

  

unsigned long copy_from_user(unsigned long to, unsigned long from, unsigned
long len);

  这个函数从用户空间复制数据到核心空间。它代替旧的memcpy_tofs调用。这个函数内部调用access_ok。返回值是未能传送的字节数。这样,如果发生错误,返回值必然大于0;在那种情况下,驱动程序返回-EFAULT,因为错误是由错误的内存访问引起的。

  

unsigned long __copy_from_user(unsigned long to, unsigned long from,
unsigned long len);

  这个函数与copy_from_user一样,但它不内部调用access_ok。

  

caopy_from_user_ret(to, from, len, retval);

  这个宏是内部调用copy_from_user的快捷方式;如果失败,则从当前函数返回。

  

unsigned long copy_to_user(unsigned long to, unsigned long from, unsigned

共9页 9 7 [1] [2] [3] [4] [5] [6] [7] [8] [98 :>

详解Linux操作系统设备驱动兼容性 相关文章:
详解Linux操作系统设备驱动兼容性 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com