设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 操作系统 >> 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操作系统设备驱动兼容性(8)   在核心的版本2.1,Linux的Intel移植对虚拟内存有了一个成熟的视图。早些的版本的内存管理一直使用“分段”的方法,这是从核心生命期的开始时期继承下来的。这个改变并不影响驱动程序代码,但不管怎样,还是值得一说的。新的规则与Linux的其它移植匹配的起来。虚拟地址空间被构造成核心居于非常高的地址(从3GB往上),而用户地址空间在0-3GB范围。当一个进程运行在“管态”时,它可以访问两个空间。另一方面,当它运行在“用户态”时,它不能访问核心空间,因为属于核心的页被标记为“管理员”页,处理器阻止了对它们的访问。

  这种内存布局有助于取消旧的memcpy_to_fs一类的函数,因为已经没有FS段了。核心空间和用户空间使用同一个“段”,其区别在于CPU所在的优先级。

  处理核心空间错误

  Linux核心的2.1版本对从核心空间处理段错误的能力有一个极大的增强。本章里,我准备对其原则给一个快速的概述。新机制对源码的影响在“访问用户空间”中已经描述过。

  如前面所提到过的,核心的最近版本充分利用了ELF二进制格式,特别是考虑到它的在编译的文件中定义用户定义的节的能力。编译器和链接器保证属于同一节的代码段在可执行文件中一定是连续的,因此当文件被装载时,在内存中也是连续的。例外处理是通过在核心可执行映象(vmlinux)中定义两个新节实现的。每次当源码通过copy_to_user, put_user, 或其读取的对应者访问用户空间时,一些代码被加到这两个节中。尽管这看起来是不可忽略的开销,这个新机制的一个结果是不再需要使用一个昂贵的verify_area。而且,如果使用的用户地址是正确的,计算流将不会有一个跳转。当被访问的用户地址是无效的时,硬件发出一个页面错。错误处理程序(在体系结构特定的源码树中的do_page_fault)确认这个错误是一个“不正确的地址”错(与“页不存在”相对),并使用下面的ELF节进行适当的动作:__ex_table这节是个指针对的表。每对的第一个指针指向一个可能因错误的用户空间地址而失败的指令,第二个值指向一个地址,处理器将在那里找到几条的指令来处理这个错误。..fixup这节包含指令,处理在__ex_table中描述的所有可能的错误。这个表中每对的第二个指针指向居于.fixup中的代码。

  头文件负责构造所需的ELF节。访问用户空间的每个函数(如put_user)扩展为汇编指令,它将指针加到__ex_table并处理.fixup中的错。当代码运行时,实际的执行路径有一下步骤组成:用于函数“返回值”的处理器寄存器被初始化为0(也就是没有错误),数据被传送,返回知被传回调用者。一般的操作的确非常快。如果一个异常发生,do_page_fault打印一条消息,查看__ex_table,跳转到.fixup,这里设置返回值为-EFAULT,然后跳转到访问用户空间的指令后位置。

  新的行为可以用faulty(在v2.1/misc-modules目录)模块来检验。faulty在第四章“调试技巧”中“调试系统错误”一节描述。faulty的设备结点通过读取一个短缓冲区界外来传送数据到用户空间,这样当读取一个在模块页以上的地址时,会导致一个页面错。有趣的是注意到这个错误依赖于使用核心空间中的一个不正确地址,而大多数情况下异常是有出错的用户空间地址造成的。当在PC上用cat命令读faulty时,下面的消息被打印在控制台上:

  

read: inode c1188348, file c16decf0, buf 0804cbd0, count 4096
       cat: Exception at [<c2807b7>](c2807115)

  前一行是由faulty的read方法打印的,而后者是由错误处理程序打印的。第一个数字是错误指令的地址,而第二个是修正代码(在.fixup节中)的地址。

  其它改变

  在2.0和2.1.43之间还有其它一些不同。以我的观点,它们不需要给予特别的关注,因此我将迅速地概述一下。proc_register_dynamic在2.1.29中消失了。最近的核心对每个/proc文件使用proc_register接口;如果结构proc_dir_entry的low_ino域是0,那么会被分配一个动态的inode号。当为2.1.29或更新的核心编译时,头文件sysdep-2.1.h象proc_register一样定义proc_register_dynamic;这个在注册的proc_dir_entry结构以0为inode号时是可行的。在网络接口驱动程序领域,rebuild_header设备方法从2.1.15起有一个新的原型。如果你只开发以太网驱动程序,你不会关心这个不同,因为以太网驱动程序不实现它们自己的方法;它们依赖于通用的以太网实现。当旧的实现需要时,头文件sysdep-2.1定义了宏__USE_OLD_REBUILD_HEADER__。示例模块snull显示了如何使用这个宏,但每必要在这

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

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