Linux平台下USB大容量存储设备驱动程序的改进与优化

合集下载

linux系统优化的方法

linux系统优化的方法

linux系统优化的方法1. 引言Linux作为一种开源操作系统,广泛应用于各种领域,包括服务器、嵌入式设备和个人电脑等。

然而,随着系统使用时间的增长和应用程序的复杂性增加,Linux系统可能会出现性能下降、资源浪费和安全漏洞等问题。

因此,对Linux系统进行优化是至关重要的。

本文将介绍一些常见的Linux系统优化方法,包括文件系统优化、内存管理、CPU调度、网络调优和安全性提升等。

2. 文件系统优化文件系统是操作系统中负责管理文件存储和访问的重要组成部分。

在Linux中,常见的文件系统包括Ext4、XFS和Btrfs等。

为了提高文件访问效率和减少磁盘空间占用,可以采取以下方法进行文件系统优化:2.1 使用SSD作为存储介质:SSD相比传统机械硬盘具有更高的读写速度和更低的访问延迟,在提高IO性能方面有明显优势。

2.2 合理设置磁盘调度器:可以根据应用场景选择不同的磁盘调度算法,在提高读写效率方面有所帮助。

2.3 使用日志模式:在文件系统中启用日志模式可以提高文件系统的稳定性和可靠性,减少数据丢失的风险。

3. 内存管理内存管理是操作系统中的重要任务,它负责将内存资源分配给不同的应用程序,并优化内存的使用效率。

在Linux中,可以采取以下方法进行内存管理优化:3.1 合理分配内存资源:根据不同应用程序的需求,合理分配可用内存资源,并通过调整虚拟内存和交换空间等参数来优化内存使用效率。

3.2 使用透明大页:透明大页是Linux中一种优化技术,它能够提高大型应用程序在访问大量数据时的性能。

3.3 启用透明压缩:透明压缩是一种新型的Linux内核功能,它可以通过压缩不常访问的页面来释放更多可用内存空间。

4. CPU调度CPU调度是操作系统中负责分配CPU时间片给不同进程或线程的重要任务。

在Linux中,默认采用CFS(Completely Fair Scheduler)调度算法。

为了提高CPU利用率和响应速度,可以采取以下方法进行CPU 调度优化:4.1 使用实时调度策略:对于对实时性要求较高或需要响应速度较快的应用程序,可以采用实时调度策略,如SCHED_FIFO或SCHED_RR。

LINUX操作系统USB驱动程序

LINUX操作系统USB驱动程序

一、引言USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不同速度的、可扩充的并且使用方便的外围设备接口,同时也是为了解决计算机接口的太多的弊端而设计的。

一个USB系统主要有三部分组成:USB互连、USB主机、USB设备三部分组成的,其结构如图1所示。

在编写USB设备驱动程序设计时,可以分为三部分编写:主机端设备驱动程序、主机控制器驱动程序设计和设备端驱动程序三部分,在本文中重点介绍主机端驱动程序的设计。

二、USB设备驱动程序的设计USB设备驱动程序的设计包括主机端设备驱动程序设计、主机控制器驱动程序设计和设备端驱动程序设计三部分组成。

主机端设备驱动程序就是通常说的设备驱动程序,它是主机环境中为用户应用程序提供一个访问USB外设的接口。

Linux为这部分驱动程序提供编程接口,驱动程序设计者只要按照需求编写驱动程序框架,通过调用操作系统提供的API接口函数可以完成对USB外设的特定访问。

主机控制驱动主要是对USB主机控制器的驱动,在大多数PC环境下,主机控制器都是由操作系统提供。

嵌入式设备一般都没有USB主机控制器,只是工作在Slave模式下。

如果要使USB具有主机功能,那么设备中需要选用一个带主机控制器的USB接口控制芯片,同时自己还要有实现该主机控制器的驱动程序。

目前Linux内核中只提供USB主机控制器的开放主机控制器和通用主机控制器接口两种规格,而这两种规格主要用在PC架构中。

USB主机端驱动程序与主机控制器的结构如图2所示。

其中USB核是Linux的一个子模块,集中定义了一组USB相关的数据结构、宏以及API函数。

USB设备驱动程序是常说的设备固件程序的一部分,提供设备信息与主机的通信接口。

设备端USB驱动程序设计由以下几部分处理程序组成。

初始化例程:完成描述符指针、端点、配置改变等操作。

数据传输例程:完成控制传输、批量传输、中断传输及同步传输等传输方式下的数据收发工作。

