当前位置: 首页 > news >正文

光电信息科学与工程seo查询工具源码

光电信息科学与工程,seo查询工具源码,PHP网站开发方向,成全视频免费观看在线看第7季以下内容源于朱有鹏《物联网大讲堂》课程的学习#xff0c;如有侵权#xff0c;请告知删除。 一、正确理解块设备驱动的概念 1、块设备和字符设备的差异 块和字符是两种不同的访问设备的策略#xff1b;同一个设备可以同时支持块和字符两种访问策略#xff1b;设备本身的物…以下内容源于朱有鹏《物联网大讲堂》课程的学习如有侵权请告知删除。 一、正确理解块设备驱动的概念 1、块设备和字符设备的差异 块和字符是两种不同的访问设备的策略同一个设备可以同时支持块和字符两种访问策略设备本身的物理特性决定了哪一种访问策略更适合块设备本身驱动层支持缓冲区而字符设备驱动层没有缓冲块设备驱动最适合存储设备。 2、块设备驱动的特点 字符设备只能顺序访问如串口发送数据顺序而块设备可以随机访问不连续块访问传统的机械式块设备如硬盘、DVD可以随机访问但是连续访问效率更高因此块设备驱动中有排序逻辑将用户的随机访问重新调整成尽量连续访问以提升效率电磁设备Nand、SD卡等随机访问效率等同于顺序访问块设备驱动和字符设备驱动不同应用层对块设备驱动的访问一般不是直接操作设备文件/dev/block/xxx或者/dev/sdax而是通过文件系统来简洁操作。思考裸机阶段时刷机烧录SD卡时说过的对SD卡的2种访问文件系统下访问和扇区级访问 3、块设备相关的几个单位 1扇区Sector 概念来自于早期磁盘在硬盘、DVD中还有用在Nand/SD中已经没意义了。扇区是块设备本身的特性大小一般为512的整数倍因为历史原因很多时候都向前兼容定义为512。 2块block 概念来自于文件系统是内核对文件系统数据处理的基本单位大小为若干个扇区常见有512B、1KB、4KB等 3段Section 概念来自于内核是内核的内存管理中一个页或者部分页由若干个连续为块组成。 4页Page 概念来自于内核是内核内存映射管理的基本单位。linux内核的页式内存映射名称来源于此。 5总结块设备驱动对下以Sector为单位管理块设备对上以Block为单位和文件系统交互。 二、块设备驱动框架简介 1、块设备驱动框图 1VFS 虚拟文件系统是文件系统的抽象对上可以接各种文件系统是一对多的关系是分层理论。 2通用块层 对所有块设备都适用屏蔽了不同硬件的差异。类似于字符设备驱动框架的第一部分。 3IO调度层电梯算法 有别于其他设备的地方。这里提供了合并、排序等机制。读写相当于电梯上、下的操作。 4块设备驱动层真正硬件操作部分 2、重点结构体 1struct request对设备的每一次操作譬如读或者写一个扇区 2struct request_queuerequest队列 3struct bio通用块层用bio来管理一个请求 4struct gendisk表示一个磁盘设备或一个分区 三、块设备驱动案例分析 1、块设备驱动案例演示 1驱动简单介绍 2编译 3模块安装 4查看信息cat /proc/devices查看字符和块设备cat /proc/partitions查看磁盘及分区ls /dev/lsmod 5挂载测试 2、块设备驱动简单分析 1如何证明块设备驱动真的工作了格式化、挂载 格式化mkfs.ext2 /dev/my_ramblock挂载mount -t ext2 /dev/my_ramblcok /tmp之后在/tmp进行的操作创建文件写内容都是在此块设备进行操作卸载umount /tmp卸载之后/tmp没有之前的文件 2注意各种打印信息 3体会块设备驱动的整体工作框架 3、源码分析 1register_blkdev(kernel/block/genhd.c) 内核提供的注册块设备驱动的注册接口在块设备驱动框架中的地位等同于register_chrdev在字符设备驱动框架中的地位。 2blk_init_queue  用来实例化产生一个等待队列将来应用层对本块设备所做的所有的读写操作都会生成一个request然后被加到这个等待队列中来。 3blk_init_queue 函数接收2个参数第一个是等待队列的回调函数这个函数是驱动提供的用来处理等待队列中的request的函数IO调度层通过电梯算法从等待队列中取出一个request就会调用这个回调函数来处理这个请求第二个参数是一个自旋锁这个自旋锁是要求我们驱动提供给等待队列去使用的。 4blk_fetch_request 函数是IO调度层提供的接口作用是从request_queue中按照电梯算法取出一个算法认为当前最应该去被执行的一个请求是被算法排序、合并后的请求取出的请求其实就是当前硬件块设备最应该去执行的那个读写操作。 #include linux/module.h #include linux/slab.h #include linux/errno.h #include linux/interrupt.h #include linux/mm.h #include linux/fs.h #include linux/kernel.h #include linux/timer.h #include linux/genhd.h #include linux/hdreg.h #include linux/ioport.h #include linux/init.h #include linux/wait.h #include linux/blkdev.h #include linux/blkpg.h #include linux/delay.h #include linux/io.h #include asm/system.h #include asm/uaccess.h #include asm/dma.h#define RAMBLOCK_SIZE (1024*1024) // 1MB2048扇区static struct gendisk *my_ramblock_disk; // 磁盘设备的结构体 static struct request_queue *my_ramblock_queue; // 等待队列 static DEFINE_SPINLOCK(my_ramblock_lock); static int major; static unsigned char *my_ramblock_buf; // 虚拟块设备的内存指针static void do_my_ramblock_request(struct request_queue *q) {struct request *req;static int r_cnt 0; //实验用打印出驱动读与写的调度方法static int w_cnt 0;req blk_fetch_request(q);while (NULL ! req){unsigned long start blk_rq_pos(req) *512;unsigned long len blk_rq_cur_bytes(req);if(rq_data_dir(req) READ){// 读请求memcpy(req-buffer, my_ramblock_buf start, len); //读操作printk(do_my_ramblock-request read %d times\n, r_cnt);}else{// 写请求memcpy( my_ramblock_bufstart, req-buffer, len); //写操作printk(do_my_ramblock request write %d times\n, w_cnt);}if(!__blk_end_request_cur(req, 0)) {req blk_fetch_request(q);}} }static int blk_ioctl(struct block_device *dev, fmode_t no, unsigned cmd, unsigned long arg) {return -ENOTTY; }static int blk_open (struct block_device *dev , fmode_t no) {printk(11111blk mount succeed\n);return 0; } static int blk_release(struct gendisk *gd , fmode_t no) {printk(11111blk umount succeed\n);return 0; }static const struct block_device_operations my_ramblock_fops {.owner THIS_MODULE,.open blk_open,.release blk_release,.ioctl blk_ioctl, };static int my_ramblock_init(void) {major register_blkdev(0, my_ramblock);if (major 0){printk(fail to regiser my_ramblock\n);return -EBUSY;}// 实例化my_ramblock_disk alloc_disk(1); //次设备个数 分区个数 1//分配设置请求队列提供读写能力my_ramblock_queue blk_init_queue(do_my_ramblock_request, my_ramblock_lock);//设置硬盘属性 my_ramblock_disk-major major;my_ramblock_disk-first_minor 0;my_ramblock_disk-fops my_ramblock_fops;sprintf(my_ramblock_disk-disk_name, my_ramblcok); // /dev/namemy_ramblock_disk-queue my_ramblock_queue;set_capacity(my_ramblock_disk, RAMBLOCK_SIZE / 512);/* 硬件相关操作 */my_ramblock_buf kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);add_disk(my_ramblock_disk); // 向驱动框架注册一个disk或者一个partation的接口return 0; }static void my_ramblock_exit(void) {unregister_blkdev(major, my_ramblock);del_gendisk(my_ramblock_disk);put_disk(my_ramblock_disk);blk_cleanup_queue(my_ramblock_queue);kfree(my_ramblock_buf); }module_init(my_ramblock_init); module_exit(my_ramblock_exit);MODULE_LICENSE(GPL);
http://www.pierceye.com/news/367553/

