-
-
caizhengsuo | 当前状态:在线
总积分:3196 2024年可用积分:0
注册时间: 2008-02-22
最后登录时间: 2015-10-16
-
linux驱动入门篇2字符设备驱动003
caizhengsuo 发表于 2008/10/14 9:17:35 708 查看 0 回复 [上一主题] [下一主题]
手机阅读
linux驱动入门篇2字符设备驱动
#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <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"一行,如下图: