国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 服務器 > Web服務器 > 正文

Linux 塊設備驅動代碼編寫

2024-09-01 13:54:35
字體:
來源:轉載
供稿:網友

按照ldd的說法,linux的設備驅動包括了char,block,net三種設備。char設備是比較簡單的,只要分配了major、minor號,就可以進行讀寫處理了。相對而言,block和net要稍微復雜些。net設備姑且按下不談,我們在以后的博文中會有涉及。今天,我們可以看看一個簡單的block是怎么設計的。

為了將block和fs分開,kernel的設計者定義了request queue這一種形式。換一句話說,所有fs對block設備的請求,最終都會轉變為request的形式。所以,對于block設備驅動開發的朋友來說,處理好了request queue就掌握了block設備的一半。當然,block設備很多,hd、floppy、ram都可以這么來定義,有興趣的朋友可以在drivers/block尋找相關的代碼來閱讀。興趣沒有那么強的同學,可以看看我們這篇博文,基本上也能學個大概。有個基本的概念,再加上一個簡單淺顯的范例,對于一般的朋友來說,已經足夠了。

閑話不多說,我們看看一個ramdisk代碼驅動是怎么寫的,代碼來自《深入linux 設備驅動程序內核機制》,

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>  #include <linux/fs.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/vmalloc.h> #include <linux/blkdev.h> #include <linux/hdreg.h>  #define RAMHD_NAME "ramhd" #define RAMHD_MAX_DEVICE 2 #define RAMHD_MAX_PARTITIONS 4  #define RAMHD_SECTOR_SIZE 512 #define RAMHD_SECTORS 16 #define RAMHD_HEADS 4 #define RAMHD_CYLINDERS 256  #define RAMHD_SECTOR_TOTAL (RAMHD_SECTORS * RAMHD_HEADS *RAMHD_CYLINDERS) #define RAMHD_SIZE (RAMHD_SECTOR_SIZE * RAMHD_SECTOR_TOTAL) //8mb  typedef struct {   unsigned char* data;   struct request_queue* queue;   struct gendisk* gd; }RAMHD_DEV;  static char* sdisk[RAMHD_MAX_DEVICE] = {NULL}; static RAMHD_DEV* rdev[RAMHD_MAX_DEVICE] = {NULL};  static dev_t ramhd_major;  static int ramhd_space_init(void) {   int i;   int err = 0;   for(i = 0; i < RAMHD_MAX_DEVICE; i++){     sdisk[i] = vmalloc(RAMHD_SIZE);     if(!sdisk[i]){       err = -ENOMEM;       return err;     }          memset(sdisk[i], 0, RAMHD_SIZE);   }      return err; }  static void ramhd_space_clean(void) {   int i;   for(i = 0; i < RAMHD_MAX_DEVICE; i++){     vfree(sdisk[i]);   } }  static int ramhd_open(struct block_device* bdev, fmode_t mode) {   return 0; }  static int ramhd_release(struct gendisk*gd, fmode_t mode) {   return 0; }  static int ramhd_ioctl(struct block_device* bdev, fmode_t mode, unsigned int cmd, unsigned long arg) {   int err;   struct hd_geometry geo;      switch(cmd)   {     case HDIO_GETGEO:       err = !access_ok(VERIFY_WRITE, arg, sizeof(geo));       if(err)         return -EFAULT;                geo.cylinders = RAMHD_CYLINDERS;       geo.heads = RAMHD_HEADS;       geo.sectors = RAMHD_SECTORS;       geo.start = get_start_sect(bdev);              if(copy_to_user((void*)arg, &geo, sizeof(geo)))         return -EFAULT;              return 0;   }      return -ENOTTY; }  static struct block_device_operations ramhd_fops = {   .owner = THIS_MODULE,   .open = ramhd_open,   .release = ramhd_release,   .ioctl = ramhd_ioctl, };  static int ramhd_make_request(struct request_queue* q, struct bio* bio) {   char* pRHdata;   char* pBuffer;   struct bio_vec* bvec;   int i;   int err = 0;      struct block_device* bdev = bio->bi_bdev;   RAMHD_DEV* pdev = bdev->bd_disk->private_data;      if(((bio->bi_sector * RAMHD_SECTOR_SIZE) + bio->bi_size) > RAMHD_SIZE){     err = -EIO;     return err;   }      pRHdata = pdev->data + (bio->bi_sector * RAMHD_SECTOR_SIZE);   bio_for_each_segment(bvec, bio, i){     pBuffer = kmap(bvec->bv_page) + bvec->bv_offset;     switch(bio_data_dir(bio)){       case READ:         memcpy(pBuffer, pRHdata, bvec->bv_len);         flush_dcache_page(bvec->bv_page);         break;                case WRITE:         flush_dcache_page(bvec->bv_page);         memcpy(pRHdata, pBuffer, bvec->bv_len);         break;                default:         kunmap(bvec->bv_page);         goto out;     }          kunmap(bvec->bv_page);     pRHdata += bvec->bv_len;   }    out:   bio_endio(bio, err);   return 0; }  static int alloc_ramdev(void) {   int i;   for(i = 0; i < RAMHD_MAX_DEVICE; i++){     rdev[i] = kzalloc(sizeof(RAMHD_DEV), GFP_KERNEL);     if(!rdev[i]){       return -ENOMEM;     }   }      return 0; }  static void clean_ramdev(void) {   int i;      for(i = 0; i < RAMHD_MAX_DEVICE; i++){     if(rdev[i])       kfree(rdev[i]);   } }  static int __init ramhd_init(void) {   int i;      ramhd_space_init();   alloc_ramdev();      ramhd_major = register_blkdev(0, RAMHD_NAME);      for(i = 0; i < RAMHD_MAX_DEVICE; i++){     rdev[i]->data = sdisk[i];     rdev[i]->queue = blk_alloc_queue(GFP_KERNEL);     blk_queue_make_request(rdev[i]->queue, ramhd_make_request);          rdev[i]->gd = alloc_disk(RAMHD_MAX_PARTITIONS);     rdev[i]->gd->major = ramhd_major;     rdev[i]->gd->first_minor = i * RAMHD_MAX_PARTITIONS;     rdev[i]->gd->fops = &ramhd_fops;     rdev[i]->gd->queue = rdev[i]->queue;     rdev[i]->gd->private_data = rdev[i];     sprintf(rdev[i]->gd->disk_name, "ramhd%c", 'a' +i);     rdev[i]->gd->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;     set_capacity(rdev[i]->gd, RAMHD_SECTOR_TOTAL);     add_disk(rdev[i]->gd);   }      return 0; }  static void __exit ramhd_exit(void) {   int i;   for(i = 0; i < RAMHD_MAX_DEVICE; i++){     del_gendisk(rdev[i]->gd);     put_disk(rdev[i]->gd);     blk_cleanup_queue(rdev[i]->queue);   }      clean_ramdev();   ramhd_space_clean();   unregister_blkdev(ramhd_major, RAMHD_NAME); }  module_init(ramhd_init); module_exit(ramhd_exit);  MODULE_AUTHOR("dennis__chen@ AMDLinuxFGL"); MODULE_DESCRIPTION("The ramdisk implementation with request function"); MODULE_LICENSE("GPL"); 

為了大家方便,順便也把Makefile放出來,看過前面blog的朋友都知道,這其實很簡單,

ifneq ($(KERNELRELEASE),) obj-m := ramdisk.o  else PWD := $(shell pwd) KVER := $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all:   $(MAKE) -C $(KDIR) M=$(PWD) modules clean:   rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* Module.* endif 

這段代碼究竟有沒有用呢?可以按照下面的步驟來做,

    a)make 一下,生成ramdisk.ko;

    b)編譯好了之后,就可以安裝驅動了,在linux下是這么做的,sudo insmod ramdisk.ko;

    c)安裝好了,利用ls /dev/ramhd*, 就會發現在/dev下新增兩個結點,即/dev/ramhda和/dev/ramhdb;

    d)不妨選擇其中一個節點進行分區處理, sudo fdisk /dev/ramhda,簡單處理的話就建立一個分區, 生成/dev/ramhda1;

    e)創建文件系統,sudo mkfs.ext3 /dev/ramhda1;

    f)有了上面的文件系統,就可以進行mount處理,不妨sudo mount /dev/ramhda1 /mnt;

    g)上面都弄好了,大家就可以copy、delete文件試試了,是不是很簡單。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
四虎中文字幕| 伊人222成人综合网| 全网国产福利在线播放| 国产视频在线播放| 亚洲网站一区| 中文字幕日本三级| 国产在线观看a| 亚洲视频精品在线观看| 国产精品bbw一区二区三区| 国产日韩欧美精品一区二区三区| 国产一区电影| 久热免费视频| 国产一卡2卡3卡4卡网站免费| 不卡av免费观看| 超碰在线观看免费版| 一本久久精品| 九九精品视频在线观看九九| 青青草免费在线视频| 国产三级视频在线看| 天堂在线看视频| 国产精品ⅴa有声小说| 在线观看av中文| 不卡av免费观看| 在线色视频网| 久久久久久五月天久久久久久久久| 亚洲а∨精品天堂在线| 中文字幕日本在线观看| 日韩不卡高清| 国产原创av在线| 国产日韩欧美一区二区三区视频| 超碰免费在线播放| 国产激情自拍视频| 中文在线视频观看| 亚洲色婷婷综合开心网| www.狠狠艹| аⅴ成人天堂中文在线| av大片在线| 中文字幕国产在线| 国产福利免费观看| 97最新国自产拍视频在线完整在线看| 国产精品免费91| 精品偷拍激情视频在线观看| av免费在线播放| 激情在线视频播放| 尤物在线视频观看| 2021天堂中文幕一二区在线观| 国产黄大片在线观看画质优化| www.狠狠| 久久久久国产精品嫩草影院| 欧美日韩视频精品二区| 最近免费中文字幕大全免费第三页| www中文字幕在线观看| gogo在线高清视频| 日本亚洲欧美| 99在线免费观看| 免费网站看黄yyy222| 国产美女高潮| 日本电影在线观看| 中文字幕不卡免费视频| 在线观看视频污| 国产丝袜在线播放| 国产精品偷乱一区二区三区 | 国产免费自拍视频| 欧美日韩性视频一区二区三区| 午夜av电影| 国产一卡2卡3卡4卡网站免费| 四虎www视频| 九九热在线免费视频| 九九热视频免费在线观看| h网站免费在线观看| 亚洲精品在线视频免费| 国产黄色片中文字幕| 91在线网站| 欧美性xxxx交| 中文字幕亚洲精品视频| 国产无遮挡又黄又爽免费软件| 国产午夜电影| 日本亚洲精品| 中文字幕在线看精品乱码| 国产欧美一区二区三区小说| a√在线视频| 九九在线观看免费视频| 2019年中文字幕| 国产中文字幕在线看| 国产精品剧情一区二区在线观看| 国产尤物一区二区三区| 国产桃色电影在线播放| 久久精品视频观看| 国产成人午夜精品| 国产小视频在线| 麻豆电影传媒二区| 亚洲精品一区中文字幕电影| 最新国产在线| 国产精品一区在线看| 日本不卡视频一区二区| 国产porny蝌蚪视频| 国产视频资源| 国产传媒在线播放| 在线免费看av| 日本福利午夜视频在线| 国产黄在线看| 国产不卡视频| www.色五月| 国产私拍精品| h网站免费在线观看| 男人天堂网在线观看| 最近中文字幕mv免费高清电影| 国产美女一区视频| 国产精品不卡一区二区三区在线观看| 五月婷婷在线观看| 一本大道久久精品| 国产图片综合| 青青青国产视频| 国产区成人精品视频| 青草视频在线播放| 国产国产人免费人成免费视频| 五月婷婷开心综合| 免费国产视频| 精精国产xxxx视频在线中文版| 免费国产阿v视频在线观看| 国产精品yjizz视频网一二区 | 青青草原国产在线| 精品亚洲成a人片在线观看| 国产男女猛烈无遮挡免费视频| 天堂在线国产| а√天堂8资源在线官网| 在线观看av网站永久| 国产欧美久久久久久久久| 精品美女调教视频| 91在线高清| www在线观看播放免费视频日本| 精品美女调教视频| 午夜羞羞小视频在线观看| 欧美xxxxx性| 国产香蕉在线| 欧美色欧美亚洲另类二区精品| 亚洲成人福利| 最新av免费看| 日本调教视频在线观看| 日本中文字幕在线观看| 国产激情在线视频| 国产精品一区二区三区视频网站| 免费av不卡在线观看| 国产中文在线视频| 精品视频麻豆入口| 精品资源在线看| 亚洲精品成人a| 2021天堂中文幕一二区在线观| 啪啪免费视频一区| 精品无人区乱码1区2区3区免费| 国产在线激情视频| 超碰国产在线| 狠狠干五月天| 九色自拍视频| 狠狠操狠狠色| 日本中文字幕高清视频| 欧洲亚洲精品视频| eeuss影院在线播放| av高清在线| 在线成人综合色一区| 在线色视频观看| 在线免费看黄| 麻豆视频在线观看免费网站| 国产在线观看91| 国产日本在线| 伊人免费视频| 国产在线超碰| 在线视频中文字幕| 超碰在线免费播放| 国产免费av网站| 国产99re| 国产日本在线| 国产美女福利在线观看| 天天操天天操一操| 992tv在线观看在线播放| 九色福利视频| 在线观看国产视频| 国产一二区在线观看| 日韩精品免费一区二区| 国产国语**毛片高清视频| 男人天堂99| wwww亚洲| 美女网站在线观看| 欧美日韩亚洲第一页| 在线色视频网| 亚洲欧美中文字幕在线观看| 国产三级av在线| 国产日本在线视频| 国产欧美日韩专区| 国产精品伦一区二区三区视频| 午夜av电影| 国产精品jvid在线观看| 国产视频一二区| 国产xxxx做受性欧美88| 国产二区在线播放| 精品女厕厕露p撒尿| 亚洲国产精品区| 国产女王在线**视频 | 国产高清免费在线播放| 精品一区二区三区免费站|