linux驱动中物理地址的空间转换
来源:互联网 发布:java格式化日期到毫秒 编辑:程序博客网 时间:2024/04/29 17:51
在linux kernel 中,物理地址是不能直接使用的,ARM9可以最大寻址范围为1G,其从0X00000000开始都是物理地址。。必须通过转换才可以。
转换分为两种, 静态和动态。
静态就是下面那种,不过,静态的地址转换,还需要在kernel 初始化的时候作映射。
动态映射是使用 ioremap 函数 。
- #define SL2312_GPIO_BASE 0x4D000000
- #define IO_ADDRESS(x) (((X)&0x0fffffff)+(((x)>>4)&0x0f000000)+0xf0000000)
- #define GEMINI_GPIO_BASE1 IO_ADDRESS(SL2312_GPIO_BASE)
linux 有内存保护机制,无论是内核态还是用户态。
静态映射 :是在物理地址上加一个偏移量, 所以虚拟地址是固定的。
动态映射 :系统会生成一个虚拟地址对应到物理地址上,虚拟地址不是固定的。
linux在初始化运行时会根据一个map_desc的数组中的物理地址进行静态映射,0x4D000000地址应该就是这样映射的。
静态映射的地址无须使用icoremap函数,只要知道在map_desc数组中物理地址与虚拟地址的移仿就可以了。
至于驱动程序中关于物理地址是不是都要转换呢,这个是当然的,linux是运行在虚拟地址的。
任何程序不能访问物理地址,都必须转换为物理地址才能访问。只不过,在内核空间已经是转换好了的(如前所述),可以随便的访问。
动态映射是由Linux内核统一管理,当使用kmalloc(分配在内核空间)和malloc函数申请时,内核会找到一块空余的物理内存,并在页表中动态地添加一项其与虚拟地址对应的表项。
静态映射那应该就是LINUX在初始化阶段读取map_desc数组进行的地址映射,map_desc中包括了一对对的物理地址和虚拟地址的对应关系,这个可以根据硬件修改,其中的虚拟地址必须是内核空间的,例如,SDRAM的物理是0x30000000 那么可以将其映射为0xe0000000. 通过静态映射后的地址一般之后就不会更改了的,除非你想办法改掉。
#define Arinc429_BASE 0x10000000//bank2的起始地址 (即定义真实的物理地址)
virt = (unsigned long)ioremap(Arinc429_BASE,0x80); // virt是虚拟地址的首地址,128个字节的虚拟地址 物理地址到虚拟地址的动态映射 0x10000000对的就是virt 对virt的操作就是对实际物理地址0x10000000的操作
CH1_CTR_REG = (unsigned long *)(virt + 0x14); 对物理地址0X00000014的映射
- linux驱动中物理地址的空间转换
- linux驱动中地址空间转换
- linux驱动中地址空间转换
- linux驱动中地址空间转换
- linux驱动中地址空间转换
- Linux 内核空间虚拟地址和物理地址相互转换
- Linux用户空间访问物理地址
- Linux内核---62.用户空间获得变量的物理地址
- Linux驱动虚拟地址和物理地址的映射
- Linux驱动虚拟地址和物理地址的映射
- Linux驱动虚拟地址和物理地址的映射
- 嵌入式 Linux驱动虚拟地址和物理地址的映射
- linux驱动虚拟地址和物理地址的映射
- Linux驱动虚拟地址和物理地址的映射
- Linux驱动虚拟地址和物理地址的映射
- 进程地址空间地址转换为物理地址
- Linux 虚拟地址 物理地址 转换
- linux内存管理-虚拟地址转换成物理地址的过程
- 简单计算器
- HDU-4847-Wow! Such Doge!
- 下班收到的ora-00494
- 故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)
- C/C++:函数指针
- linux驱动中物理地址的空间转换
- [yii]初步认识yii 建立第一个 Yii 应用
- 添加Android4.4 tp的虚拟按键触摸震动反馈
- Comparable & Comparator
- [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
- 【环境配置】本机与服务器配置
- C语言函数名与函数指针详解
- DrawText输出Unicode中文时乱码的问题
- 关于导入新项目的问题——项目文件有错,但是子文件没任何错误的解决办法