0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙系统 IO栈和Linux IO栈对比分析

鸿蒙系统HarmonyOS 来源:oschina 作者:GongMingWei 2020-10-16 10:45 次阅读

华为的鸿蒙系统开源之后第一个想看的模块就是 FS 模块,想了解一下它的 IO 路径与 linux 的区别。现在鸿蒙开源的仓库中有两个内核系统,一个是 liteos_a 系统,一个是 liteos_m 系统。两者的区别主要是适应的场景不一样,liteos_a 系统适用于硬件资源更加丰富的场景,比如 CPU 更强,内存更大;而 liteos_m 系统则适用于 IoT 设备,相对来说硬件资源比较弱一些。所以我们就拿 liteos_a 系统来分析一下它的 IO 栈吧,毕竟它应对的场景更加复杂一些。

鸿蒙系统 liteos_a Kernel 的下载地址在这:https://gitee.com/openharmony/kernel_liteos_a。

1.FS 源码结构

下载内核源码后发现 fs 目录下似乎缺少很多东西。

当时觉得好奇怪,啥都没有,那它的 shell 相关命令是怎么使用 fs 模块进行读写的呢?于是发现鸿蒙的 FS 模块主要是从 Nuttx (注:Nuttx 是 Apache 正在孵化的实时操作系统内核)那里借用了 FS 的相关实现。这是从内核的 fs.h 引用的路径发现的,它引用的路径内容如下:

../../../../../third_party/NuttX/include/nuttx/fs/fs.h

所以我们需要找到这个模块,在 gitee 的仓库中搜索 Nuttx 发现的确有这个仓库,所以我们需要联合两个仓库的代码一起解读 IO 栈的源码。Nuttx 的仓库地址为:https://gitee.com/openharmony/third_party_NuttX。

我们来看一下 Nuttx 的目录结构:

可以发现 FS 的具体实现都在这个 Nuttx 仓库内。接下来我们来看看鸿蒙系统的 IO 栈吧,因为 IO 栈的路径比较多,所以我们选取块设备(block device)的路径来分析。

2. IO 整体架构

鸿蒙系统关于块设备的 IO 栈路径整体架构如下图所示:

整体 IO 流程如下:

上层应用会在用户态下调用 read / write 接口,这会触发系统调用(syscall)进入内核态;

系统调用往下调用 VFS 的接口,如 read 则对应 read,write 对应 write;

VFS 这层会根据 fd 对应的 file 结构拿出超级块的 inode,利用这个 inode 继续往下调用具体 driver 的 read / write 接口;

在块设备的场景下,它是利用字符设备的驱动作为它的代理,也就是 driver 下面的 bch。鸿蒙系统的设备驱动中并没有块设备的驱动,所以它做了一层 block_proxy,无论是字符设备还是块设备的 IO 都会经过 bch 驱动。数据所位于的扇区以及偏移量(offset)计算位于这层;

IO 往下走会有一层缓存,叫 bcache。bcache 采用红黑树管理这些缓存的数据;

IO 再往下走就是块设备的驱动,内核没有通用的块设备驱动实现,它应该是由不同的厂商来实现的。

3.鸿蒙 IO 流程源码解读

读写流程大致一样,我们就看一下鸿蒙的读数据流程吧。由于函数的源码比较长,全贴出来也不太好,所以太长的源码我只将关键的部分截出。

3.1 上层应用读取数据

上层应用调用 read 接口,这个是系统的 POSIX 接口,read 接口原型如下:

#include 
ssize_t read(int fd, void *buf, size_t count); 

3.2 VFS

上层应用在用户态调用 read 接口后会触发系统调用,这个系统调用在 Kernel 的如下文件中进行注册:

syscall/fs_syscall.c

对应的系统调用函数为

237 行的 read 调用的是 VFS 这层的 read,VFS 这层的 read 函数实现位于 Nuttx 项目的如下路径:

fs/vfs/fs_read.c

read函数从 fd (文件描述符)中获取对应的 file 对象指针,然后在调用 file_read 接口。file_read 也和 read 函数位于同一个文件下。它从 file 对象中获取了超级块的 inode 对象,然后使用这个 inode 调用 bch 驱动的 read 函数。

3.3 bch 驱动

bch 驱动是一个字符设备驱动,它被用来当做上层与块设备驱动的中间层。注册块设备驱动时会调用 block_proxy 来做代理转换,它的实现位于:

fs/driver/fs_blockproxy.c