linux下USB大容量存储设备驱动分析与实现

linux下USB大容量存储设备驱动分析与实现

linux下USB大容量存储设备驱动分析与实现【摘要】本文介绍了linux USB子系统架构及USB协议,重点分析了linux 下USB大容量存储设备驱动程序,并结合U盘特点对设备驱动程序做了可靠的裁剪,以交叉编译和控制台调试的方式,在TQ2440 ARM开发板上成功实现了设备驱动模块的加载与卸载,最终达到了U盘热插拔和读写的目的。

【关键词】USB;大容量存储设备;设备驱动USB(universal serial bus)通用串行总线是一种高速、支持即插即用和热插拔的总线标准,由intel、microsoft等公司制定,适用于多种USB外围设备(U 盘、USB键盘鼠标、USB摄像头等)与主机之间的高速数据传输,USB2.0协议规定的最大传输速率可达480Mb/s,突破了传统串行总线的带宽限制。

Linux作为一种性能稳定,可定制,兼容性强的开源操作系统,在嵌入式设备中得到了广泛应用,且开发者可以方便地获得linux社区提供的强大技术支持,从而能够大大降低开发成本。

本文以天嵌公司的TQ2440 ARM开发板为硬件平台,以linux2.6.30为操作系统内核,通过串口工具secure CRT,使用金士顿U盘作为USB存储设备,的分析并实现了linux下USB大容量存储设备驱动。

B子系统类似于linux scsi子系统,USB子系统也采用树形拓扑结构,层级关系因系统功能的不同而不同,拓扑模型如图1所示。

系统作为主机时拓扑层级为:USB 设备驱动、USB核心、USB主控制器驱动;作为从设备时层级为:Gadget驱动、Gadget API、USB设备控制器驱动。

本文以linux为主机系统,U盘为从设备,因此只讨论主机侧拓扑结构。

USB设备驱动负责:向USB核心注册设备驱动、管理USB设备的探测与断开、实现与USB核心通信;USB核心提供一系列数据结构,宏定义和函数来抽象底层硬件设备,为设备驱动和主控器驱动提供特定的接口,读取并解析USB 设备和配置描述符,为USB设备分配地址,转发设备驱动数据包,配置设备,维护设备链表和设备驱动链表,维护设备信息;USB主控制器驱动负责:与核心层通信、管理主控制器与设备的实际通信。

Linux系统优化提高性能和效率的技巧

Linux系统优化提高性能和效率的技巧

Linux系统优化提高性能和效率的技巧Linux系统是一种广泛使用的操作系统,它以其稳定性和可靠性而闻名。

然而,对于用户来说,通过一些优化措施,可以进一步提高Linux系统的性能和效率。

本文将介绍一些实用的技巧,帮助用户优化Linux系统。

一、内核参数的优化内核是操作系统的核心,优化内核参数可以对系统性能产生巨大影响。

以下是一些常见的内核参数优化技巧:1. 调整文件句柄限制:修改文件句柄限制可以提高系统对同时打开的文件数量的支持能力。

可以通过修改`/etc/security/limits.conf`文件中的配置来实现。

2. 调整文件系统参数:修改文件系统参数可以提高文件访问的效率。

例如,可以通过修改`/etc/fstab`文件中的选项来启用一些高效的文件系统特性,如读写缓存。

3. 调整网络参数:通过修改网络参数,可以提高系统在网络传输中的性能。

例如,可以通过修改`/etc/sysctl.conf`文件中的配置参数来优化网络传输缓冲区的大小,从而提高网络传输的效率。

二、服务和进程管理在Linux系统中,有许多服务和进程在后台运行,对系统性能有一定的影响。

以下是一些服务和进程管理的技巧:1. 禁用不需要的服务:禁用一些不需要的服务可以释放系统资源,提高系统性能。

可以通过`systemctl`命令禁用一些不需要的服务。

2. 使用优化的Web服务器:对于Web服务器来说,选择性能较高的服务器软件可以提高系统的性能。

例如,Nginx和Apache是两个常用的高性能Web服务器。

3. 进程优先级调整:通过调整进程的优先级,可以提高系统对关键进程的处理能力。

可以使用`nice`和`renice`命令修改进程的优先级。

三、磁盘和存储优化磁盘和存储是系统中重要的组成部分,对其进行优化可以提高系统的性能。

以下是一些磁盘和存储优化的技巧:1. 使用SSD替代传统硬盘:固态硬盘(SSD)的读写速度更快,可以显著提高系统的响应速度。

