• 04lock_03spin_lock


      1 #include <linux/module.h>  //MODULE_LICENSE("GPL"); 
      2 #include <linux/init.h>   //module_init  module_exit
      3 #include <linux/kernel.h>  //printk
      4 #include <linux/io.h>    //ioremap  iounremap
      5 #include <linux/ioport.h>  //request_mem_region
      6 
      7 
      8 #include <linux/miscdevice.h>
      9 #include <linux/fs.h>   //file_operations  结构体的定义
     10 #include <linux/slab.h>  //kmalloc
     11 #include <linux/delay.h>
     12 
     13 #include <asm/uaccess.h>    //copy_to_user  copy_form_user
     14 
     15 #include <linux/spinlock.h>  //自旋锁
     16 
     17 /*
     18 该设备只能同时被一个进程打开
     19 */
     20 
     21 
     22 #define   DEVNAME  "my_led"
     23 #define  MEMSIZE  100
     24 
     25 struct ldm_info
     26 {
     27     struct  miscdevice dev;       //设备节点
     28     struct  file_operations  ops;  //文件操作
     29     unsigned char mem[MEMSIZE] ;  //数组, 内核的空间
     30     spinlock_t  mylock;  //自旋锁
     31 };
     32 
     33 //struct ldm_info  ldm;
     34 struct ldm_info  ldm;  //结构体的指针,分配空间
     35 
     36 static  int ldm_open(struct inode * inode, struct file * file)
     37 {
     38     printk("kernel: ldm_open
    ");
     39 
     40     return 0;
     41 }
     42 
     43 /*
     44 copy_to_user
     45 copy_form_user
     46 */
     47 
     48 static  ssize_t ldm_write(struct file * file, const char __user * buf, size_t size, loff_t *   offt)
     49 {
     50     int i =0;
     51 
     52     spin_lock(&ldm.mylock);
     53     //临界区开始
     54 
     55     // if(!spin_trylock(&ldm.mylock)) {
     56     //     printk("当前资源被占用,请稍后
    ");
     57     //     return -1;
     58     // }
     59 
     60     for(;i < size; i++) {
     61         //每拷贝一个字节,睡眠1s
     62         copy_from_user(ldm.mem + i, buf + i, 1);
     63         printk("write:%c
    ",  ldm.mem[i]);
     64         ssleep(1); //延迟1s
     65     }
     66     spin_unlock(&ldm.mylock);
     67     //临界区结束
     68 
     69     return 0;
     70 }
     71 
     72 
     73 ssize_t ldm_read(struct file * file, char __user *  buf, size_t size, loff_t * offt)
     74 {
     75     //每隔一秒拷贝一个字节到用户层
     76     int i =0;
     77 
     78     spin_lock(&ldm.mylock);
     79     // if(!spin_trylock(&ldm.mylock)) {
     80     //     printk("当前资源被占用,请稍后
    ");
     81     //     return -1;
     82     // }
     83 
     84     for(;i < size; i++) {
     85         //每拷贝一个字节,睡眠1s
     86         copy_to_user(buf + i, ldm.mem + i, 1);
     87         printk("read:%c
    ",  ldm.mem[i]);
     88         ssleep(1); //延迟1s
     89     }
     90     spin_unlock(&ldm.mylock);
     91 
     92 
     93     return 0;
     94 }
     95 
     96 int ldm_release(struct inode * inode, struct file *file)
     97 {
     98     printk("kernel: close
    ");
     99 
    100     return 0;
    101 }
    102 
    103 static int test_init(void)
    104 {
    105     int ret = 0;
    106 
    107     printk("%s:%s:%d   init
    ", __FILE__, __FUNCTION__, __LINE__);
    108 
    109 
    110     ldm.dev.minor  = MISC_DYNAMIC_MINOR;  //系统自动分配次设备
    111     ldm.dev.name = DEVNAME;//该名称将决定节点名称, 成功注册 linux 系统中
    112     ldm.dev.fops = &ldm.ops;  //关联文件操作
    113     ldm.ops.open = ldm_open;
    114     ldm.ops.write = ldm_write;
    115     ldm.ops.read = ldm_read;
    116     ldm.ops.release = ldm_release;
    117 
    118 
    119     ret = misc_register(&ldm.dev);
    120 
    121     spin_lock_init(&ldm.mylock);//初始化自旋锁
    122 
    123     if(ret < 0) {
    124         printk("misc_register  failed
    ");
    125         goto  err_misc_register;
    126     }
    127 
    128     return 0;
    129 err_misc_register:
    130     return ret;
    131 
    132 }
    133 
    134 //卸载
    135 static void test_exit(void)
    136 {
    137     printk("%s:%s:%d   init
    ", __FILE__, __FUNCTION__, __LINE__);
    138 
    139 
    140     //注销misc 
    141     misc_deregister(&ldm.dev);
    142     //释放映射的虚拟地址
    143 
    144 }
    145 
    146 module_init(test_init);
    147 module_exit(test_exit);
    148 
    149 
    150 MODULE_LICENSE("GPL");  //加入GPL许可
  • 相关阅读:
    Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级 郑州
    NET项目反编译+VS解决方案整理流程 郑州
    iis 目录枚举文件枚举解决方案 郑州
    Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录 郑州
    SqlServer mssql 按月统计所有部门 郑州
    无法获得数据库 'model' 上的排他锁 解决方法 郑州
    Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。 郑州
    谈谈前端怎样布局切图,程序可以方便快捷添加程序 郑州
    各种UIColor颜色的设置
    iOS
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6416288.html
Copyright © 2020-2023  润新知