虚拟内存管理(二)——mmap实验

本文通过一个实验详细介绍了如何使用mmap系统调用。实验目标是创建一个字符设备驱动,分配物理内存,并使用mmap将其映射到进程空间。实验过程包括分解要求、创建设备、内存分配、读写比较等步骤,成功映射则read_buf与mmap_buf内容一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值