- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11章内存与IO访问-ourDEVCN网页不存在.PDF
入式学院—华清远见旗下品牌:
入式学院—华清远见旗下品牌:
《Linux 设备驱动开发详解》——第 11 章、内存与I/O 访问
I/O
第11 章 内存与 访问
由于Linux 系统中提供了复杂的内存管理功能,所以内存的概念在Linux 系统中
变得相对复杂,出现了常规内存、高端内存、虚拟地址、逻辑地址、总线地址、物理
地址、I/O 内存、设备内存、预留内存等概念。本章将系统地讲解内存和I/O 的访问编
程,带您走出内存和I/O 的概念迷宫。
11.1 节讲解内存和I/O 的硬件机制,主要涉 内存空间、I/O 空间和MMU 。
11.2 节讲解Linux 的内存管理、内存区域的分布、常规内存与高端内存的区别。
11.3 节讲解Linux 内存存取的方法,主要涉 内存动态申请以 通过虚拟地址存
取物理地址的方法。
11.4 节讲解设备I/O 内存和I/O 端口的访问流程,这一节对于编写设备驱动意义
非常重大,设备驱动使用此节的方法访问物理设备。
11.5 节讲解设备驱动中的DMA 与CACHE 一致性问题以 DMA 编程方法。
入式学院—华清远见旗下品牌:
《Linux 设备驱动开发详解》——第11 章、内存与I/O 访问
CPU 与内存和I/O
11.1.1 内存空间与I/O 空间
在X86 处理器中存在着I/O 空间的概念,I/O 空间是相对于内存空间而言的,它
通过特定的指令in、out 来访问。端口号标识了外设的寄存器地址。Intel 语法的in、
out 指令格式如下:
IN 加器, {端口号 DX}
OUT {端口号 DX}, 加器
目前,大多数 入式微控制器如ARM、PowerPC 等中并不提供I/O 空间,而仅存在内
存空间。内存空间可以直接通过地址、指针来访问,程序和程序运行中使用的变量和其他
数据都存在于内存空间中。
内存地址可以直接由C 语言指针操作,例如在186 处理器中执行如下代码:
unsigned char *p = (unsigned char *)0xF000FF00;
*p=11;
以上程序的意义为在绝对地址0xF0000+0xFF00 (186 使用16 位段地址和16 位偏移地
址)写入11。
而在 ARM 、PowerPC 等未采用段地址的处理器中,p 指向的内存空间就是
0xF000FF00,而*p = 11 就是在该地址写入11。
再如,186 处理器启动后 在绝对地址0xFFFF0 (对应C 语言指针是0xF000FFF0 ,
0xF000 为段地址,0xFFF0 为段内偏移)执行,请看下面的代码:
typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的函数指针类型
*/
lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*/
/* CPU启动后所执行第一条指令的位置 */
lpReset (); /* 调用函数 */
在以上程序中,没有定义任何一个函数实体,但是程序中却执行了这样的函数调
用:lpReset(),它实际上起到了“软重启”的作用,跳转到CPU 启动后第一条要执行
的指令的位置。因此,可以通过函数指针调用一个没有函数体的 “函数”,本质上只
是换一个地址开始执行。
即便是在X86 处理器中,虽然提供了I/O 空间,如果由我们自己设计电路板,外设仍
然可以只挂接在内存空间。此时,CPU 可以像访问一个内存单元那样访问外设I/O 端口,
而不需要设立专门的I/O 指令。因此,内存空间是必须的,而I/O 空间是可选的。图11.1
给出了内存空间和I/O 空间的对比。
入式学院—华清远见旗下品牌:
《Linux 设备驱动开发详解》——第 11 章、内存与I/O
文档评论(0)