亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? globalmem_lock.c

?? Linux驅動編程源碼
?? C
字號:
/*======================================================================    A globalmem driver as an example of char device drivers      This example is to introduce how to use locks to avoid race conditions        The initial developer of the original code is Baohua Song    <author@linuxdriver.cn>. All Rights Reserved.======================================================================*/#include <linux/module.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/cdev.h>#include <asm/io.h>#include <asm/system.h>#include <asm/uaccess.h>#define GLOBALMEM_SIZE	0x1000	/*全局內存最大4K字節*/#define MEM_CLEAR 0x1  /*清0全局內存*/#define GLOBALMEM_MAJOR 254    /*預設的globalmem的主設備號*/static int globalmem_major = GLOBALMEM_MAJOR;/*globalmem設備結構體*/struct globalmem_dev                                     {                                                          struct cdev cdev; /*cdev結構體*/                         unsigned char mem[GLOBALMEM_SIZE]; /*全局內存*/       struct semaphore sem; /*并發控制用的信號量*/    };struct globalmem_dev *globalmem_devp; /*設備結構體指針*//*文件打開函數*/int globalmem_open(struct inode *inode, struct file *filp){  /*將設備結構體指針賦值給文件私有數據指針*/  filp->private_data = globalmem_devp;  return 0;}/*文件釋放函數*/int globalmem_release(struct inode *inode, struct file *filp){  return 0;}/* ioctl設備控制函數 */static int globalmem_ioctl(struct inode *inodep, struct file *filp, unsigned  int cmd, unsigned long arg){  struct globalmem_dev *dev = filp->private_data; /*獲得設備結構體指針*/  switch (cmd)  {    case MEM_CLEAR:      if (down_interruptible(&dev->sem))      {        return  - ERESTARTSYS;      }      memset(dev->mem, 0, GLOBALMEM_SIZE);      up(&dev->sem); //釋放信號量      printk(KERN_INFO "globalmem is set to zero\n");      break;    default:      return  - EINVAL;  }  return 0;}/*讀函數*/static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size,  loff_t *ppos){  unsigned long p =  *ppos;  unsigned int count = size;  int ret = 0;  struct globalmem_dev *dev = filp->private_data; /*獲得設備結構體指針*/  /*分析和獲取有效的寫長度*/  if (p >= GLOBALMEM_SIZE)    return count ?  - ENXIO: 0;  if (count > GLOBALMEM_SIZE - p)    count = GLOBALMEM_SIZE - p;  if (down_interruptible(&dev->sem))  {    return  - ERESTARTSYS;  }  /*內核空間->用戶空間*/  if (copy_to_user(buf, (void*)(dev->mem + p), count))  {    ret =  - EFAULT;  }  else  {    *ppos += count;    ret = count;    printk(KERN_INFO "read %d bytes(s) from %d\n", count, p);  }  up(&dev->sem); //釋放信號量  return ret;}/*寫函數*/static ssize_t globalmem_write(struct file *filp, const char __user *buf,  size_t size, loff_t *ppos){  unsigned long p =  *ppos;  unsigned int count = size;  int ret = 0;  struct globalmem_dev *dev = filp->private_data; /*獲得設備結構體指針*/  /*分析和獲取有效的寫長度*/  if (p >= GLOBALMEM_SIZE)    return count ?  - ENXIO: 0;  if (count > GLOBALMEM_SIZE - p)    count = GLOBALMEM_SIZE - p;  if (down_interruptible(&dev->sem))//獲得信號量  {    return  - ERESTARTSYS;  }  /*用戶空間->內核空間*/  if (copy_from_user(dev->mem + p, buf, count))    ret =  - EFAULT;  else  {    *ppos += count;    ret = count;    printk(KERN_INFO "written %d bytes(s) from %d\n", count, p);  }  up(&dev->sem); //釋放信號量  return ret;}/* seek文件定位函數 */static loff_t globalmem_llseek(struct file *filp, loff_t offset, int orig){  loff_t ret = 0;  switch (orig)  {    case 0:   /*相對文件開始位置偏移*/      if (offset < 0)      {        ret =  - EINVAL;        break;      }      if ((unsigned int)offset > GLOBALMEM_SIZE)      {        ret =  - EINVAL;        break;      }      filp->f_pos = (unsigned int)offset;      ret = filp->f_pos;      break;    case 1:   /*相對文件當前位置偏移*/      if ((filp->f_pos + offset) > GLOBALMEM_SIZE)      {        ret =  - EINVAL;        break;      }      if ((filp->f_pos + offset) < 0)      {        ret =  - EINVAL;        break;      }      filp->f_pos += offset;      ret = filp->f_pos;      break;    default:      ret =  - EINVAL;      break;  }  return ret;}/*文件操作結構體*/static const struct file_operations globalmem_fops ={  .owner = THIS_MODULE,  .llseek = globalmem_llseek,  .read = globalmem_read,  .write = globalmem_write,  .ioctl = globalmem_ioctl,  .open = globalmem_open,  .release = globalmem_release,};/*初始化并注冊cdev*/static void globalmem_setup_cdev(struct globalmem_dev *dev, int index){  int err, devno = MKDEV(globalmem_major, index);  cdev_init(&dev->cdev, &globalmem_fops);  dev->cdev.owner = THIS_MODULE;  dev->cdev.ops = &globalmem_fops;  err = cdev_add(&dev->cdev, devno, 1);  if (err)    printk(KERN_NOTICE "Error %d adding LED%d", err, index);}/*設備驅動模塊加載函數*/int globalmem_init(void){  int result;  dev_t devno = MKDEV(globalmem_major, 0);  /* 申請設備號*/  if (globalmem_major)    result = register_chrdev_region(devno, 1, "globalmem");  else  /* 動態申請設備號 */  {    result = alloc_chrdev_region(&devno, 0, 1, "globalmem");    globalmem_major = MAJOR(devno);  }    if (result < 0)    return result;      /* 動態申請設備結構體的內存*/  globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL);  if (!globalmem_devp)    /*申請失敗*/  {    result =  - ENOMEM;    goto fail_malloc;  }  memset(globalmem_devp, 0, sizeof(struct globalmem_dev));    globalmem_setup_cdev(globalmem_devp, 0);  init_MUTEX(&globalmem_devp->sem);   /*初始化信號量*/    return 0;  fail_malloc: unregister_chrdev_region(devno, 1);  return result;}/*模塊卸載函數*/void globalmem_exit(void){  cdev_del(&globalmem_devp->cdev);   /*注銷cdev*/  kfree(globalmem_devp);     /*釋放設備結構體內存*/  unregister_chrdev_region(MKDEV(globalmem_major, 0), 1); /*釋放設備號*/}MODULE_AUTHOR("Song Baohua");MODULE_LICENSE("Dual BSD/GPL");module_param(globalmem_major, int, S_IRUGO);module_init(globalmem_init);module_exit(globalmem_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色哟哟| 欧美一区二区大片| 亚洲欧美日韩电影| 91网址在线看| 亚洲午夜激情网站| 6080午夜不卡| 精品一区二区三区在线播放 | 日本欧洲一区二区| 51精品视频一区二区三区| 青青国产91久久久久久| 欧美xxxxxxxxx| 成人午夜私人影院| 亚洲免费av观看| 在线不卡一区二区| 韩国一区二区三区| 欧美激情一区在线| 色婷婷av一区二区三区软件 | 91精品国产一区二区三区蜜臀| 日韩在线一区二区| 国产午夜精品一区二区三区四区| 成人动漫av在线| 亚洲成人在线观看视频| 精品久久久久99| 欧美一区二区三区思思人| 激情五月播播久久久精品| 国产精品国产三级国产aⅴ入口 | 欧美午夜宅男影院| 麻豆成人免费电影| 日韩一区中文字幕| 91麻豆精品国产91久久久使用方法| 黄色资源网久久资源365| 亚洲桃色在线一区| 在线播放欧美女士性生活| 国产在线一区二区综合免费视频| 亚洲人成在线播放网站岛国| 日韩午夜精品电影| 99re66热这里只有精品3直播| 日本女人一区二区三区| 国产精品乱码人人做人人爱| 91麻豆精品国产| 99视频国产精品| 精品一区二区成人精品| 亚洲狠狠丁香婷婷综合久久久| 日韩精品在线一区二区| 在线观看免费亚洲| 国产盗摄视频一区二区三区| 天天色综合天天| 亚洲视频网在线直播| 26uuu亚洲婷婷狠狠天堂| 欧美日本一区二区三区四区| 99r国产精品| 国产一区二区看久久| 日韩vs国产vs欧美| 一区二区免费视频| 国产精品久久久一区麻豆最新章节| 91精品久久久久久久91蜜桃| 中文字幕av不卡| 日韩欧美第一区| 欧美精三区欧美精三区| 欧美亚洲综合网| 91网上在线视频| 成人av综合在线| 国产一区二区三区免费| 麻豆精品一区二区三区| 午夜精品一区二区三区免费视频 | 色综合色综合色综合色综合色综合| 国产自产2019最新不卡| 美脚の诱脚舐め脚责91| 婷婷综合五月天| 亚洲综合色自拍一区| 亚洲男同性恋视频| 最新成人av在线| 亚洲天堂免费看| 亚洲色欲色欲www| 综合久久国产九一剧情麻豆| 国产精品乱人伦中文| 国产精品三级av| 中文字幕一区二区三区视频 | 亚洲三级在线播放| 亚洲日本在线天堂| 亚洲欧美国产毛片在线| 亚洲激情在线激情| 亚洲一区在线看| 日韩高清不卡在线| 麻豆精品视频在线| 国产一区二区三区免费播放 | 成人黄色网址在线观看| 99久久久国产精品免费蜜臀| 91蜜桃免费观看视频| 色婷婷亚洲精品| 欧美久久久一区| 精品久久五月天| 欧美国产国产综合| 国产高清不卡一区二区| aaa国产一区| 色婷婷久久久综合中文字幕| 欧美伊人久久久久久久久影院| 欧美日韩国产一级| 精品av久久707| 国产精品国产三级国产普通话蜜臀| 亚洲人成网站影音先锋播放| 亚洲午夜国产一区99re久久| 全国精品久久少妇| 国产suv精品一区二区三区| 99久久精品情趣| 欧美精品自拍偷拍| 国产网站一区二区三区| 亚洲综合偷拍欧美一区色| 免费成人在线观看| 99久久精品免费观看| 欧美熟乱第一页| 久久综合久久综合久久| 亚洲欧美一区二区三区极速播放 | 色香蕉久久蜜桃| 7777精品伊人久久久大香线蕉超级流畅| 欧美一区二区在线看| 亚洲国产成人午夜在线一区| 亚洲综合成人网| 欧美mv日韩mv| 最好看的中文字幕久久| 欧美aaaaa成人免费观看视频| 国产suv一区二区三区88区| 欧美亚洲动漫制服丝袜| 久久亚洲精品国产精品紫薇| 亚洲激情av在线| 国产一区视频在线看| 日本高清免费不卡视频| 精品久久五月天| 亚洲成人先锋电影| 成人丝袜高跟foot| 日韩视频一区在线观看| 亚洲激情六月丁香| 国产成人av影院| 91精品福利在线一区二区三区 | 亚洲曰韩产成在线| 成人免费av网站| 日韩精品一区二区三区在线| 一区二区三区欧美在线观看| 国产乱色国产精品免费视频| 欧美日韩精品是欧美日韩精品| 欧美国产国产综合| 韩国一区二区视频| 日韩欧美中文一区二区| 亚洲一区视频在线观看视频| a亚洲天堂av| 久久久午夜精品| 老鸭窝一区二区久久精品| 欧美午夜精品久久久久久超碰 | 欧美日韩国产一级二级| 国产精品五月天| 国产一区二区不卡| 欧美精品一区二区久久婷婷| 午夜精品福利一区二区蜜股av| 91小视频在线观看| 国产精品理论在线观看| 国产精品亚洲视频| 久久综合狠狠综合久久综合88 | 精品一区二区日韩| 91麻豆精品国产91久久久久久 | 日韩精品五月天| 欧美日韩精品系列| 亚洲福利视频一区二区| 欧美性极品少妇| 亚洲小说春色综合另类电影| 欧亚一区二区三区| 亚洲国产你懂的| 欧美亚一区二区| 亚洲成人中文在线| 欧美疯狂做受xxxx富婆| 天天综合网 天天综合色| 欧美精品少妇一区二区三区| 日日嗨av一区二区三区四区| 7777精品伊人久久久大香线蕉最新版| 婷婷综合另类小说色区| 91精品国产综合久久婷婷香蕉| 日韩不卡手机在线v区| 欧美mv和日韩mv的网站| 国模大尺度一区二区三区| 久久久久久久免费视频了| 国产精品99久久久久久久女警| 欧美国产欧美综合| 不卡视频在线观看| 一区二区三区国产精华| 精品视频1区2区| 美日韩一级片在线观看| 国产亚洲精久久久久久| 99久久婷婷国产综合精品电影| 一区二区三区欧美视频| 在线播放国产精品二区一二区四区| 三级精品在线观看| 亚洲精品一区二区三区99| 成人免费av网站| 亚洲二区在线视频| 日韩三级在线观看| 成人av电影免费在线播放| 亚洲综合999| 亚洲精品一区二区三区四区高清 | 一区二区激情小说| 欧美一级理论片| 成人免费电影视频|