[工学]设备驱动程序简介2.pptVIP

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

让硬件动起来! ——驱动与硬件的接口 常用的系统资源 I/O端口 I/O内存 中断 DMA 内存 系统编址 统一编址:外设端口和主存单元使用同一组地址总线,属于同一个地址空间。对CPU来说,没有端口和内存的区别,CPU使用同一套硬件指令进行访问。 独立编址:外设端口和主存单元使用不同的地址总线,属于两个不同的地址空间(内存空间和I/O空间)。CPU使用两套不同的硬件指令分别访问主存单元和外设寄存器。 I/O端口和I/O内存 I/O端口就是映射到端口地址空间的外设寄存器或外设内存(I/O映射)。 I/O内存就是映射到内存地址空间的外设寄存器或外设内存(内存映射)。 I/O端口和I/O内存统称为I/O寄存器。 I/O寄存器和常规内存的区别 硬件寄存器和内存非常相似,在CPU看来几乎没有什么区别,但对硬件寄存器的I/O操作有“副作用”(主要目的),内存则没有。在编程实现时应注意不恰当的优化而带来的非预期的I/O动作。 驱动保证不使用高速缓存(禁用缓存) 访问I/O寄存器不重新排序(内存屏障) 分配I/O端口 #include linux/ioport.h int check_region(unsigned long start, unsigned long len); struct resource *request_region(unsigned long start, unsigned long len, char *name); void release_region(unsigned long start, unsigned long len); 分配I/O端口 check_region用来检查是否可以分配某个端口地址范围,如果不可以则返回一个负的错误编码。 request_region完成真正的端口地址范围分配,成功则返回一个非空指针。 release_region在驱动完成任务后被调用,以便释放分配的端口地址。 访问I/O端口 驱动程序申请了必须使用的I/O端口地址后,需要读写这些端口,以完成相关硬件操作。大多数的硬件把8位、16位、32位的端口区分开来对待。Linux内核头文件中定义了一些访问I/O端口的内联函数。 I/O端口访问函数 unsigned inb(unsigned port); void oub(unsigned char byte, unsigned port); unsigned inw(unsigned port); void outw(unsigned short word, unsigned port); unsigned inl(unsigned port); void outl(unsigned longword, unsigned port); 分配I/O内存 #include linux/ioport.h int check_mem_region(unsigned long start, unsigned long len); void request_mem_region(unsigned long start, unsigned long len, char *name); release_mem_region(unsigned long start, unsigned long len); 分配I/O内存 check_mem_region函数用来检查是否可以分配某个内存地址范围,如果不可以则返回一个负的错误编码。 request_mem_region函数完成真正的内存地址范围分配,成功则返回一个非空指针。 release_mem_region函数在驱动完成任务后被调用,以便释放分配的内存地址。 注:分配I/O内存时使用物理地址。 访问I/O内存 若内存经由页表访问,则必须安排I/O内存物理地址对驱动程序可见。 若内存不经由页表访问,则I/O内存就像I/O端口一样,可以直接用适当形式的包装函数进行访问。 X86上内存是经由页表访问的。 经由页表访问I/O内存 大多数平台都不直接映射内存,而通过MMU进行管理,所以软件(驱动)看到的内存地址只是虚拟内存地址。 外设寄存器( I/O内存)映射的内存地址是物理地址。 为了访问I/O内存,必须有一种把物理内存转换到虚拟内存的机制。这就是ioremap(和iounmap)要做的事情。 虚拟内存分配 ioremap函数通过建立新的页表将一段已知的物理地址转换成虚拟地址供软件(驱动)使用。 ioremap函数只分配虚拟内存,并不实际分配物理内存。 void *ioremap(unsigned long phys_addr, unsigned long size); void

文档评论(0)

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

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

1亿VIP精品文档

相关文档