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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? globalmem_two.c

?? Linux驅(qū)動(dòng)編程源碼
?? C
字號(hào):
/*======================================================================    A globalmem driver as an example of char device drivers    There are two same globalmems in this driver      This example is to introduce the function of file->private_data        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	/*全局內(nèi)存最大4K字節(jié)*/#define MEM_CLEAR 0x1  /*清0全局內(nèi)存*/#define GLOBALMEM_MAJOR 254    /*預(yù)設(shè)的globalmem的主設(shè)備號(hào)*/static int globalmem_major = GLOBALMEM_MAJOR;/*globalmem設(shè)備結(jié)構(gòu)體*/struct globalmem_dev                                     {                                                          struct cdev cdev; /*cdev結(jié)構(gòu)體*/                         unsigned char mem[GLOBALMEM_SIZE]; /*全局內(nèi)存*/        };struct globalmem_dev *globalmem_devp; /*設(shè)備結(jié)構(gòu)體指針*//*文件打開函數(shù)*/int globalmem_open(struct inode *inode, struct file *filp){  /*將設(shè)備結(jié)構(gòu)體指針賦值給文件私有數(shù)據(jù)指針*/  struct globalmem_dev *dev;    dev = container_of(inode->i_cdev,struct globalmem_dev,cdev);    filp->private_data = dev;    return 0;}/*文件釋放函數(shù)*/int globalmem_release(struct inode *inode, struct file *filp){  return 0;}/* ioctl設(shè)備控制函數(shù) */static int globalmem_ioctl(struct inode *inodep, struct file *filp, unsigned  int cmd, unsigned long arg){  struct globalmem_dev *dev = filp->private_data;/*獲得設(shè)備結(jié)構(gòu)體指針*/  switch (cmd)  {    case MEM_CLEAR:      memset(dev->mem, 0, GLOBALMEM_SIZE);            printk(KERN_INFO "globalmem is set to zero\n");      break;    default:      return  - EINVAL;  }  return 0;}/*讀函數(shù)*/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; /*獲得設(shè)備結(jié)構(gòu)體指針*/  /*分析和獲取有效的寫長(zhǎng)度*/  if (p >= GLOBALMEM_SIZE)    return count ?  - ENXIO: 0;  if (count > GLOBALMEM_SIZE - p)    count = GLOBALMEM_SIZE - p;  /*內(nèi)核空間->用戶空間*/  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);  }  return ret;}/*寫函數(shù)*/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; /*獲得設(shè)備結(jié)構(gòu)體指針*/    /*分析和獲取有效的寫長(zhǎng)度*/  if (p >= GLOBALMEM_SIZE)    return count ?  - ENXIO: 0;  if (count > GLOBALMEM_SIZE - p)    count = GLOBALMEM_SIZE - p;      /*用戶空間->內(nèi)核空間*/  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);  }  return ret;}/* seek文件定位函數(shù) */static loff_t globalmem_llseek(struct file *filp, loff_t offset, int orig){  loff_t ret = 0;  switch (orig)  {    case 0:   /*相對(duì)文件開始位置偏移*/      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:   /*相對(duì)文件當(dāng)前位置偏移*/      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;}/*文件操作結(jié)構(gòu)體*/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,};/*初始化并注冊(cè)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);}/*設(shè)備驅(qū)動(dòng)模塊加載函數(shù)*/int globalmem_init(void){  int result;  dev_t devno = MKDEV(globalmem_major, 0);  /* 申請(qǐng)?jiān)O(shè)備號(hào)*/  if (globalmem_major)    result = register_chrdev_region(devno, 2, "globalmem");  else  /* 動(dòng)態(tài)申請(qǐng)?jiān)O(shè)備號(hào) */  {    result = alloc_chrdev_region(&devno, 0, 2, "globalmem");    globalmem_major = MAJOR(devno);  }    if (result < 0)    return result;      /* 動(dòng)態(tài)申請(qǐng)2個(gè)設(shè)備結(jié)構(gòu)體的內(nèi)存*/  globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev), GFP_KERNEL);  if (!globalmem_devp)    /*申請(qǐng)失敗*/  {    result =  - ENOMEM;    goto fail_malloc;  }  memset(globalmem_devp, 0, 2*sizeof(struct globalmem_dev));    globalmem_setup_cdev(&globalmem_devp[0], 0);  globalmem_setup_cdev(&globalmem_devp[1], 1);  return 0;  fail_malloc: unregister_chrdev_region(devno, 2);  return result;}/*模塊卸載函數(shù)*/void globalmem_exit(void){  cdev_del(&(globalmem_devp[0].cdev));     cdev_del(&(globalmem_devp[1].cdev));   /*注銷cdev*/  kfree(globalmem_devp);     /*釋放設(shè)備結(jié)構(gòu)體內(nèi)存*/  unregister_chrdev_region(MKDEV(globalmem_major, 0), 2); /*釋放設(shè)備號(hào)*/}MODULE_AUTHOR("Song Baohua");MODULE_LICENSE("Dual BSD/GPL");module_param(globalmem_major, int, S_IRUGO);module_init(globalmem_init);module_exit(globalmem_exit);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级在线播放| 日日摸夜夜添夜夜添国产精品| 欧美在线视频日韩| 狠狠色丁香婷婷综合久久片| 伊人开心综合网| 国产欧美日韩中文久久| 欧美精品色综合| 99久久综合精品| 国产在线视频精品一区| 五月婷婷久久丁香| 亚洲欧洲无码一区二区三区| 欧美tickling网站挠脚心| 欧美亚洲国产怡红院影院| 国产69精品一区二区亚洲孕妇| 日韩高清在线不卡| 亚洲已满18点击进入久久| 国产嫩草影院久久久久| 欧美大度的电影原声| 欧美日韩国产首页在线观看| www.亚洲人| 国产成人综合在线播放| 久久99久国产精品黄毛片色诱| 亚洲精品视频免费看| 国产精品女主播av| 久久久久久久久99精品| 欧美电影精品一区二区| 91精品欧美久久久久久动漫| 欧美在线一区二区| 在线观看免费成人| 91久久一区二区| 91视频com| 99久久精品免费看国产| 丰满亚洲少妇av| 国产suv一区二区三区88区| 久久99国产精品久久99果冻传媒| 日韩国产精品久久| 天天色综合天天| 视频一区中文字幕| 午夜不卡在线视频| 日本午夜一区二区| 蜜桃久久av一区| 美女任你摸久久| 麻豆精品一二三| 国内精品视频一区二区三区八戒 | 国产欧美一区二区精品性色| 日韩美女天天操| 精品国产一区二区三区四区四 | 欧美日韩一卡二卡三卡| 欧美亚洲精品一区| 在线成人高清不卡| 欧美一级欧美三级| 欧美成人免费网站| 久久精品在这里| 国产精品久久久久aaaa| 中文字幕一区二区不卡| 日韩伦理av电影| 亚洲成人免费观看| 日本不卡免费在线视频| 国内精品嫩模私拍在线| 成人精品鲁一区一区二区| 成人黄色免费短视频| 91久久精品一区二区| 在线成人av影院| 精品国产乱码久久久久久夜甘婷婷 | 国产精品美女久久久久久久久久久| 欧美日韩免费观看一区二区三区| 欧美精品v日韩精品v韩国精品v| 日韩欧美国产不卡| 欧美激情一区二区三区在线| 1区2区3区国产精品| 午夜视频在线观看一区二区三区| 麻豆精品国产传媒mv男同| 国产精品正在播放| 一本大道久久精品懂色aⅴ| 欧美日韩国产精选| 久久精品男人天堂av| 亚洲天堂免费看| 美女国产一区二区| 菠萝蜜视频在线观看一区| 欧美日韩国产精选| 国产人伦精品一区二区| 亚洲一区二区免费视频| 国产在线不卡一区| 在线这里只有精品| 久久久久久久久久久黄色| 一区二区三区在线观看动漫| 久久精品72免费观看| 91免费视频大全| 精品裸体舞一区二区三区| 亚洲免费在线电影| 久久99精品久久久久婷婷| 色综合久久中文字幕| 精品国产乱子伦一区| 亚洲资源中文字幕| 国产ts人妖一区二区| 91精品国产免费| 亚洲视频资源在线| 黑人巨大精品欧美黑白配亚洲| 色狠狠av一区二区三区| 久久伊人蜜桃av一区二区| 性做久久久久久| 成人app在线观看| 日韩一级成人av| 一区二区三区四区高清精品免费观看| 久久 天天综合| 精品视频一区三区九区| 中文字幕一区二区三中文字幕| 蜜桃视频在线观看一区二区| 欧美亚洲一区二区三区四区| 国产精品国产三级国产普通话三级| 日本欧美一区二区在线观看| 91成人国产精品| 中文字幕在线免费不卡| 国产精品一区二区久久不卡 | 亚洲va欧美va人人爽| 成人午夜在线免费| 欧美va亚洲va| 日本91福利区| 7777精品伊人久久久大香线蕉| 一区二区三区免费网站| 99久久精品免费看国产| 国产精品色在线观看| 韩国精品一区二区| 欧美精品一区二区三区视频| 日韩av电影天堂| 欧美丰满高潮xxxx喷水动漫| 亚洲国产欧美日韩另类综合| 91亚洲永久精品| 日韩美女视频一区二区 | 另类成人小视频在线| 欧美日韩三级视频| 一区二区三区资源| 色悠悠久久综合| 又紧又大又爽精品一区二区| 一本大道久久a久久综合婷婷| 成人免费在线视频观看| 99视频在线精品| 亚洲欧美一区二区久久| 91免费小视频| 一区av在线播放| 精品视频在线视频| 奇米精品一区二区三区在线观看 | 久久久精品中文字幕麻豆发布| 黄色小说综合网站| 久久久亚洲欧洲日产国码αv| 国产综合色产在线精品| 精品电影一区二区| 国产精品一区二区你懂的| 国产亚洲va综合人人澡精品 | 欧美精品色综合| 免费高清在线一区| 久久久久久久av麻豆果冻| 懂色av一区二区三区免费观看| 国产精品国产三级国产aⅴ原创| 91亚洲永久精品| 亚洲成人资源在线| 日韩精品一区二区三区四区| 国产一区在线不卡| 国产精品理伦片| 欧洲精品视频在线观看| 男男视频亚洲欧美| 久久精品亚洲精品国产欧美 | 亚洲国产成人tv| 欧美哺乳videos| 成人免费高清在线观看| 亚洲综合丁香婷婷六月香| 日韩一区二区三区在线观看 | 制服丝袜一区二区三区| 激情av综合网| 亚洲免费观看高清完整版在线| 欧美视频中文字幕| 国内精品写真在线观看| 亚洲图片你懂的| 欧美一级黄色片| 99久久婷婷国产精品综合| 日韩精品成人一区二区在线| 久久久久久久久久久久久女国产乱 | 亚洲国产你懂的| 久久久亚洲午夜电影| 在线亚洲人成电影网站色www| 蜜臀久久99精品久久久久宅男| 欧美国产精品一区二区| 欧美日韩大陆一区二区| 国产福利91精品一区| 午夜精品一区二区三区电影天堂| 久久午夜老司机| 在线观看视频一区二区欧美日韩| 久久草av在线| 亚洲另类中文字| 欧美精品一区二区三区高清aⅴ | 欧美视频一区二区三区在线观看| 国内精品久久久久影院薰衣草 | 在线一区二区三区四区五区| 国产一区91精品张津瑜| 亚洲一区二区3| 欧美高清在线一区| 日韩欧美一级二级三级 | 久久精品无码一区二区三区| 欧美中文字幕一区二区三区| 成人亚洲一区二区一|