如何实现Linux下的U盘(USB Mass Storage)驱动 v0.4

如何实现Linux下的U盘(USB Mass Storage)驱动 v0.4

如何实现Linux下的U盘(USB Mass Storage)驱动How to Write Linux USB MSC (Mass Storage Class) Driver版本: 0.4作者: crifan联系方式:green-waste (at) 版本历史目录1正文之前 (6)1.1本文目的 (6)1.2阅读此文所需要的前提知识 (7)1.3声明 (7)2USB基本知识 (8)2.1USB的硬件 (8)2.2USB相关的协议 (8)2.3USB相关的软件实现 (8)3USB Mass Storage大容量存储的基本知识 (9)3.1USB Mass Storage相关的协议 (13)3.1.1USB Mass Storage相关协议简介 (14)3.1.1.1USB MSC Control/Bulk/Interrupt (CBI) Transport (14)3.1.1.2USB MSC Bulk-Only (BBB) Transport (15)3.1.1.2.1为何USB MSC中Bulk-only Transport被叫做 BBB (15)3.1.1.2.2为何已经有了CBI,又再弄出个BBB (15)3.1.1.3USB MSC UFI Command Specification (16)3.1.1.4USB MSC Bootability Specification (16)3.1.1.5USB MSC Compliance Test Specification (17)3.1.1.6USB Lockable Storage Devices Feature Specification (17)3.1.1.7USB MSC USB Attached SCSI Protocol (UASP) (17)3.1.1.7.1已有SCSI协议,为何还要再弄一个UASP (17)3.1.2USB MSC的各个协议之间关系总结 (19)3.1.3U盘与USB中的Class,Subclass和Protocol的对应关系 (20)3.1.3.1bInterfaceClass=0x08=Mass Storage (21)3.1.3.2bInterfaceSubClass=0x06=SCSI Transparent (21)3.1.3.3bInterfaceProtocol=0x50=Bulk Only Transport (21)3.2USB Mass Storage相关的软件实现 (22)4实现U盘驱动的整个流程是什么样的 (23)5Linux系统下,USB驱动的框架已经做了哪些事情 (24)6Linux下实现U盘驱动,自己需要做哪些事情以及如何做 (25)7引用文章 (26)图表图表 1 U盘 (6)图表 2 USB Mass Storage Framework (9)图表 3 PC和U盘 (10)图表 4 PC和U盘的芯片内部结构 (10)图表 5 PC和U盘的内部逻辑框图 (11)图表 6 PC和USB MSC设备 (12)图表 7 USB MSC的分类 (12)图表 8 USB Storage Class Protocol Relation (19)图表 9 SubClass Codes Mapped to Command Block Specifications (21)图表 10 Mass Storage Transport Protocol (21)图表 11 USB数据流向图 (23)缩写1 正文之前1.1 本文目的关于U盘,估计大家都用过。

基于嵌入式Linux的U盘驱动的分析与改进

基于嵌入式Linux的U盘驱动的分析与改进

基于嵌入式Linux的U盘驱动的分析与改进
张波;张曦煌
【期刊名称】《计算机工程与设计》
【年(卷),期】2008(029)015
【摘要】U盘作为一种便利的存储设备,可以应用于嵌入式系统中,其应用的基础就是对Linux的 USB Mass Storage驱动的裁剪,以获得所需的简化的驱动程序.分析了Linux下的USB mass storage协议,简化系统申所不需要的代码,使其仅支持基于Bulk-Only传输模式下的ATAPI协议的存储设备,从而使嵌入式系统更加精简,对USB mass storage驱动程序进行了裁剪.经过裁剪的USB Mass Storage驱动程序移植到三星公司的QT2410E开发板上并取得成功.
【总页数】3页(P3917-3918,3940)
【作者】张波;张曦煌
【作者单位】江南大学信息学院,江苏,无锡,214122;江南大学信息学院,江苏,无锡,214122
【正文语种】中文
【中图分类】TP368
【相关文献】
1.嵌入式Linux下用AT91RM9200实现对U盘的操作 [J], 毛玲;阎学文
2.基于ARM11的嵌入式Linux NAND FLASH 模拟U盘挂载分析与实现 [J], 彭玉峰;赵越;张淑丽;金龙;林思宏
3.基于U盘下嵌入式Linux-iptables的防火墙设计与实现 [J], 杨本祥
4.基于差速驱动的AGV驱动单元分析与改进设计 [J], 赵华东;江南;雷超帆
5.基于Windows驱动设计的U盘防御系统的研究 [J], 赵辰
因版权原因,仅展示原文概要,查看原文内容请购买。

