LinuxIO数据通道分享.pptx

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LinuxIO数据通道分享课案

;IO数据通道处理层次;块设备: 块设备是支持以固定长度的块为单位读/写数据的存储设备的总称。块设备包括支持随机访问(如数码相机存储卡,RAM盘)和寻到的硬件设备(如磁盘、软盘、CDROM、内存区域等),也可以是逻辑设备,如MD设备,Device mapper。;块设备处理请求函数: 请求处理是块设备驱动的核心,实际的工作都是在这个函数执行,是块设备驱动提供给上层的借口,块设备将通过这个函数获得I/O 请求。;struct request { struct list_head queuelist; struct request_queue *q; unsigned int cmd_flags;//请求的类型 sector_t __sector; //请求开始扇区 unsigned int __data_len; 请求的数据长度 struct bio *bio; 请求的第一个bio struct bio *biotail;请求的最后一个bio ………………. }; ;struct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; }; ;;分配,初始化请求队列,绑定请求队列和请求函数的两种方式: 一.无请求队列: 适合于完全可以随机访问的设备数码相机存储卡,RAM盘等(现在我们的SSD适合),这种方式不会经过 IO Schedule Layer。;分配请求队列、绑定请求队列和请求函数: blk_init_queue(make_request,queue_lock) ——分配请求队列且绑定请求队列和请求函数。 ;IO 调度层 ;IO 调度层 ;中断和中断处理;中断处理:中断处理程序要求快速、高效,而又想中断处理程序处理的工作量多,所以把中断处理分成中断上半部和下半部。 ;注册中断处理函数原型: int request_irq(unsigned int irq,irq_handler_t handler, unsigned long flags, const char *devname, void *dev_id) 释放中断处理函数原型:void free_irq(unsigned int irq, void *dev_id) ;三、工作队列: ; 软中断的实现: 软中断是在编译期间静态分配的,它由softirq_action 的结构表示: struct softirq_action { void (*action)(struct softirq_action *); }; ;中断和中断处理;;工作队列: 工作队列是另一种将工作推后执行的形式,它可以把推后执行的工作交给一个内核线程来执行,也就是用这种机制实现中断下半部的是在进程上下文中执行的,工作队列可以重新调度甚至睡眠。 ;表示线程的数据结构: struct workqueue_struct { struct cpu_workqueue_struct *cpu_wq; struct list_head list; const char *name; int singlethread; int freezeable; /* Freeze threads during suspend */ int rt; #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif }; ;使用工作队列: 一、创建推后执行的工作: 1、静态创建:DECLARE_WORK(name,void (*func) (void *),void *data); 2、动态创建:INIT_WORK(struct work_struct *work, oid (*func) (void *),void *data); ;三、对工作进行调度: 把给定工作的处理函数提交给缺省的events工作者线程: schedule_work(); 调用此函数work马上会被调度,当所在处理器上的工作队列线程被 唤醒时就会被执行; ;中断和中断处理;下半部机制的选择:首先,如果需要一个可以休眠、可以调度的实体来执行推后完成的工作,选择工作队列;否则用tasklet,还有如果专注性能的提高,可以使用软中断。 ;中断和中断处理实际实现: 对于普通读写和trim命令中断处理只有上半部: Mvumi_isr_handler?mvumi_receive_ob_list_entry ?g_complete_cmd ?raid0_end_io ?host_cmd_

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档