📄 hello.c
字号:
#ifndef MODULE#define MODULE#endif //MODULE#ifndef __KERNEL__#define __KERNEL__#endif //__KERNEL__#ifndef LINUX#define LINUX#endif //LINUX#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/kernel.h>#include <linux/slab.h>#include <error.h>#include <asm/uaccess.h>MODULE_LICENSE("GPL");#define DATA_BUFFER_SIZE 4096#define DRIVER_NAME "my_device"static int g_iMajor = 0;static char *g_pData = 0;//wrapper "read" functionstatic int my_read(struct file *filp, char *charp, size_t iLen, loff_t *pPos){ printk("my driver read.\n"); if((charp == 0) || (iLen < 0)) { return -EINVAL; } if(g_pData == 0) { return -ENOMEM; } int iRealBytes = iLen>strlen(g_pData)?strlen(g_pData):iLen; int iRet = copy_to_user(charp, g_pData, iRealBytes); return iRet==0?iRealBytes:iRealBytes-iRet;}//wrapper "write" functionstatic int my_write(struct file *filp, const char *charp, size_t iLen, loff_t *pPos){ printk("my driver write.\n"); if((iLen < 0) || (charp == 0)) { return -EINVAL; } if(g_pData == 0) { return -ENOMEM; } int iRealBytes = iLen>DATA_BUFFER_SIZE?DATA_BUFFER_SIZE:iLen; int iRet = copy_from_user(g_pData, charp, iRealBytes); return iRet==0?iRealBytes:iRealBytes-iRet;}//wrapper "open" functionstatic int my_open(struct inode *pinode, struct file *filp){ MOD_INC_USE_COUNT; printk("my driver open.\n"); g_pData = (char*)kmalloc(DATA_BUFFER_SIZE, GFP_KERNEL); return 0;}//wrapper "release" functionstatic int my_release(struct inode *pinode, struct file *filp){ MOD_DEC_USE_COUNT; printk("my driver close\n"); kfree(g_pData); g_pData = 0; return 0;}//register callback functionstatic struct file_operations my_fops = { open : my_open, release : my_release, read : my_read, write : my_write,};//driver initial functionstatic int __init my_init(void){ printk("Hello! My friend! this is my first driver in linux.\n");// printk("kernel version:%d.%d.%d\n", (LINUX_VERSION_CODE>>16)&0xff, (LINUX_VERSION_CODE>>8)&0xff, LINUX_VERSION_CODE&0xff); printk("kernel version:%s\n", UTS_RELEASE); g_iMajor = register_chrdev(0, DRIVER_NAME, &my_fops); if(g_iMajor < 0) { return 1; } return 0;}//driver uninitital functionstatic void __exit my_cleanup(void){ printk("Goodbye my friend! my first driver exit.\n"); unregister_chrdev(g_iMajor, DRIVER_NAME);}//register driver initial functionmodule_init(my_init);//register driver uninitital functionmodule_exit(my_cleanup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -