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

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

?? linux字符驅動.c

?? linux2.6中底層驅動編寫字符設備驅動源碼。附有注解。
?? C
字號:
dev.c 代碼
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
//#include <linux/config.h>
#include <linux/proc_fs.h>
#include <linux/moduleparam.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/seq_file.h>
#include <linux/ioctl.h>
#include <linux/fcntl.h>
#include <linux/poll.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/kernel.h>
#include <linux/slab.h>

MODULE_LICENSE("GPL");
// 常量定義
#define BUFFERLENS 1024*1024;
// 函數申明
ssize_t chuan_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
ssize_t chuan_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);
int chuan_open(struct inode *inode, struct file *filp);
int chuan_release(struct inode *inode, struct file *filp);

// 初始化字符設備驅動的file_operations結構體
// 很奇怪的語法……
struct file_operations chuan_fops = {
  .owner =    THIS_MODULE,
  .read =     chuan_read,
  .write =    chuan_write,
  .open =     chuan_open,
  .release =  chuan_release,
};

// 主力結構————表示設備結構
struct chuan_dev {
  char * rer;
  unsigned int buffersize;// 緩沖區大小
  unsigned int len;// 緩沖區已有長度
  unsigned int start;// 起始數據偏移量
  struct semaphore sem;// 信號量,用于互斥訪問
  struct cdev cdev;// 字符型設備結構
};


// 全局變量
struct chuan_dev chuan_device;
dev_t dev_no = 0;


// 初始化
int chuan_init(void)
{ 
  int err=0;
  // 初始化cdev
  cdev_init(&chuan_device.cdev, &chuan_fops);
  chuan_device.cdev.owner = THIS_MODULE;
  chuan_device.cdev.ops = &chuan_fops;
  // 動態分配一個設備號
  alloc_chrdev_region(&dev_no, 0, 1, "Rer'sPersonalDevices v1.11");
  // 字符設備注冊
  err = cdev_add(&chuan_device.cdev, dev_no, 1);
  if (err){
    printk(KERN_NOTICE "Error %d adding device\n", err);
    return -1;
  }
  else{
    // 初始化互斥信號量
    init_MUTEX(&chuan_device.sem);
    //printk("互斥信號量初始化成功\n");

    printk(KERN_NOTICE "Device Initilize success.\n");
    return 0; /* succeed */
  }
}

// 注銷
void chuan_exit(void)
{
  unregister_chrdev_region(dev_no, 1);
  cdev_del(&chuan_device.cdev);
}

// 打開
int chuan_open(struct inode *inode, struct file *filp)
{
  struct chuan_dev *mydev;
  // 高級技巧,,我不是很明白
  mydev = container_of(inode->i_cdev,struct chuan_dev,cdev);
  // 將private_data保存chuan_dev指針
  filp->private_data = mydev;

  // 信號量,如果已經無資源了,就不打開
  if (down_interruptible(&mydev->sem))
    return -ERESTARTSYS;
  up(&mydev->sem);

  if(!mydev->rer){
    // 如果緩沖區是空的,那么分配1k的內容給它
    //printk("緩沖區還是空的.\n");
    mydev->rer = (char *)kmalloc(1024, GFP_KERNEL);
    memset(mydev->rer, 0, 1024);
    // 初始化參數
    mydev->buffersize = 1024;
    mydev->len = mydev->start = 0;
  }
  else{
    //printk("緩沖區已經有東西了.現將其初始化\n");
  }
  return 0;
}
// 關閉
int chuan_release(struct inode *inode, struct file *filp)
{
  return 0;
}

// 讀取
ssize_t chuan_read(struct file *filp, char __user *buf, size_t count,
                   loff_t *f_pos)
{  
  //  int i;
  struct chuan_dev *mydev; 
  //printk("讀取\n");
  // 讀取數據  
  mydev = filp->private_data;

  // 信號量,如果已經無資源了,就不打開
  if (down_interruptible(&mydev->sem))
    return -ERESTARTSYS;
  /*  printk("緩沖區數據量長度: %d\n",mydev->len);
      printk("緩沖區起始位置: %d\n",mydev->start);  
      for(i=0;i<mydev->len+mydev->start;++i)
      printk("緩沖區: %d values %c\n",i,*(mydev->rer+i));
  */
  if(mydev->len>0){
    if(count > mydev->len-mydev->start)
      count = mydev->len-mydev->start;
    if(copy_to_user(buf,mydev->rer+mydev->start,count)){
      printk("拷貝失敗.\n");
    }
    else{
      mydev->start += count;
      if(mydev->start>=mydev->buffersize){
    mydev->start = 0;
    mydev->len = 0;
      }
      printk("拷貝成功.\n");
      printk("start =  %d\n",mydev->start);
      printk("len =  %d\n",mydev->len);
    }
  }
  else{
    printk("緩沖區還沒有東西,,無法進行讀取.\n");
    goto end;
  }
 end:
  // 將訪問信號釋放
  up(&mydev->sem);
  return 0;
}