如何在Linux上进行系统性能调优和优化

如何在Linux上进行系统性能调优和优化

如何在Linux上进行系统性能调优和优化在当今信息技术迅速发展的时代,我们越来越依赖于高效可靠的计算机系统。

而Linux作为一种自由开源的操作系统,广泛应用于服务器、嵌入式设备等领域,其性能的优化和调优对于提升系统效能至关重要。

本文将介绍如何在Linux上进行系统性能调优和优化,帮助您充分发挥系统的潜力。

一、硬件优化1. 使用高性能硬件:在硬件选择上,优先选择性能较好的硬件设备,包括CPU、内存、硬盘等。

更多的计算核心和更大的内存容量能够提供更好的性能表现。

2. RAID配置:RAID(冗余磁盘阵列)可以通过硬件或软件方式实现磁盘数据的冗余和性能提升。

选择合适的RAID级别,根据需求进行配置,以提高磁盘读写的性能和可靠性。

3. 内存优化:合理配置内存参数,包括页缓存、交换分区等,调整内存大小以最大限度地提高系统的性能。

可以通过修改/sys文件系统中的相关参数进行调优。

二、系统设置优化1. 禁用不必要的服务:Linux发行版通常默认安装了一些不必要的服务和进程,这些服务对于性能并不一定有帮助。

通过关闭或禁用这些服务,可以节省系统资源并提高系统的性能。

2. 优化文件系统:选择合适的文件系统,如ext4、XFS等,根据需求调整文件系统的参数设置。

使用SSD固态硬盘可以显著提高文件系统的性能。

3. 调整调度器:Linux内核提供了不同的调度器,可以根据应用场景选择适合的调度器。

通过调整调度器参数,可以提高系统对于多核CPU的利用率,提升系统的响应速度和并发性能。

三、系统分析与优化1. 监控系统性能:通过使用工具如top、sar、vmstat等,实时监控系统的CPU、内存、磁盘和网络等性能指标。

根据监控结果,找出性能瓶颈,并采取相应的优化措施。

2. 调整内核参数:Linux内核提供了丰富的参数用于调优,可以根据实际情况进行调整。

可以通过修改/etc/sysctl.conf文件来修改内核参数,并使用sysctl命令重新加载参数。

Linux下USB设备驱动加载策略分析

Linux下USB设备驱动加载策略分析

