学习网考试学习资料

Gzu521.com

Linux设备驱动之字符设备驱动程序(2)

LINUX教程   点击:次   发布时间:2007-2-2   【字体: 】   来源:Gzu521.com
Gzu521.com我的学习网


  完整的globalvar.c文件源代码如下:

#i nclude <linux/module.h>
#i nclude <linux/init.h>
#i nclude <linux/fs.h>
#i nclude <asm/uaccess.h>
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来验证上述设备:

#i nclude <sys/types.h>
#i nclude <sys/stat.h>
#i nclude <stdio.h>
#i nclude <fcntl.h>
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"设备可以正确的读写。

上 一 页
2页: 第 [1] [2]

责任编辑:gzu521

电脑课堂分类
Windows 2000教程
Windows XP教程
Windows 2003教程
Windows Vista教程
LINUX教程
软件教学
办公软件
硬件DIY
分类推荐信息
更多...
大类最新文章
更多...