linux设备驱动物理内存映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux设备驱动物理内存映射相关的知识,希望对你有一定的参考价值。

我的系统中有256M的内存,前面128M的内存是用来运行linux系统的,我想在linux内写个驱动,把后边的128M物理内存映射到进程的空间,用mmap函数实现,这个mmap函数要怎么写。需要用到哪些函数。最好能给出关键函数,谢谢。

int video_qsb_mmap(struct file *file,struct vm_area_struct *vma)

int ret;
u32 size = vma->vm_end - vma->vm_start;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
vma->vm_flags |= VM_RESERVED;
if(frm_num<qsb_dev.mmap_num)

ret = remap_pfn_range(vma,vma->vm_start,align_addr>>PAGE_SHIFT,qsb_dev.stride*1944,vma->vm_page_prot); align_addr=PAGE_ALIGN(align_addr+2592*1944);
if(ret != 0)
return -EAGAIN;
frm_num++;
return 0;


这是我自己的函数,我是在UBOOT里规定系统只能用前192M,其它的由应用层调用MMAP函数实现映射,贴过来格式乱了,你参考参考,是可以用的。大概就是申请1张图片的大小,并进行页对齐。不懂的问,你查查这几个函数的作用参数照着写应该就可以实现你得目的了。追问

remap_pfn_range()这个函数第三个参数好像是物理地址的页号,所以你这里的align_addr变量是具体的物理地址吗?还是物理地址经过转换的地址。
比如说我现在想把0x88000000-0x90000000这128M内存映射上去,align_addr的值就是0x88000000,大小就是0x08000000,这样对吗。

追答

嗯,就是物理地址。我用的是0XC000000开始的,所以我的第一张图片起始值align_addr就是0XC000000,第2张图片就是该值再加上一张图片占用空间和对齐页以后的下一个物理地址值

追问

好的,谢谢

参考技术A j的提问(回答)过于简略,请再丰富一下内容重新提交 参考技术B 留名收藏此问题,同楼主一起等待高人解答!

Linux 内核 内存管理内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

文章目录





一、物理地址空间



" 物理地址空间 “ 是 CPU 处理器 在 ” 总线 "访问内存的地址 ,

RISC 处理器 只能访问 物理地址空间 , 系统的 外围设备物理内存 都使用 统一的物理地址空间 访问 ;

RISC 全称 " Reduced Instruction Set Computer " , 精简指令集计算机 ;

分配给 " 外围设备 " 的 物理地址 , 又称为 " 设备内存 " ;


ARM64 架构的系统中 , 物理地址空间 分为 2 2 2 类 :

  • ① 正常内存 : Normal Memory , 指的是 随机存取存储器 RAM 只读存储器 ROM ;
  • ② 设备内存 : Device Memory , 指的是 分配给 " 外围设备寄存器 " 的 物理地址 ;

ARM64 架构 , 参考 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init ) 博客 , 物理地址最大支持 48 48 48 位 ;





二、外围设备寄存器



CPU 处理器 访问 " 外围设备 “ 是通过 ” 外围设备控制器 " " 寄存器 " 实现的 ;

处理器芯片 中的 寄存器 分为 3 3 3 大类 :

  • 控制寄存器
  • 状态寄存器
  • 数据寄存器

外围设备寄存器 有 2 2 2 种 编址方式 :

  • ① I/O 映射方式 , I/O-Mapped
  • ② 内存映射方式 , Memory-Mapped

外围设备寄存器 一般是 连续编址 的 ,





三、外围设备寄存器物理地址 映射到 虚拟地址空间



用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 ,

Linux 内核 提供了 相关 API 函数 , 将 " 外围设备寄存器 “ 对应的 ” 物理地址 “ 映射到了 ” 虚拟地址空间 " 中 ;

以上是关于linux设备驱动物理内存映射的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存映射原理

linux内存池能分配连续物理内存吗

Linux物理内存查看工具

嵌入式软件开发杂谈:Linux下内存与虚拟内存

嵌入式软件开发杂谈:Linux下内存与虚拟内存

嵌入式软件开发杂谈:Linux下内存与虚拟内存