l ;
其 中 .n d _ r e 将 d v e设 备 链 接 到 di r 动 上 的 k oe d vr i ei c r es驱 v
l t 点 ,u i节 s bs描述 设 备 所 连 接 的 总线 类 型 ,r e 指 向 管 理 该 设 di r v 备 的 驱 动 程 序对 象 。
n me a ;
sby; u s s d ies rv r;
拓扑 。处 于 每 个 星形 拓 扑 中央 的是 H B S U B 集 线 器) U B总线 可 以 。S 分 U B 连 接 、 S 设 S UB 备 、 S 主 机 三 个 部 分 UB 进行描述。
U B 连 接 是 指 S U B 主 机 和 U B设 备 S S
总 线 用 src u t e描 述 。s u t u ye定 S Y: tu t s y b p t c stp r b r ̄
_
s u t u t el t c s y r b p
_
ent h r o s c a
s u ts b y tm t c u s s r e s u tke t c s t r
n; t
su t ltnd t c i _ o e r k s s u tki — o e t c l t n r s d s u t u y e t c s tp r b
_
k o e d ier n d r v ; k o e l s nd m ;
_
‘b s u;
sr c e ie drv r* rv r t t vc u d ie d ie,
U B 总 线 在 物 理 S 上 是 一 个 分 层 的 星 形
s ut ei t c dv e{ r c
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京交通大学硕士学位论文Linux平台下USB大容量存储设备驱动程序的改进与优化姓名:刘超申请学位级别:硕士专业:软件工程指导教师:韩臻20080601北京交通大学专业硕士学位论文化:Structbustypepci_bus_type={.name=‘'pci”,.match=pci_bus_match,.hotplug=pci_hotplug,.suspend=pci_devicesuspend,.resume=pci__device_resume,,dev—attrs=pci_dev_attrs,);在将PCI子系统装载到内核中时,通过调用bus_register,该pci_bus_type变量将向驱动程序核心注册。

此后,驱动程序将在/sys/bus/pci中创建一个sysfs目录,其中包含了两个目录:devices和drivers。

所有的PCI驱动程序都必须定义一个pci_driver结构变量,该变量包含了这个PCI驱动程序所提供的不同功能函数。

这个结构中包含了一个device_driver结构,在注册PCI驱动程序时,这个结构将被初始化:/半初始化driver中常用的成员奉/Drv->driver.name=drv一>name;Dry->driver.bus=&pci_bus咖e;Dry->driver.probe=pci_device_probe;Dry->driver.remove=pci_deviceremove;Drv->driver.kobj.ktype=&pci_driverkobj_type;该段代码用来为驱动程序设置总线,它将驱动程序的总线指向pci_bus_type,并且将probe和remove函数指向PCI核心中的相关函数。

为了让PCI驱动程序的属性文件能正常工作,将驱动程序的kobject中的ktype设置成pci_driver_kobj_type,然后PCI核心向驱动程序核心注册PCI驱动程序:产向核心注册奉/Error=driverregister(&dry->driver);现在驱动程序可与其所支持的任何PCI设备绑定。

在能与PCI总线交互的特定体系架构代码的帮助下,PCI核心开始探测PCI地址空间,查找所有的PCI设备。

当一个PCI设备被找到时,PCI核心在内存中创建一个pci__dev类型的结构变量。

pci_dev结构的部分内容如下所示:Structpcidev{Unsignedintdevfn;Unsignedshortvendor;系统分析Unsignedshortdevice;Unsignedshortsubsystem_vendor;Unsignedshortsubsystemdevice;Unsignedintclass;Structpci_driver奉driver;Structdevicedev;);这个设备中与总线相关的成员将由PCI核心初始化,并且device结构变量的parent变量被设置为该PCI设备所在的总线设备。

Bus变量被设置为指向pci_bustype结构。

接着设置name和bus—id变量,其值取决于从PCI设备中读出的名字和ID。

当PCI的device结构被初始化后,使用下面的代码向驱动程序核心注册设备:Device_register(&dev一>dev);在deviceregister函数中,驱动程序核心对device中的许多成员进行初始化,向kobject核心注册设备的kobject,然后将该设备添加到设备列表中,该设备列表为包含该设备的父节点所拥有。

完成这些工作后,所有的设备都可以通过正确的顺序访问,并且知道每个设备都挂在层次结构的哪一点上。

接着设备将被添加到与总线相关的所有设备链表中,在这个例子中是pci_bus_type链表。

这个链表包含了所有向总线注册的设备,遍历这个链表并为每个驱动程序调用该总线的match函数,同时指定该设备。

对于pci_bus_type总线来说,PCI核心在把设备提交给驱动程序核心前,将match函数指向pcibusmatch函数。

Pcibusmatch函数将把驱动程序核心传递给它的device结构转换为pci.dev结构。

它还把devicedriver结构转换成peidriver结构,并查看设备和驱动程序中的PCI设备相关信息,以确定驱动程序是否能支持这类设备。

如果这样的匹配工作没能正确执行,该函数会向驱动程序核心返回0,接着驱动程序核心考虑在其链表中的下一个驱动程序。

如果匹配工作完成,函数向驱动程序核心返回1。

这将导致驱动程序核心将device结构中的driver指针指向这个驱动程序,然后调用devicedriver结构中指定的probe函数【81。

在PCI驱动程序向驱动程序核心注册前,probe变量被设置为指向pci_device_probe函数。

该函数将device结构转换为pci_dev结构,并把在device中设置的driver结构转换为pcidriver结构。

它也将检测这个驱动程序的状态,以确保其能支持这个设备,增加设备的引用计数,然后用绑定的peidev结构指针为北京交通大学专业硕士学位论文参数,调用PCI驱动程序的probe函数。

如果PCI驱动程序的probe函数出于某种原因,判定不能处理这个设备,其将返回负的错误值给驱动程序核心,这将导致驱动程序核心继续在驱动程序列表中搜索,以匹配这个设备。

如果probe函数探测到了设备,为了能正常的操作设备,它将做所有的初始化工作,然后向驱动程序核心返回0。

这会使驱动程序核心将该设备添加到与此驱动程序绑定的设备链表中,并在sysfs中的drivers目录到当前控制设备之间建立符号链接。

这个符号链接使得用户知道哪个驱动程序被绑定到了哪个设备上。

删除设备当删除一个PCI设备时,要调用pciremovebusdevice函数。

该函数作些PCI相关的清理工作,然后使用指向pcidev中的device结构的指针,调用deviceunregister函数。

在device到sysfs文件的符号链接,从内部设备链表中删除了该设备,并以device结构中的kobject结构指针为参数,调用kobject_del函数。

该函数引起了用户空间的hotplug调用,表明kobject现在在系统中删除,然后删除全部与kobject相关的sysfs文件和sysfs目录,而这些目录和文件都是kobject以前创建的。

Kobject函数还删除了设备的引用。

如果该引用是最后一个,就要.delkobject调用该PCI设备的release函数_pcireleasedev。

该函数只释放了pcidev结构所占用的空间。

至此,与设备相关的所有sysfs入口都被删除,并与设备相关的内存也被释放,PCI设备被完全从系统中删除。

添加驱动程序当调用pciregist眵driver函数时,一个PCI驱动程序被添加到PCI核心中,该函数初始化了包含在pcidriver结构中的devicedriver结构。

PCI核心用包含在pci结构中的结构指针作为参数,在驱动程序核心内调用.driverdevicedriverdriverdriverregister函数初始化了几个devicedriver中的锁,然后调用busadddriver函数。

该函数按以下步骤操作:1)查找与驱动程序相关的总线。

如果没有找到该总线,函数立刻返回。

2)根据驱动程序的名字以及相关的总线,创建驱动程序的sysfs目录。