// 寫入
ssize_t chuan_write(struct file *filp, const char __user *buf, size_t count,
                    loff_t *f_pos)
{  
  struct chuan_dev *mydev; 
  // 寫入數據  
  mydev = filp->private_data;

  // 信號量,如果已經無資源了,就不打開
  if (down_interruptible(&mydev->sem))
    return -ERESTARTSYS;

  if(!mydev->rer){
    //printk(KERN_NOTICE "寫入過程,《, 空的。.\n");
  }
  else{
    //printk(KERN_NOTICE "寫入過程, 已經有東西了。.\n");
    // 向緩沖區中寫數據
    if(mydev->start+mydev->len+count > mydev->buffersize){
      // 如果預感到要溢出,那么就從頭寫 并且舍棄已有數據(這樣很不好)
      memset(mydev->rer, 0, mydev->buffersize);
      if(count > mydev->buffersize)
    count = mydev->buffersize;
      mydev->start = mydev->len = 0;
    }
    if(copy_from_user(mydev->rer+mydev->len,buf,count)){
      printk(KERN_NOTICE "寫入失敗.\n");
    }
    else{
      mydev->len += count;
      printk(KERN_NOTICE "寫入成功,當前緩沖區的大小為: %d.\n",mydev->len);
    }
  }

  up(&mydev->sem);
  return 0;
}

