1. 实验目的
了解mmap系统调用的使用方法与原理
2. 实验要求
编写一个简单的字符设备驱动程序,分配一段物理内存,然后使用mmap方法把这段物理内存映射到进程地址空间中。用户进程打开这个驱动程序之后就可以读写这段物理内存了
3. 实验过程
3.1 过程分析
3.1.1 分解实验要求
(1)打开一个文件,读它,存在一个read_buf中
(2)mmap这个文件,mmap返回的地址为mmap_buf
(3)比较read_buf和mmap_buf的内容,如果一致,说明mmap成功了
但首先,要创建这个文件(字符设备)。这个设备不能是一个空设备,得有一块内存是属于它。
因此,要kmalloc一段内存,把这段内存作为一个文件(字符设备)来读写。
为了测试mmap,还要把这个文件映射到进程的地址空间(即把这段内存,映射到进程的地址空间)
所以,要完成的任务还有:
(4)创建一个字符设备(这个字符设备是一段物理内存)
(5)写出read和mmap
3.1.2 实验步骤
调整一下3.1.1中的顺序,得到实验步骤为:
(1)创建一个字符设备,给这个字符设备kmalloc一段内存空间
(2)写出read和mmap
(3)打开一个文件,读它,存在一个read_buf中
(4)mmap这个文件,mmap返回的地址为mmap_buf
(5)比较read_buf和mmap_buf的内容,如果一致,说明mmap成功了
3.1.3 实验代码
#include <linux/version.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/kfifo.h>
#include <linux/uaccess.h>
#define MY_DEVICE_NAME "han_dev"
/*virtual FIFO device's buffer*/
static char *device_buffer;
#define MAX_DEVICE_BUFFER_SIZE (10 * PAGE_SIZE)
static ssize_t
mydrv_open(struct inode *inode, struct file *file)
{
int major = MAJOR(inode->i_rdev);
int minor = MINOR(inode->i_rdev);
printk("mydrv_open\n");
printk("%s: major=%d, minor=%d\n", __func__, major, minor);
return 0;
}
static ssize_t
mydrv_release(struct inode *inode,