相关文章:

  • 网站开发亿玛酷给力5上海logo在线制作
  • 网站重新备案搞个网站需要多少钱
  • 海南微信网站制作平台网络计划的优化
  • 域名的正确书写格式自动seo优化
  • 怎样在网站做友情链接网页什么设计
  • 做seo网站营销推广南宁建设职业技术学院招聘信息网站
  • 网站建设全网推广小程序手机网站怎么优化
  • wordpress 网站logowin系统没有wordpress
  • 玉山电商网站建设东莞市建设规划局网站
  • 网站建设运营公司企业特色c2c的代表性的电商平台
  • 上海网站建设,分类广告软件公司简介
  • 网站虚拟主机被国家禁止访问的网站怎么打开
  • wordpress手机加载不出来优化官网咨询
  • 平台网站建设预算表如何来做网站
  • 温州网站制作企业东莞网络推广公司电话
  • 网站建设的条件重庆那些网站
  • 伊犁网站制作大连甘井子区房价
  • 循环视频做网站背景win2012r2 建设网站
  • 建设网站制作汉狮团队义乌北苑编程网站开发公司
  • 网站开发公司会计处理滨州市住房和城乡建设局网站
  • 企业网站站内优化长尾关键词挖掘站长工具
  • 山东平台网站建设企业怎么做自己的品牌网站
  • 长沙seo网站排名杭州网站建设q479185700棒
  • 泰州网站建设搭建工程造价网
  • 网站流程优化c2c模式举例子
  • 帝国网站调用图片集网店平台有哪些
  • 做flash音乐网站的开题报告删除wordpress左上角
  • php网站开发学什么衡水大型网站建设
  • 广州网站开发软件平台wordpress 问号
  • 西安市建设干部学校网站厦门网站优化服务