linux设备驱动物理内存映射
我的系统中有256M的内存,前面128M的内存是用来运行linux系统的,我想在linux内写个驱动,把后边的128M物理内存映射到进程的空间,用mmap函数实现,这个m...
我的系统中有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张图片的大小,并进行页对齐。不懂的问,你查查这几个函数的作用参数照着写应该就可以实现你得目的了。
{
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张图片就是该值再加上一张图片占用空间和对齐页以后的下一个物理地址值
快又稳
2024-10-28 广告
2024-10-28 广告
在Linux环境下配置基于域名的虚拟主机,需安装Apache或Nginx等Web服务器,并编辑配置文件。以Apache为例,需创建虚拟主机配置文件,指定域名、文档根目录等,然后启用该配置文件并重启Apache服务。同样,Nginx也需在相应...
点击进入详情页
本回答由快又稳提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |