内存与端口映射..docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存与端口映射.

A. 可重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误 在kernel/Resource.c中定义了全局变量ioport_resource和iomem_resource,分别描述基于I/O映射方式的I/O端口空间和基于内存映射方式的I/O内存资源空间(包括I/O端口和外设内存)。其定义如下:? ?struct?resource?ioport_resource? =??{?PCI?IO,?0x0000,?IO_SPACE_LIMIT,?IORESOURCE_IO?} struct?resource?iomem_resource ?=?{?PCI?mem,?0?0xffffffff,?IORESOURCE_MEM?} ?其中,宏IO_SPACE_LIMIT表示整个I/O空间的大小,对于X86平台而言,它是0xffff(定义在include/asm-i386/io.h头文件中)。显然,I/O内存空间的大小是4GB。 ●IO端口空间?的申请、检测、释放操作 基于I/O?Region的操作函数__XXX_region(),Linux在头文件include/linux/ioport.h中定义了三个对I/O端口空间进行操作的宏:①request_region()宏,请求在I/O端口空间中分配指定范围的I/O端口资源。②check_region()宏,检查?I/O端口空间中的指定I/O端口资源是否已被占用。③release_region()宏,释放I/O端口空间中的指定I/O端口资源。这三个宏的定义如下: 1???#define?request_region(start,n,name)??? __request_region(ioport_resource,?(start),?(n),?(name))? 2???#define?check_region(start,n)? ?__check_region(ioport_resource,?(start),?(n))? 3???#define?release_region(start,n)? ?__release_region(ioport_resource,?(start),?(n)) 其中,宏参数start指定I/O端口资源的起始物理地址(是I/O端口空间中的物理地址),宏参数n指定I/O端口资源的大小。 ●读写I/O端口空间 ?在驱动程序请求了I/O端口空间中的端口资源后,它就可以通过CPU的IO指定来读写这些I/O端口了。在读写I/O端口时要注意的一点就是,大多数平台都区分8位、16位和32位的端口,也即要注意I/O端口的宽度。 Linux中访问IO端口函数:inb(),inw(),inl(),outb(),outw(),outl(), “b”“w”“l”分别代表8位,16位,32位。 ●I/O内存资源的申请、检测、释放操作 基于I/O?Region的操作函数__XXX_region(),Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏: #define?request_mem_region(start,n,name)? ?__request_region(iomem_resource,?(start),?(n),?(name))? #define?check_mem_region(start,n)? ?__check_region(iomem_resource,?(start),?(n))? #define?release_mem_region(start,n)? __release_region(iomem_resource,?(start),?(n) 1) request_mem_region(),请求分配指定的IO内存资源   2) check_mem_region(),检查指定的IO内存资源是否已被占用 3) release_mem_region(),释放指定的IO内存资源 其中,参数start是IO内存区的物理地址(是CPU的RAM物理地址空间中的物理地址),参数n指定I/O内存资源的大小。   ●驱动开发人员可以将内存映射方式的IO端口和外设内存统一看作是IO内存资源。 ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。 ●读写IO内存资源 Linux中访问IO内存资函数:readb(),readw(),readl(),writeb(),writew(),

文档评论(0)

klfgk7s7fas + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档