当打开(open)一个块设备时,内核会判断 inode 是否是块设备类型,如果是则调用 block_proxy 来做转换处理。 当上层调用 u.i_ops->read 时,它对应的是 bch_read,它的实现位于:

drivers/bch/bchdev_driver.c

bch_read 会接着调用 bchlib_read,这个函数的实现位于:

drivers/bch/bchlib_read.c

它会根据偏移(offset)计算出在哪个扇区进行读数据,如果要读取的数据只是某个扇区的一部分,则它会先利用 bchlib_readsector 将这个扇区全部读出来,然后再把对应的那部分数据拷贝到内存并返回。 bchlib_readsector 的实现位于如下位置:

drivers/bch/bchlib_cache.c

它会先将位于内存的脏数据下刷,等脏数据都下刷完成后才会利用 los_disk_read 把数据从磁盘上读上来。 los_disk_read 的实现位于 kernel 的如下位置:

fs/vfs/disk/disk.c

这 los_disk_read 这层会有一层缓存,叫 bcache。它会把每次 IO 的扇区缓存到内存中,缓存的组织方式为红黑树。它是有大小限制的,不是无限增长,具体大小与内存大小有关。 los_disk_read 在读数据之前会先从 bcache 缓存中查找有没有对应的缓存扇区,如果有则直接将这个扇区返回,如果没有则调用真正块设备的 read 函数。这个 read 函数在内核中没有对应的实现,所以它是跟随每个块设备的驱动的不同而不同。

整个读数据流程源码分析就到这里。

鸿蒙系统的 IO 栈分支比较多,这次的源码解读选用了块设备的分支进行分析,希望可以帮助大家更好的理解鸿蒙系统。最后我还想做一下鸿蒙系统与 Linux 关于 IO 栈的对比。

4.鸿蒙 IO 栈与 Linux IO 栈的对比

如果有研究过 linux IO 栈的同学应该能体会到鸿蒙的 IO 栈是比较简单。先来看一下 Linux 的 IO 栈整体架构图:

所以,我们对比一下鸿蒙系统和 Linux IO 栈的主要区别吧:

鸿蒙没有 pagecache。所以鸿蒙的系统调用加不加 O_SYNC 应该是一样的,都是直接下到磁盘。

鸿蒙没有通用块层和 IO 调度层。在 Linux 中通用块层是用来将连续的块请求组成一个 bio 结构体,便于对接下层的调度管理。调度层的目的则是用来减少 IO 寻址时间,在这层也有多种调度算法可以选择,如 cfq/deadline/noop 等。我觉得鸿蒙不是没有这两层,而是还没有做,目前只是 IoT 的适用场景。等明年适用于手机的时候再看看,我觉得应该也会做相关的处理,只不过不一定与 Linux 的处理一样。

鸿蒙的驱动层次不够完整,需要用字符设备的驱动来代理块设备的驱动,不知道这是基于什么考虑。

鸿蒙 bcache 的作用与 linux 的 pagecache 作用基本一致,只不过它们在 IO 栈上所在的位置不一样。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11319

    浏览量

    209822
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2636

    浏览量

    66438
  • IO栈
    +关注

    关注

    0

    文章

    2

    浏览量

    558
