驱动程序几个重要问题.ppt

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

驱动程序的几个重要问题 阳俊 开始驱动程序编程的几个前提 必须认真研究硬件电路原理图(全英文版的,在所给文件包里) 必须清楚S3C2410内部寄存器和GPIO口的分配使用情况 要不要使用中断,是不是用查询就够了 使用驱动程序框架,考虑必须使用的几个接口函数 内存与I/O访问 内存和I/O的硬件机制 Linux内存管理、内存区域的分布、常规内存与高端内存的区别 Linux内存存取的方法,内存动态申请以及通过虚拟地址存取物理地址的方法 设备I/O内存和I/O端口的访问编程模型 1、内存和I/O的硬件机制 一些基本的概念: (1)内存空间 (2)I/O空间:相对于内存空间而言的,一般与系统架构相关,比如IAX86的in和out指令。其中端口号标识了外设的寄存器地址,当然端口可以是控制口、状态口或数据口中的任何一个。(注意:当然如果让你自己设计电路板,外设仍然可以只挂接内存空间。) IN AX,端口号或DX OUT端口号或DX,AX 内存空间和I/O空间 这种编程模型使得每个进程的用户空间都是完全独立,互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。 Linux中1GB的内核空间又被划分为物理内存映射区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区。 Linux内核地址空间 内存存取相关的系统调用 用户空间内存的动态申请:Malloc()和free() 内核空间内存的动态申请:kmalloc()、__get_free_pages()和vmalloc() 注意:上面系统调用申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,存在简单的转换关系。而最后一个vmalloc() 在虚拟空间给出一块连续的内存区,实际上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc() 申请的虚拟内存和物理内存之间也没有简单的换算关系。 对于内核物理内存映射区的虚拟内存,使用virt_to _phys()可以实现内核虚拟地址转化为物理地址;反之,用phys_to _virt可以将物理地址转化成为内核虚拟地址。但是要注意的是,上面的方法仅适用与常规内存,高端内存的虚拟地址与物理地址之间不存在简单的换算关系。 设备I/O端口和I/O内存的访问 设备通常会提供一组寄存器来用于控制设备、读写设备和获取设备状态,就是我们通常所说的控制寄存器、数据寄存器和状态寄存器。而这些寄存器可能位于I/O空间,也可能位于内存空间。当位于I/O空间时,通常被称为I/O端口,当位于内存空间时,则对应的内存空间被称为I/O内存。 Linux的I/O端口和I/O内存访问接口编程模型 1、 I/O端口 在Linux设备驱动中,应使用Linux内核提供的函数来访问定位于I/O空间的端口,这些函数包括如下几种: 读写字节端口(8位宽) Usigned inb(usigned port) Usigned outb(usigned char byte,usigned port) 2、I/O内存 在内核中访问I/O内存之前,需首先使用ioremap()函数将设备所处的物理地址映射到虚拟地址。 ioremap()的原型: Void * ioremap(usigned long offset,usigned long size) 注意: ioremap()与vmalloc()类似,也需要建立新的页表,但是并不进行vmalloc()中所执行的内存分配行为,只是返回一个特殊的虚拟地址,该地址可用来存取特定的物理地址范围。并且使用的时候一定要注意,通过ioremap()获得的虚拟地址要被iounmap()函数释放,其原型: Void iounmap(void *addr) 在设备的物理地址被映射到虚拟地址后,有两中方法来访问: 1、通过指针直接访问 2、通过Linux内核提供的组函数来完成设备内存映射的虚拟地址的读写。 3、把I/O端口映射到内存空间 Void *ioport_map(usigned long port,usigned int count) Void ioport_unmap(void *addr) 通过第一个函数,可以把port开始的count个连续的I/O端口重映射成为一段“内存空间”。然后就可以在其返回的地址上象访问I/O内存一样访问I/O端口。当不需要这种映射时,应该调用第二个函数来撤消。实际上,映射到内存空间的行为实际上是给开发人员一种假象,并没有真正映射到内核虚拟地址,仅仅是为了让程序员可使用统一的I/O内存访问接口访问I/O端口。 4、申请与释放I/O端口和I/O内存 (1)I/O端口申请 Li

文档评论(0)

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

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

1亿VIP精品文档

相关文档