#include
#include
#include
#include
#include
MODULE_LICENSE("GPL").
#define MAJOR_NUM 254
static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*).
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*).
struct file_operations globalvar_fops =
{
read: globalvar_read, write: globalvar_write,
}.
static int global_var = 0.
static struct semaphore sem.
static int __init globalvar_init(void)
{
int ret.
ret = register_chrdev(MAJOR_NUM, "globalvar", &.globalvar_fops).
if (ret)
{
printk("globalvar register failure").
}
else
{
printk("globalvar register success").
init_MUTEX(&.sem).
}
return ret.
}
static void __exit globalvar_exit(void)
{
int ret.
ret = unregister_chrdev(MAJOR_NUM, "globalvar").
if (ret)
{
printk("globalvar unregister failure").
}
else
{
printk("globalvar unregister success").
}
}
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
//获得信号量
if (down_interruptible(&.sem))
{
return - ERESTARTSYS.
}
//将global_var从内核空间复制到用户空间
if (copy_to_user(buf, &.global_var, sizeof(int)))
{
up(&.sem).
return - EFAULT.
}
//释放信号量
up(&.sem).
return sizeof(int).
}
ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
//获得信号量
if (down_interruptible(&.sem))
{
return - ERESTARTSYS.
}
//将用户空间的数据复制到内核空间的global_var
if (copy_from_user(&.global_var, buf, sizeof(int)))
{
up(&.sem).
return - EFAULT.
}
//释放信号量
up(&.sem).
return sizeof(int).
}
module_init(globalvar_init).
module_exit(globalvar_exit). |