收藏 人收藏

    评论

    相关推荐

    意法半导体展示IO-Link收发器和低边功率开关的组合应用

    意法半导体推出了一款基于IO-Link的工业标准和设备报警执行器参考设计,最终交货形式是开箱即用的成品板卡及配套协议和应用软件。
    的头像 发表于 12-24 13:35 122次阅读

    电流倒灌揭秘:IO口损坏与系统故障的真相

    导读本期文章将继续深入了解电流倒灌,分析嵌入式系统IO口损坏和系统稳定性问题的根本原因。在上期的工程笔记中,我们了解了电流倒灌并探讨了电流倒灌可能导致的一系列问题,包括
    的头像 发表于 12-11 11:38 346次阅读
    电流倒灌揭秘:<b class='flag-5'>IO</b>口损坏与<b class='flag-5'>系统</b>故障的真相

    λ-IO:存储计算下的IO设计

    动机和背景    存储计算存储资源的充分利用。IO是管理存储器的的基本组件,包括设备驱动、块接口层、文件系统,目前一些用户空间IO库(如SPDK)有效降低了延迟,但是
    的头像 发表于 12-02 10:35 216次阅读
    λ-<b class='flag-5'>IO</b>:存储计算下的<b class='flag-5'>IO</b><b class='flag-5'>栈</b>设计

    RoCE与IB对比分析(二):功能应用篇

    在上一篇中,我们对RoCE、IB的协议层级进行了详细的对比分析,二者本质没有不同,但基于实际应用的考量,RoCE在开放性、成本方面更胜一筹。本文我们将继续分析RoCE和IB在拥塞控制、QoS、ECMP三个关键功能中的性能表现。
    的头像 发表于 11-15 14:03 325次阅读
    RoCE与IB<b class='flag-5'>对比分析</b>(二):功能应用篇

    一文解读Linux 5种IO模型

    Linux里有五种IO模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动式IO和异步
    的头像 发表于 11-09 11:12 343次阅读
    一文解读<b class='flag-5'>Linux</b> 5种<b class='flag-5'>IO</b>模型

    华纳云监视Linux磁盘IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

    以下介绍6个监视 Linux 磁盘IO性能的命令(工具),它们分别是iotop、iostat、vmstat、atop、dstat、ioping,以下将附上简单的使用方法。 前言 磁盘IO
    的头像 发表于 10-24 14:43 194次阅读

    亚信电子于IAS 2024展出最新IO-Link主站&amp;设备软件协议解决方案

    亚信电子即将于IAS 2024展示最新的亚信IO-Link主站/设备软件协议、集成亚信IO-Link主站软件协议的AX58400 EtherCAT转
    的头像 发表于 09-18 15:28 309次阅读
    亚信电子于IAS 2024展出最新<b class='flag-5'>IO</b>-Link主站&amp;设备软件协议<b class='flag-5'>栈</b>解决方案

    Linux网络协议的实现

    网络协议是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统中,网络协议(Network Stac
    的头像 发表于 09-10 09:51 330次阅读
    <b class='flag-5'>Linux</b>网络协议<b class='flag-5'>栈</b>的实现

    初识IO-Link及IO-Link设备软件协议

    IO-Link概述什么是IO-LinkIO-Link是一种用于工业自动化领域的数字通信协议,最早由西门子提出,现在已经成为了国际标准,旨在实现工业设备和控制系统之间的连接和通信。它允许传感器、执行器
    的头像 发表于 07-08 16:41 8619次阅读
    初识<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link设备软件协议<b class='flag-5'>栈</b>

    初识IO-Link及IO-Link设备软件协议

    亚信IO-Link设备软件协议是基于亚信电子AXM-IOLS IO-Link设备评估板设计的,搭载意法半导体 STM32F469AI微控制器,并在STM32CubeIDE开发环境中进行开发。此
    的头像 发表于 07-08 13:55 2740次阅读
    初识<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link设备软件协议<b class='flag-5'>栈</b>

    欢创播报 华为宣布鸿蒙内核已超越Linux内核

    1 华为宣布鸿蒙内核已超越Linux内核   6月21日,在华为开发者大会上, HarmonyOS NEXT(鸿蒙NEXT)——真正独立于安卓和iOS的鸿蒙操作
    的头像 发表于 06-27 11:30 858次阅读

    远程IO与分布式IO的区别

    在工业自动化和控制系统设计中,远程IO(Input/Output)和分布式IO是两个重要的概念。它们各自具有独特的特点和优势,适用于不同的应用场景。本文将详细探讨远程IO与分布式
    的头像 发表于 06-15 15:57 2616次阅读

    堆和的区别和使用注意事项

    堆和是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。堆和的区别涉及到内存分配、访问方式、数据存储等方面。在使用堆和时,还需要注意一些细节,以确保程序的正确性和效率。本文将详细
    的头像 发表于 01-18 17:24 2254次阅读

    亚信电子推出全新IO-Link设备软件协议解决方案

    亚信电子提供完整的EtherCAT从站转IO-Link主站网关和IO-Link设备软件协议解决方案,使客户能够将最新的IO-Link智能传感器和执行器等设备,轻松地导入EtherCA
    的头像 发表于 01-17 08:11 577次阅读
    亚信电子推出全新<b class='flag-5'>IO</b>-Link设备软件协议<b class='flag-5'>栈</b>解决方案

    亚信电子推出全新IO-Link设备软件协议解决方案

    亚信电子提供完整的EtherCAT从站转IO-Link主站网关和IO-Link设备软件协议解决方案,使客户能够将最新的IO-Link智能传感器和执行器等设备,轻松地导入EtherCA
    的头像 发表于 01-16 11:24 598次阅读
    亚信电子推出全新<b class='flag-5'>IO</b>-Link设备软件协议<b class='flag-5'>栈</b>解决方案