15.2. mmap 设备操作.pdf

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
15.2. mmap 设备操作

15.2. mmap 设备操作 15.2. mmap 设备操作 内存映射是现代 Unix 系统最有趣的特性之⼀. ⾄于驱动, 内存映射可被实现来提供⽤ 户程序 设备内存的直接存取. ⼀个 mmap ⽤法的明确的例⼦可由查看给 X Windows 系统服务器的虚拟内存区的⼀个 ⼦集来见到: cat /proc/731/maps 000a0000-000c0000 rwxs 000a0000 03:01 282652 /dev/mem 000f0000r-xs 000f0000 03:01 282652 /dev/mem 005c0000 r-xp03:01 1366927 /usr/X11R6/ in/Xorg 006 f000-006f7000 rw-p 001 f000 03:01 1366927 /usr/X11R6/ in/Xorg 22a958a8000 rw-s fcc00000 03:01 282652 /dev/mem 2a958a8000-2a9d8a8000 rw-s e8000000 03:01 282652 /dev/mem ... X 服务器的 VMA 的完整列表很长, 但是⼤部分此处不感兴趣. 我们确实见到, 但是, /dev/mm 的 4 个不同映射, 它给出⼀些关于 X 服务器如何使⽤视频卡的内幕. 第⼀个映 射在 a0000 , 它是视频内存的在 640-KB ISA 孔⾥的标准位置. 再往下, 我们见到了⼤映 射在 e 000000 , 这个地址在系统中最⾼的 RAM 地址之上. 这是⼀个在适配器上的视频 内存的直接映射. 这些区也可在 /proc/iomem 中见到: 000a0000-000 ffff : Video RAM area 000c0000-000ccfff : Video ROM 000d1000-000d1fff : Adapter ROM 000f0000-000fffff : System ROM d7f00000-f7efffff : PCI Bus #01 e8000000-efffffff : 0000:01:00.0 fc700000-fccfffff : PCI Bus #01 fcc00000-fcc0ffff : 0000:01:00.0 映射⼀个设备意味着关联⼀些⽤户空间地址到设备内存. ⽆论何时程序在给定范围内 读或写, 它实际上是在存取设备. 在 X 服务器例⼦⾥, 使⽤ mmap 允许快速和容易地存 取视频卡内存. 于⼀个象这样的性能关键的应⽤, 直接存取有很⼤不同. 如你可能期望的, 不是每个设备都出借⾃⼰给 mmap 抽象; 这样没有意义, 例如, 串⼜ 或其他⾯向流的设备. mmap 的另⼀个限制是映射粒度是 PAGE_SIZE . 内核可以管理虚 拟地址只在页表⼀级; 因此, 被映射区必须是 PAGE_SIZE 的整数倍并且必须位于是 PAGE_SIZE 整数倍开始的物理地址. 内核强制 size 的粒度通过做⼀个稍微⼤些的区域, 如果它的⼤⼩不是页⼤⼩的整数倍. 这些限制 驱动不是⼤的限制, 因为存取设备的程序是设备依赖的. 因为程序必须知道 设备如何⼯作的, 程序员不会太烦于需要知道如页 齐这样的细节. ⼀个更⼤的限制存 在当 ISA 设备被⽤在⾮ x 6 平台时, 因为它们的 ISA 硬件视图可能不连续. 例如, ⼀些 Alpha 计算机将 ISA 内存看作⼀个分散的 位, 16 位, 32 位项的集合, 没有直接映射. 这 种情况下, 你根本⽆法使⽤ mmap . 不能进⾏直接映射 ISA 地址到 Alph 地址可能只发 ⽣在 32-位 和 64-位内存存取, ISA 可只做 -位 和 16-位 发送, 并且没有办法来透明映 射⼀个协议到另⼀个. 使⽤ mmap 有相当地优势当这样做可⾏的时候. 例如, 我们已经看到 X 服务器, 它传送 ⼤量数据到和从视频内存; 动态映射图形显⽰到⽤户空间提⾼了吞吐量, 如同⼀个 lseek/write 实现相反. 另⼀个典型例⼦是⼀个控制⼀个 PCI 设备的程序. ⼤部分 PCI 外 设映射它们的控制寄存器到⼀个内存地址, 并且⼀个⾼性能应⽤程序可能⾸选 寄存 器的直接存取来代替反复地调⽤ ioctl 来完成它的⼯作. mmap

文档评论(0)

ayangjiayu4 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档