globalmem意味着“全局内存”,在globalmem字符设备驱动中会分配一片大小GLOBALMEM_SIZE(4KB)的内存空间,并在驱动中提供了对这片内存的读写、控制和定位函数,用户空间的进程能通过Linux系统调用访问这片内存。该设备驱动仅仅是为了讲解问题的方便而凭空制造出来的设备。但他也有用处,由于globalmem可被两个或以上的进程同时访问,其中的全局内存可作为用户空间进程进行通信一种蹩脚的手段。
二、编写驱动代码
1.头文件globalmem.h
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/fs.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <asm/dma.h>
#include <asm/delay.h>
#include <linux/delay.h>
#define GLOBALMEM_SIZE0x1000
#define MEM_CLEAR0x01
#define GLOBALMEM_MAJOR250
static intglobalmem_major = GLOBALMEM_MAJOR;
structglobalmem_dev{
struct cdev cdev;
unsigned char mem[GLOBALMEM_SIZE];
};
2.驱动代码globalmem.c
#include"globalmem.h"
struct globalmem_dev*globalmem_devp;
intglobalmem_open(struct inode *inode,struct file *filp)
{
dev_t devno;
filp->private_data=globalmem_devp;
printk("inode->i_rdev=%dglobalmem->cdev->dev=%d\n",inode->i_ino,MAJOR(globalmem_devp->cdev.dev));
return 0;
}
intglobalmem_release(struct inode *inode,struct file*filp)
{
return 0;
}
static ssize_tglobalmem_read(struct file *filp,char __user *buf,size_tcount,loff_t *ppos)
{
unsigned long p = *ppos;
int ret = 0;
struct globalmem_dev *dev=filp->private_data;
if(p >= GLOBALMEM_SIZE - p)
return 0;
if(count > GLOBALMEM_SIZE - p)
count = GLOBALMEM_SIZE - p;