(zz)linux - 驱动中如何访问CPU中的寄存器?

http://blog.chinaunix.net/u2/68846/showart_692324.html

 

正在移植2440, 偶然看2.6.32代码的时候, 发现smdk2440的mach-smdk2440.c中有如下结构体定义:

 

 

不明白什么意思, so~ google到了http://blog.chinaunix.net/u2/68846/showart_692324.html

 

如果都是在memory空间的话,CPU内部的寄存器(非CPU核的寄存器)和外设上的寄存器地位是同等的,因此映射方法也是2种:1是静态映射(S3C2410的基本上是这种),2是ioremap,注意映射的单位都至少是page。当然CPU核的寄存器(如X86的CS、DS,ARM的R0,R1等)只能用汇编来访问了。

在将Linux移植到目标电路板的过程中,通常会建立外设I/O内存物理地址到虚拟地址的静态映射,这个映射通过在电路板对应的map_desc结构体数组中添加新的成员来完成,map_desc结构体的定义如代码清单11.12所示。

代码清单11.12 map_desc结构体

 

例子就是文章开头的ARM评估板SMDK2440mach-smdk2440.c部分代码.

Linux操作系统移植到特定平台上MACHINE_STARTMACHINE_END宏之间的定义针对特定电路板而设计,其中的map_io()成员函数完成I/O内存的静态映射,代码清单11.14给出了SMDK2440电路板的MACHINE_STARTMACHINE_END宏的例子。


代码清单11.14 SMDK2440 MACHINE_STARTMACHINE_END

 

8行赋值给map_iosmdk2440_map_io()函数完成SMDK2440电路板I/O内存的静态映射,最终调用的是cpu->map_io()建立map_desc数组中物理内存和虚拟内存的静态映射关系。

 


在一个已经移植好OS的内核中,驱动工程师完全可以对非常规内存区域的I/O内存(外设控制器寄存器、MCU内部集成的外设控制器寄存器等)依照电路板的资源使用情况添加到map_desc数组中,代码清单11.15的例子给出了内存空间资源的使用情况(注释部分)与map_desc数组的对应关系。

 

 

此后,在设备驱动中访问经过map_desc数组映射后的I/O内存时,直接在map_desc中该段的虚拟地址上加上相应的偏移即可,不再需要使用ioremap()

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值