linux设备驱动物理内存映射

我的系统中有256M的内存,前面128M的内存是用来运行linux系统的,我想在linux内写个驱动,把后边的128M物理内存映射到进程的空间,用mmap函数实现,这个m... 我的系统中有256M的内存,前面128M的内存是用来运行linux系统的,我想在linux内写个驱动,把后边的128M物理内存映射到进程的空间,用mmap函数实现,这个mmap函数要怎么写。需要用到哪些函数。最好能给出关键函数,谢谢。 展开
 我来答
FASTKILLER66
2013-10-09 · TA获得超过1316个赞
知道小有建树答主
回答量:576
采纳率:0%
帮助的人:426万
展开全部
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张图片就是该值再加上一张图片占用空间和对齐页以后的下一个物理地址值
快又稳
2024-10-28 广告
在Linux环境下配置基于域名的虚拟主机,需安装Apache或Nginx等Web服务器,并编辑配置文件。以Apache为例,需创建虚拟主机配置文件,指定域名、文档根目录等,然后启用该配置文件并重启Apache服务。同样,Nginx也需在相应... 点击进入详情页
本回答由快又稳提供
melancholy_444
2013-10-09 · TA获得超过390个赞
知道小有建树答主
回答量:416
采纳率:0%
帮助的人:339万
展开全部
j的提问(回答)过于简略,请再丰富一下内容重新提交
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yilonglucky
2013-10-09 · TA获得超过748个赞
知道小有建树答主
回答量:104
采纳率:0%
帮助的人:75万
展开全部
留名收藏此问题,同楼主一起等待高人解答!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式