Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527685
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: LINUX

2008-02-26 11:41:39

#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*);

//初始化字符设备驱动的file_operations结构体

struct file_operations globalvar_fops =

{

 read: globalvar_read, write: globalvar_write,

};

static int global_var = 0; //"globalvar"设备的全局变量

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");

 }

 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)

{

 //将global_var从内核空间复制到用户空间

 if (copy_to_user(buf, &global_var, sizeof(int)))

 {

  return - EFAULT;

 }

 return sizeof(int);

}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)

{

 //将用户空间的数据复制到内核空间的global_var

 if (copy_from_user(&global_var, buf, sizeof(int)))

 {

  return - EFAULT;

 }

 return sizeof(int);

}

module_init(globalvar_init);

module_exit(globalvar_exit);

  运行:

gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o globalvar.o globalvar.c

  编译代码,运行:

inmod globalvar.o

  加载globalvar模块,再运行:

cat /proc/devices

  发现其中多出了"254 globalvar"一行,如下图:



  接着我们可以运行:

mknod /dev/globalvar c 254 0

  创建设备节点,用户进程通过/dev/globalvar这个路径就可以访问到这个全局变量虚拟设备了。

我们写一个用户态的程序globalvartest.c来验证上述设备:

#include

#include

#include

#include

main()

{

 int fd, num;

 //打开"/dev/globalvar"

 fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);

 if (fd != -1 )

 {

  //初次读globalvar

  read(fd, &num, sizeof(int));

  printf("The globalvar is %d\n", num);

  //写globalvar

  printf("Please input the num written to globalvar\n");

  scanf("%d", &num);

  write(fd, &num, sizeof(int));

  //再次读globalvar

  read(fd, &num, sizeof(int));

  printf("The globalvar is %d\n", num);

  //关闭"/dev/globalvar"

  close(fd);

 }

 else

 {

  printf("Device open failure\n");

 }

}

  编译上述文件:

gcc -o globalvartest.o globalvartest.c

  运行

./globalvartest.o

  可以发现"globalvar"设备可以正确的读写。
阅读(1284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~