模块描述

将30个字节的内存空间模仿成设备文件。每次读写不超过30个字节。

模块加载成功之后,需建立设备文件

mknod /dev/mydev c 231 0

模块代码

#include <linux/types.h>     //dev_t,MAJOR,MINOR,MKDEV
#include <linux/fs.h> //file_operations,struct file,struct indoe,register
//unregister_chrdev,register/alloc/unregister_chrdev_regino,
#include <linux/cdev.h> //cdev_alloc,cdev_init,cdev_add,cdev_del
#include <linux/kernel.h> //container_of
#include <linux/slab.h> //kfree,kmalloc
#include <linux/errno.h> //error code
#include <linux/module.h> //MODULE_LICENSE,...
#include <linux/platform_device.h> //struct platform_device,struct platform_driver
#include <asm/uaccess.h> //copy_from_user,copy_to_user #define MYMAJOR 231 //静态分配设备号 MODULE_LICENSE("GPL");
MODULE_AUTHOR("WGY");
MODULE_DESCRIPTION("MY_FIRST_MODULE"); unsigned int count=0; //记录打开设备的次数
dev_t devn; //设备号 struct my_cdev
{
char kerbuf[30]; //分配30个字节的内存空间
struct cdev cd; //如果这里实例化cd为指针,记得使用前为cd分配空间
}; struct my_cdev ex_cdev; //设备结构 int simple_open(struct inode * inode,struct file * filp)
{
if(count>=1) //设备已被打开
{
printk(KERN_ERR "Device is in use.");
return -EBUSY;
}
count++; //设备初次打开,加一
return 0;
} int simple_release(struct inode * inode,struct file * filp)
{
count--; //关闭设备,计数减一
return 0;
} ssize_t simple_read(struct file * filp,char __user *usrbuf,size_t count,loff_t * f_pos)
{
if(count>30) //用户要求读出字符总数超过30个字节
{
printk(KERN_WARNING "Over the max length of the kernel array");
return -1;
} //拷贝内核空间的数据到用户空间
if(copy_to_user(usrbuf,ex_cdev.kerbuf,count))
{
return -EFAULT;
} return count;
} ssize_t simple_write(struct file * filp,const char __user *usrbuf,size_t count,loff_t * f_pos)
{
if(count>30) //用户写入字符总数超过30个字节
{
printk(KERN_WARNING "over the max length of the kernel array");
return -1;
} //拷贝用户空间的数据到内核空间
if(copy_from_user(ex_cdev.kerbuf,usrbuf,count))
{
return -EFAULT;
} return 0;
} struct file_operations simple_ops=
{
.owner=THIS_MODULE,
.read=simple_read,
.write=simple_write,
.open=simple_open,
.release=simple_release,
}; int __init simple_init_module(void)
{
int ret,result; devn=MKDEV(MYMAJOR,0); //获取设备号 ret=register_chrdev_region(devn,1,"/dev/mydev"); //起始设备号,设备个数,设备名
if(ret<0)
{
printk(KERN_WARNING "failed to alloc a dev number");
return ret;
} //直接涉及内核的操作
cdev_init(&ex_cdev.cd,&simple_ops);
ex_cdev.cd.owner=THIS_MODULE;
result = cdev_add (&ex_cdev.cd, devn, 1);
if(result)
{
printk(KERN_NOTICE "Error %d adding DEMO\n", result);
}
printk("success ,good!"); return 0; } void __exit simple_cleanup_module(void)
{
cdev_del(&ex_cdev.cd);
unregister_chrdev_region(devn,1);
printk("simple_cleanup_module");
} module_init(simple_init_module);
module_exit(simple_cleanup_module);

应用

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h> int main()
{
int fd,ret;
char buf[30]={'\0'}; fd=open("/dev/mydev",O_RDWR|O_NONBLOCK|O_NOCTTY);
if(fd<0)
{
printf("fail to open..");
exit(1);
} ret=write(fd,"hello",5); //向设备写入5个字符
if(ret<0)
{
printf("fail to write.. ");
exit(1);
} ret=read(fd,buf,5); //从设备读入5个字符
if(ret<0)
{
printf("fail to read..");
exit(1);
} printf("string=%s\n",buf); //打印从设备读到的字符
close(fd); //关闭打开的文件
return 0; }

MY_FIRSH_MODULE的更多相关文章

随机推荐

  1. iOS监听键盘事件

    #pragma mark - view life cycle - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter def ...

  2. 注入问题0x00

    1.sqlmap遇到MySQL注入可以成功getshell,但是,遇到sqlserver注入未成功getshell. 2.xp_cmdshell 如何 getshell(1433未对外开放). 解决方 ...

  3. 安装 SQL server 2008 R2

    操作系统:WIN7 问题: The Windows Installer Service could not be accessed. This can occur if the Windows Ins ...

  4. 把字符转换为 HTML 实体

    把字符转换为HTML实体:htmlentities() 把HTML实体转换回字符:html_entity_decode() 把预定义的字符 "<" (小于)和 "& ...

  5. recording just for inquiry in the future

    auditd审计 相关命令有: auditd, auditctl, ausearch, aureport 相关文件: /etc/audit/auditd.conf, /etc/audit/audit. ...

  6. 利用CSS实现带相同间隔地无缝滚动动画

    说明:因为在移动上主要利用CSS来做动画,所以没有考虑其他浏览器的兼容性,只有-webkit这个前缀,如果需要其他浏览器,请自行补齐. 首先解释一下什么是无缝滚动动画, 例如下面的例子 See the ...

  7. 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpModule”。

    ********************************* 思路壹(也是网络上铺天盖地的通俗解决方案) 原因: 这是因为先安装了 .NET Framework , 随后启用了 .NET Fra ...

  8. spring缓存Ehcache(入门2)

    使用Ehcache缓存工具类. 一.由于使用了maven,所以需要引入依赖包: <dependency> <groupId>net.sf.ehcache</groupId ...

  9. Max Degree of Parallelism最大并行度配置

    由于公司的业务在急速增长中,发现数据库服务器已经基本撑不住这么多并发.一方面,要求开发人员调整并发架构,利用缓存减少查询.一方面从数据库方面改善并发.数据库的并行度可设置如下: 1)cost thre ...

  10. PHP读取excel文档

    PHP读取excel文档 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel.   PHPExcelReader比较轻量级, ...