linux mmap驱动实现
在实现驱动程序的mmap函数时,要注意映射地址的转换问题,见代码。
定义一个设备结构体:
struct leedriver
{
struct cdev cdev;
unsigned char mem[MEMSIZE];
};
这里面这个MEMSIZE,最小都要是4096,因为内存映射是以页为单位的。
在实现simple_remap_mmap函数时,代码如下
static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{
vma->vm_pgoff = ((u32)virt_to_phys(leedriverp->mem)) >> PAGE_SHIFT;
printk("vma->vm_pgoff = %lx\n",vma->vm_pgoff);
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
vma->vm_ops = &simple_remap_vm_ops;
simple_vma_open(vma);
return 0;
}
注意函数开头的vma->vm_pgoff = ((u32)virt_to_phys(leedriverp->mem)) >> PAGE_SHIFT;
leedriverp->mem是个内核虚拟地址,应该通过virt_to_phys转换成物理地址,再进行左移操作,就OK了。
之后定义一下vm_ops
static struct vm_operations_struct simple_remap_vm_ops = {
.open = simple_vma_open,
.close = simple_vma_close,
};
并且在file_operations中添加.mmap=simple_remap_mmap,整个过程就完成了
相关文档:
2009 年 4 月 23 日
本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象。
背景
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微 ......
一直想写点LINUX中的FORK函数,但是吧,我实在是太懒了,再加上文采不怎么好,所以就从网上找了篇写的不错的文章,看完之后应该对FORK函数有一定的了解~~
给出如下C程序,在linux下使用gcc编译:
1 #include "stdio.h"
2 #include "sys/types.h"
3 #include "unistd.h"
4
5 int main()
6 ......
1. linux 图形化界面乱码,一般是因为没有安装中文字体导致,可以在终端查询已经安装的字体 rpm -qa | grep fonts
如果没有font-chinese,可以下载或从安装盘中找到 fonts-chinese-3.02-12.el5.noarch.rpm 安装即可。
2. 远程连接中文乱码:
vi /etc/sysconfig/i18n
将内容改为
LANG="zh_CN. ......