3)获取总线内部的锁,接着遍历所有向总线注册的设备,然后如同添加新设备一样,为这些设备调用match函数。

删除驱动程序系统分析对PCI驱动程序来说,驱动程序调用pciunregister含在pci结构中的结构作为参数,调用驱动程序核心函数.driverdevicedriverdriver_unregister.通过清除在sysfs树中属于驱动程序的sysfs属性,来完成一些基本管理工作。

然后它遍历所有属于该驱动程序的设备,并为其调用release函数。

当所有的设备与驱动程序脱离后,驱动程序代码使用了下面两个函数:Down(&drv->unload_sem);Up(&drv->unload_sem);在返回给调用者前执行这个操作。

锁住代码是因为在函数安全返回前,代码需要等待驱动程序的所有引用计数为0。

模块在被卸载时,几乎都要调用driver锁的解开,模块就需要保留在内存中,这样,内核就能知道什么时候可以安全的把驱动程序从内存中上删除掉。

2.2块设备I/0请求处理不:块设备驱动程序的每一读写操作需要内核多层的处理,处理流程如图2.3所图2.3Linux块设备FO请求处理流程Fig2.3thehandleflowoflinuxfor10requestofblockdevice北京交通大学专业硕士学位论文内核在处理一个读操作时,将在磁盘上执行read()系统调用,处理一个写操作时,将在磁盘上执行write()系统调用。

以读操作为例,内核所需要做的工作如下【ll】:1)read()系统调用将激活虚拟文件层函数,并将一个文件描述和文件偏移量传递给该函数。

虚拟文件系统位于块设备处理体系上层,它为linux中所有文件系统提供了一个公共文件模型。

2)虚拟文件层函数将确定请求数据是否存在,如果存在,将如何执行读操作。

有时,并不需要从磁盘中获取数据,因为内核将块设备中常用的一些数据保存在RAM中。

3)假设内核必须从块设备中读取数据,那么,它必须知道这些数据的物理位置,这部分工作由mapping层来完成,它分两步:第一步确定文件所属的文件系统一块的大小,根据文件块数计算数据请求的字节数。

通常,一个文件被分割存储在多个块中,内核确定请求数据包含在哪些块中。

第二步,mapping层调用一个文件系统专用函数,访问文件的磁盘节点,根据逻辑块号确定请求数据的物理存储位置。

通常,磁盘被分割成很多物理块,内核根据逻辑块号确定物理块号。

磁盘节点中存有一种用来匹配文件物理块号和逻辑块号的数据结构。

4)逻辑块号和物理块号匹配后,内核genericblock层开始处理I/O操作。

由于请求数据不一定都是相邻的,一次I/O操作通常涉及多组相邻的物理块,geneticblock层可能将一个I/O操作拆分为多个I/O请求。

每个I/O请求数据由相邻的物理块组成,每个I/O请求将由blockI/O(bio)结构表示,它存储了下层程序所需的所有信息。

5)geneticblock层下面是I/Oscheduler层,它根据预先定义好的内核策略将所有为完成的bio请求进行排序。

该层将合成位于相邻物理存储块的bio请求。

相关文档
最新文档