module_init(chuan_init);
module_exit(chuan_exit);use.c 測試驅動代碼
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
main()
{
  int testdev;
  int i;
  char buf[10];
  char redbuf[10];
  // 先打開/dev/lala(從設備號為0),進行寫入操作
  testdev = open("/dev/lala",O_RDWR);
  if ( testdev == -1 ){
    printf("Cann't open file \n");
  }else{
    printf("Open file Success.\n");
    for(i=0;i<10;++i)
      buf[i] = i+'a';
    write(testdev,buf,10);
    write(testdev,buf,10);
    printf("寫入設備成功/dev/lala\n");

    memset(buf,0,10);
    read(testdev,redbuf,5);
    printf("讀取設備成功/dev/lala\n");
    for (i = 0; i < 5;i++)
      printf("收到數據: %c\n",redbuf[i]);
    printf("\n");
    memset(buf,0,10);
    read(testdev,redbuf,5);
    printf("讀取設備成功/dev/lala\n");
    for (i = 0; i < 5;i++)
      printf("收到數據: %c\n",redbuf[i]);
    printf("\n");
    close(testdev); 
  }
}
ac.sh 和 wa.sh,掛載和卸載驅動的shell
#!/bin/bash
insmod dev.ko
mknod /dev/lala c 253 0
chmod 777 /dev/lala
mknod /dev/lala2 c 253 1
chmod 777 /dev/lala2
#!/bin/bash
rm /dev/lala
rm /dev/lala2
rmmod dev

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人爽a毛片一区二区免费| 日韩欧美电影一二三| 美女视频黄 久久| 天天色天天操综合| 日韩成人av影视| 日韩va欧美va亚洲va久久| 全部av―极品视觉盛宴亚洲| 亚洲国产aⅴ成人精品无吗| 国内精品伊人久久久久av影院| 日韩精品一级二级| 蜜臀精品一区二区三区在线观看 | 精品久久久久久久久久久久久久久久久 | 国产伦理精品不卡| 国产乱人伦偷精品视频免下载| 精品一区二区国语对白| 国产美女在线精品| 99久久精品免费观看| 欧美在线观看一区二区| 欧美日韩久久一区二区| 日韩亚洲欧美在线| 中文一区在线播放| 伊人色综合久久天天人手人婷| 亚洲v中文字幕| 韩国av一区二区| 91老司机福利 在线| 777奇米成人网| 国产午夜亚洲精品不卡| 亚洲码国产岛国毛片在线| 午夜精品久久久久久久久久| 国精产品一区一区三区mba视频 | 韩国欧美国产1区| 国产精品1024| 在线观看日韩电影| 精品1区2区在线观看| 中文字幕一区在线观看视频| 天堂一区二区在线| 成人激情免费电影网址| 欧美精三区欧美精三区| 国产欧美精品一区aⅴ影院| 亚洲精品视频观看| 国产精品自拍毛片| 欧美日韩中文字幕精品| 久久久九九九九| 午夜伦理一区二区| 成人av电影免费在线播放| 91精品婷婷国产综合久久竹菊| 国产欧美日韩精品一区| 亚洲va国产天堂va久久en| 成人一区在线观看| 日韩欧美二区三区| 亚洲成年人影院| 粉嫩一区二区三区在线看| 69堂成人精品免费视频| 亚洲日本成人在线观看| 国产美女视频一区| 91精品国产综合久久久久久| 亚洲欧美视频在线观看| 国产成人综合亚洲91猫咪| 欧美巨大另类极品videosbest| 17c精品麻豆一区二区免费| 久久99久久精品| 欧美一区二区在线视频| 亚洲网友自拍偷拍| 色狠狠色狠狠综合| 亚洲日本va午夜在线影院| 国产99久久久国产精品潘金网站| 欧美精品一二三四| 亚洲福利视频一区| 欧美视频在线不卡| 亚洲国产精品久久一线不卡| 99re热视频精品| 亚洲四区在线观看| 99久久夜色精品国产网站| 中文字幕乱码日本亚洲一区二区| 久久99精品久久久久久国产越南 | 亚洲一区在线视频| 色婷婷av一区二区三区软件| 亚洲色图都市小说| 94-欧美-setu| 一区二区三区高清| 欧美伊人久久大香线蕉综合69| 亚洲色图欧美偷拍| 色老汉一区二区三区| 一区二区成人在线| 欧美色区777第一页| 偷拍一区二区三区四区| 91精品国产麻豆国产自产在线| 日韩中文字幕一区二区三区| 日韩一区二区三区免费观看| 久久国产尿小便嘘嘘| 久久日一线二线三线suv| 国产一区二区三区四区五区美女| 国产视频亚洲色图| 99国产精品视频免费观看| 亚洲精品午夜久久久| 国产日韩综合av| 不卡av在线网| 亚洲成人av资源| 久久女同性恋中文字幕| 福利视频网站一区二区三区| 亚洲欧美一区二区三区国产精品| 色狠狠色狠狠综合| 美女www一区二区| 日本一区二区三区在线不卡| 日本精品视频一区二区三区| 日韩高清欧美激情| 中文成人av在线| 欧美日韩亚洲综合一区二区三区| 蜜桃久久久久久| 国产精品毛片高清在线完整版| 91福利社在线观看| 国内精品伊人久久久久av影院| 亚洲欧洲精品一区二区三区不卡| 欧美年轻男男videosbes| 国产乱一区二区| 亚洲图片欧美视频| 久久蜜桃av一区精品变态类天堂| 99精品国产热久久91蜜凸| 蜜桃久久久久久| 亚洲一区在线免费观看| 国产日韩欧美精品综合| 7777精品伊人久久久大香线蕉最新版 | 樱花草国产18久久久久| 精品欧美一区二区在线观看| 91免费视频大全| 国产乱子伦视频一区二区三区 | 成人免费看的视频| 午夜精品福利一区二区蜜股av| 国产亚洲va综合人人澡精品| 欧美老女人在线| 色8久久精品久久久久久蜜| 国产精品99久久久久久宅男| 午夜影视日本亚洲欧洲精品| 国产精品久久99| 亚洲精品一区二区三区蜜桃下载| 欧美丝袜自拍制服另类| 99re免费视频精品全部| 国产乱码精品一区二区三区忘忧草 | 欧洲一区二区三区在线| 播五月开心婷婷综合| 国产一区二三区| 久久99在线观看| 午夜不卡av免费| 亚洲专区一二三| 日韩理论片在线| 亚洲欧美日韩成人高清在线一区| 久久亚洲一级片| xfplay精品久久| 精品国精品自拍自在线| 日韩午夜在线播放| 91精品国产免费| 欧美一级精品大片| 中文字幕一区在线观看| 中文在线资源观看网站视频免费不卡 | 亚洲综合在线第一页| 最近日韩中文字幕| 亚洲欧美视频在线观看视频| 亚洲欧洲成人精品av97| 国产精品久久久久婷婷二区次| 欧美国产一区在线| 中文字幕日本不卡| 一区二区三区精品在线| 亚洲综合一二区| 午夜一区二区三区在线观看| 亚洲网友自拍偷拍| 三级久久三级久久| 狠狠网亚洲精品| 丁香激情综合国产| 99久久精品费精品国产一区二区| 色综合久久久久久久久| 欧美日韩在线观看一区二区 | 欧美日韩国产首页| 欧美精品1区2区| 日韩欧美一区二区三区在线| 精品国产99国产精品| 国产精品入口麻豆九色| 亚洲欧美日韩在线| 视频一区二区三区中文字幕| 精油按摩中文字幕久久| 高清视频一区二区| 在线一区二区观看| 日韩一区二区免费在线观看| 国产女同性恋一区二区| 一区二区久久久久| 麻豆成人免费电影| a4yy欧美一区二区三区| 欧美电影在线免费观看| 欧美精品一区二区蜜臀亚洲| 国产精品久久777777| 日韩中文字幕区一区有砖一区| 精品视频在线视频| 久久你懂得1024| 亚洲国产成人高清精品| 国产成人在线网站| 欧美日韩亚洲另类| 中文字幕欧美日本乱码一线二线| 午夜欧美视频在线观看| www.激情成人| 欧美一激情一区二区三区| 最新国产成人在线观看|