【Linux初阶】基础IO - 磁盘 文件系统

news2024/11/18 21:25:24

🌟hello,各位读者大大们你们好呀🌟
🍭🍭系列专栏:【Linux初阶】
✒️✒️本篇内容:认识磁盘(物理结构、储存结构、逻辑结构、读取单位),理解文件系统(分治思想、理解文件系统结构、查找读取新建删除文件的底层逻辑)
🚢🚢作者简介:计算机海洋的新进船长一枚,请多多指教( •̀֊•́ ) ̖́-


文章目录

  • 一、没有被打开的文件如何被管理?
  • 二、认识磁盘
    • 1.磁盘的物理结构
    • 2.磁盘的存储结构
      • (1)认识盘片的结构
      • (2)在单面上定位扇区
      • (3)在磁盘中定位扇区
    • 3.磁盘的逻辑结构
      • (1)将磁盘抽象成线性结构
      • (2)如何找到一个扇区?
      • (3)如何用CHS定位法定位一个扇区?
      • (4)为什么要让 OS进行逻辑抽象呢?
  • 三、磁盘的实际读取单位
    • 1.文件系统以 4KB为单位读取扇区
    • 2.页框 & 页帧
  • 四、理解文件系统
    • 1.分治思想
    • 2.文件系统初识
      • (1)Block Group
      • (2)超级块(Super Block)
      • (3) inode节点表(inode table)
      • (4)inode位图 & 块位图
      • (5)块组描述表(Group Descriptor Table)
    • 3.如何查找、读取一个文件?
    • 4.如何删除一个文件?
    • 5.为什么文件读写需要对应的权限?
  • 结语


一、没有被打开的文件如何被管理?

之前我们学习了被打开的文件是被操作系统内部的 files_struct结构体管理起来的,那么问题来了,没有被打开的文件要不要被管理呢?答案是要的!

没有被打开的文件存储于 磁盘 中,磁盘上面有大量的文件,磁盘上面的文件会被 文件系统 静态管理起来,方便我们随时打开。

二、认识磁盘

1.磁盘的物理结构

  1. 我们目前很少见得到磁盘了,这里的磁盘指的是机械磁盘。我们的笔记本大多使用硬盘存储。
  2. 磁盘和硬盘(ssd)都属于计算机物理存储结构,硬盘的造假更高,但是体积较小。
  3. 对于计算机来说,磁盘是唯一的一个机械结构。
  4. 硬盘 + 外设 = 硬盘访问会很慢(相对来说,机械运行得再快也快不过电信号)。
  5. 在企业端,磁盘依旧是主流(由于经济效益更好、存储容量大、没有读写次数的限制)。

在这里插入图片描述

常识补充1

  • 磁盘正常情况下是不可以拆卸的,一旦磁盘进入灰尘立马就会报废了!
  • 磁头和盘面是没有接触的。由于磁头和盘面距离十分的接近,磁盘必须要防止抖动,因为盘片会被刮花而导致出现存储问题。企业的磁盘都是静态放置于机房的,所以符合磁盘的运行条件。
  • 因为磁盘是慢设备,因此需要操作系统根据磁盘做相应得优化。

常识补充2

磁盘为什么叫磁盘,因为它得盘片上充满了各种磁化得单元,通过对磁化单元的充磁、退磁转化完成二进制数据的存储。

企业的磁盘损坏之后,企业会对磁盘进行消除数据(多次),大型企业会定制磁盘,让厂商提供磁盘深度清除接口,保证数据安全。

———— 我是一条知识分割线 ————

2.磁盘的存储结构

磁盘的盘片我们外观上是光滑的,但是微观上并不是!

(1)认识盘片的结构

接下来让我们一起来认识一下盘片的结构:

一个盘片有两面,盘面上拥有一圈一圈的同心圆,我们称之为 磁道。以下图为例,一共有 7个同心圆,因此该盘片的这一面就有 7个磁道。

在这里插入图片描述

磁盘寻址的时候,基本单位不是 bit,也不是 byte。一般而言,我们磁盘寻址的基本单位为 扇区,一个扇区有 512byte

以盘面圆心向外延申,我们将一个磁道切分为若干个扇形区域,这个区域我们称它为 扇区。我们可以通过上图中的绿色区域进行理解。

虽然圆心从内而外的扇区周长或者说大小不一样,但是它们的存储空间是一样的,都是 512byte。

———— 我是一条知识分割线 ————

(2)在单面上定位扇区

在单面上,我们怎么定位一个扇区呢?

我么通过定位磁道,再找到对应的扇区。具体行为:磁头通过来回摆动确认是在哪一个磁道(磁头是横向摆动的),再通过盘片旋转的相对运动来定位扇区(转速非常快)。

这也就是为什么磁盘在运行时需要磁头来回摆动、盘片高速旋转的原因。

上面我们学习了磁盘的单面结构,实际上,我们磁盘是多盘多面的复式结构。
在这里插入图片描述

我们将各个盘面,同半径的圆上下视为一个整体,这就是 柱面。具体可通过上图理解。

磁头数 = 盘面数,磁头是共进退的,所有磁头的移动方向是一致的。在同一时间段内,磁头可以在同一柱面上的所有磁道进行查找。

———— 我是一条知识分割线 ————

(3)在磁盘中定位扇区

如何在立体结构的磁盘中,定位一个扇区呢?

对于立体的磁盘结构来说,定位一个扇区,需要:先定位磁道(柱面),再定位磁头(定位盘面),最后再定位扇区

磁道(track),柱面(cylinder),磁头(head),扇区(sector)

磁盘中定位任何一个扇区的,采用的硬件基本方法为:CHS定位法!(cylinder - head - sector)

以此类推,我们就得出了定位任意多个扇区的方法。

———— 我是一条知识分割线 ————

3.磁盘的逻辑结构

(1)将磁盘抽象成线性结构

不知到大家小时候有没有听过磁带,我们的磁带在新买回来的时候是卷好的(圆形的),但是我们将它们抽出来后,我们发现其实它是一个线性结构。

在这里插入图片描述

我们的磁盘实际上和磁带的物理结构是类似的,因此,我们也可以将磁盘盘面逻辑想象成一个线性结构,来帮助我们理解磁盘的逻辑结构。

磁盘物理上是圆形的,我们可以将磁盘抽象成线性结构。

为了方便后续学习,我们假设我们的磁盘有两个盘,四个面,共500G存储空间,且有 3个柱面。
在这里插入图片描述

盘面中有柱面(一个个磁道),根据条件,得出有三个柱面。每个柱面中又包含一个个扇区。当我们将扇区进行统一的编号,我们就可以以扇区作为最小单位,将整个磁盘从逻辑上看作成为一个 sector arr[n];

就此,我们就可以将对磁盘做管理,转变成对数组做管理

———— 我是一条知识分割线 ————

(2)如何找到一个扇区?

所以,我们要怎么找到一个扇区呢?

很简单,只要找到这个扇区的 下标 ,就算定位了一个扇区。 在操作系统内部,我们称这个下标为 LBA地址。

(3)如何用CHS定位法定位一个扇区?

之前我们不是说定位扇区需要使用 CHS定位法吗?这个又怎么体现呢?

下面我再举一个例子帮助大家理解:假设有 4个盘面,每面有 10个磁道,每个磁道有 100个扇区:

在这里插入图片描述

我们首先可以判断出来:总容量、下标范围、每一面有多少个扇区。

我们以查找 123号扇区的磁盘位置为例,讲述CHS定位法:

  • 通过 下标 / 每面扇区数(123/1000=0),确定该扇区在 0号盘面【C】;
  • 通过 下标 / 每个磁道的扇区数(123/100=1),确定该扇区在 0号盘面的 1号磁道【H】;
  • 通过 下标 % 每个磁道的扇区数(123%100=23),确定该扇区在 0号盘面的 1号磁道的 23号扇区【S】;

(4)为什么要让 OS进行逻辑抽象呢?

  1. 便于管理。
  2. 不想让 OS的代码和硬件强耦合。在硬件底层发生变化时,并不会影响操作系统。

三、磁盘的实际读取单位

1.文件系统以 4KB为单位读取扇区

虽然磁盘对应的访问的基本单位为 512字节,但依旧很小!因此,OS内的文件系统会定制的进行多个扇区的读取 -> 以 1KB,2KB,4KB(使用最广泛,KB-千字节)为基本单位。哪怕你只修改了 1bit的数据,也必须 将 4KB load到内存,进行读取或修改,如果必要,再写回内存。

为什么 4KB为基本单位,使用最广泛呢?

局部性原理:当我们的计算机去访问某些数据时,它附近的数据也有非常大的数据被访问到。

  • 科学家们在理论上证明了:计算机在加载某些数据时,多加载一些,会有助于提升计算机的效率。
  • 同时,由于局部性原理的存在,在一定范围内多加载一些数据,在一定程度上会提升计算机的命中效率,减少我们 IO次数或者说时间。
  • 通过实践,发现以 4KB为基本单位的性能最好,因此它被广泛使用开来。

【总结】所以从本质上来说,这种行为属于:1.数据预加载; 2.以空间换时间。

2.页框 & 页帧

我们的内存实际上被划分成为了一个个 4KB大小的空间,这些空间我们称之为 页框

磁盘中的文件尤其是可执行文件 - 它们都是按照 4KB跨分好的块,这些块我们称之为 页帧

【总结】数据 IO的过程,实际上就是将磁盘数据转变成页框的过程,这是文件系统和内存管理之间的融合,它们都是以 4KB大小为单位的。


四、理解文件系统

1.分治思想

一个磁盘的存储容量是很大的,因此我们可以通过将整体切分成小块(分区、分组)进行管理,通过对多个小块的管理,最终实现对整体的管理,这种思想我们称之为 分治思想

在这里插入图片描述

不同文件的分组大小不一样,5G只是一个例子,是我随便写的

在这里插入图片描述

以 5G为例,对该部分的存储结构进行剖析。

在这里插入图片描述

———— 我是一条知识分割线 ————

2.文件系统初识

分区之后会格式化写入,格式化的本质就是 写入文件系统

我们以 Linux ext2文件系统为例进行讲解,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。

(1)Block Group

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

为了方便讲解,下文中我会将 Block Group简称为 分组

在这里插入图片描述

(2)超级块(Super Block)

我们对 Block Group的内部结构再做进一步的拆分:

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

超级块对于一个分组来说不是必须的,但是它的多存在,可以让文件系统实现备份。假如有一天我们常用的 Super Block出现了问题,没关系,我们只需要将其他组的 Super Block拷贝过来即可,这样就避免了出现故障时数据的大规模丢失。

常见的场景有:文件打开故障,计算机询问你是否进行恢复,底层问题可能就是文件的某些分组的字段出现了问题被文件系统查到了,因此文件系统将其他分组的 Super Block进行了拷贝,最终完成了对文件的恢复。

———— 我是一条知识分割线 ————

(3) inode节点表(inode table)

在这里插入图片描述

文件 = 内容 + 属性,Linux的文件内容和文件属性是分批储存的,其中存储文件属性的单元我们称之为 inode

inode的大小是固定的,每个文件都有一个 inode,它存储了一个文件几乎所有的文件属性,但是文件名不包括。inode存放文件属性 如 文件大小,所有者,最近修改时间等。

文件内容被保存在 Data blocks(数据区)中,它的大小随着应用类型的变化而变化。

总结:inode大小不可变,Data blocks大小可变。

我们知道,每个文件(打开+未打开)都有自己的 inode,为了彼此区分,每个 inode都有自己的 ID。

ls -li	#查看文件ID指令
  • inode table:保存了分组内部所有可用的(已经使用的+没有使用)inode,包括 inode内部的属性信息。
  • Data block(数据块):保存的是分组内部所有文件的数据块,一个文件的内容会被放在其中1个或n个块中。我们可以视分组内所有数据块为一个数据区。

总结:inode table保存文件的 inode,inode保存文件属性,Data block(数据块)保存文件内容。

inode table内保存的 inode数量是有限的,因此在我们创建一个新文件之前,我们需要在 inode table中找一个没有被使用的 inode,然后将我们新文件的属性填充到这个 inode中.

同理,我们新创建的文件,需要将数据填充到还没有被使用的数据块中。

至此,一个文件的内容和属性都被写入进磁盘中。

总结:新创建的文件需要申请还没有被使用的 inode和数据块。

———— 我是一条知识分割线 ————

(4)inode位图 & 块位图

在这里插入图片描述

根据上面的讲述,我们推断出,在创建文件之前我们需要一个功能,那就是查找。我们需要知道哪些 inode被使用,哪些没有被使用,数据块也如此。文件系统通过 inode位图和块位图(Block Bitmap)帮我们解决了这个问题。

  • inode位图(inode Bitmap):inode对应的位图结构,用每个bit表示一个inode是否空闲可用。

举一个简单的例子理解位图,0000 1001,表示某个inode已经被占用,当位图变为 0000 0001,说明该inode被释放了,当前没有被占用,其中我们只用了一个比特位就对该 inode进行了标识。

总结:位图中的比特位位置和 文件的inode位置是一一对应的。

  • 块位图(Block Bitmap):数据块对应的位图结构,Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

总结:位图中的比特位位置和 Data block(数据块)的位置是一一对应的。

新文件创建时,在计算机知道文件大小等属性信息后,会给文件申请足够大小的块用于放置我们的文件信息。

(5)块组描述表(Group Descriptor Table)

  • GDT,Group Descriptor Table:块组描述表,描述块组宏观属性信息,有兴趣的朋友可以在了解一下,这里不深入。

———— 我是一条知识分割线 ————

3.如何查找、读取一个文件?

  • 如何查找某一个文件呢?

查找一个文件的时候,我们统一使用的是 inode编号(ID)

inode可以跨组,不可跨分区,在一个分区中,inode的编号是统一编篡的,比如说前面分组的 inode的起始编号是1000,后面的某个分组的 inode起始编号是 10000。

  • 在读取文件的的时候,如何确定文件数据块的位置呢?

我们直接上图理解:

在这里插入图片描述

inode中存有 block有关的数组,数组对应指向不同的数据块,通过对不同数组数据的读取,就得到了不同的数据块的位置(通常获取的是起始和结束数据块),再通过数据块的组合,就知道了该文件所有的数据块位置。

这种一个数组单位只指向一个数据块的方式,实际上储存的数据块信息有限,因此从12号下标位置开始,指向的就不是普通的数据块,而是保存有其他数据块的地址(block id)。

如果还担心不够,13号、14号下标中存的是 block id的二级、三级索引,也就是它们指向的数据块也是保存其他数据块地址的数据块。就此,实现了很大的地址存储空间结构。

总结:创建文件,在位图中将对应的比特位由 0置1,根据比特位对应的文件位置,找到对应的 inode table,将文件属性填充到文件自己的 inode中,再将对应的文件数据填充到Data block(数据块)中, 建立 inode table与Data block(数据块)之间的映射关系,建立成功后返回对应的 inode编号,至此文件创建成功。

查找读取文件时,直接根据 inode编号找到inode table,再根据inode table与数据块之间的映射关系,这样文件的属性和数据就全有了。

———— 我是一条知识分割线 ————

4.如何删除一个文件?

  • 如何删除一个文件?

找到文件在 inode位图(inode Bitmap)上的比特位,将 1置0,这个文件就被删除了。这个行为意味着,被删除文件中的 inode属性无效了,一旦inode无效,它内部与数据块之间的映射也就无效了。当然,数据块在文件删除过后也是需要被清理掉的,但是什么时候清理由文件系统说了算。

总结:删除一个文件就是将inode位图(inode Bitmap)上的比特位由 1置 0.

这就是,我们在计算机删除一个文件,却可以在回收站找到并恢复的原因。

文件恢复的本质:将被删除文件的 inode位图(inode Bitmap)上的比特位由 0置 1.

当我们不小心删除了一个重要文件,在我们不懂得如何修复的情况下,最好什么都不要做。因为你一旦对计算机做了某些操作,新建了某些文件,就有可能导致被删除文件的 inode被新文件启用,数据块被新文件覆盖,最终导致无法恢复。

Linux下,文件的删除信息会保存在日志中。所以Linux被删除的文件也可以被恢复,但通常都要配合相关工具才能完成。

  • 那为什么我们用的是文件名删除呢?

你不是叫我用 inode吗,我什么在我们Linux操作系统下都是用文件名删除的呢?

任何一个文件都是在某一个目录里面的,而目录也是一个文件!因此,目录也会有自己的文件属性和数据,属性存储于 inode,而数据块中放的就是该目录下所有文件的文件名各自inode的映射关系

在同一个目录下不能存在同名文件,因此,操作系统就可以根据文件独有的文件名 缩映到对应文件的 inode了!有了 inode,我们之前提及的文件的增删查改就全部成立了。

5.为什么文件读写需要对应的权限?

  • 为什么在目录下新增文件需要写入权限呢?

这是因为,新增文件时,需要向当前目录的内容部分写入文件名 和 对应inode的映射关系的!因此必须要有写入权限。

  • 罗列文件名为什么需要读权限呢?

这是因为,我们必须根据目录 inode,访问目录对应的数据块,才能找到对应的文件属性。


结语

🌹🌹 【Linux初阶】基础IO - 磁盘 & 文件系统的知识大概就讲到这里啦,博主后续会继续更新更多C++ 和 Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

会声会影2023最新免费版零基础上手视频剪辑工具

比如会声会影视频编辑软件,既加入光影、动态特效的滤镜效果,也提供了与色彩调整相关的LUT配置文件滤镜,可选择性大,运用起来更显灵活。会声会影在用户的陪伴下走过20余载,经过上百个版本的优化迭代,已将操作…

【消息队列RabbitMQ】一、RabbitMQ认识

这里写目录标题 RabbitMQSpringboot整合RabbitMQRabbitMQ的常见开发模式如何保证消息的可靠生产和可靠投递什么是死值队列和延迟队列 RabbitMQ 消息队列有: 1、ActiveMQ 2、RabbitMQ 3、ZeroMQ 4、Kafka 什么是RabbitMQ? RabbitMQ是一个开源的消息队列服…

第23章:范式

一、范式 1.什么是范式 关于数据表设计的基本原则,规则就是范式NF。 2.范式都包括哪些? 第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF - Boyce…

两台电脑如何共享文件?6步快速完成!

电脑之间共享文件已经成为日常工作中不可或缺的一部分。无论是在家庭环境中与家人共享照片和视频,还是在办公室中与同事共享文档和数据,了解两台电脑如何共享文件是非常重要的。 但在实际操作中,如何更好的使两台电脑共享文件,也…

多层感知机(MLP)算法原理和代码实现

文章目录 多层感知机入门算法优化原理sklearn代码实现核心优缺点分析 多层感知机入门 神经网络在最近几年,是个很火的名词了。常听到的卷积神经网络(CNN)或者循环神经网络(RNN),都可以看做是神经网络在特定场景下的具体应用方式。 本文我们…

干货 | 智能网联汽车大数据基础平台构建研究

以下内容整理自大数据能力提升项目必修课《大数据系统基础》同学们的期末答辩汇报。 各位老师大家上午好,我们组的题目是智能网联汽车大数据基础平台的构建。我们的指导企业是西部智联。我们的汇报将从这五个方面进行展开,第一个方面是项目背景与需求分析…

uni-app基础知识

发展 DCloud于2012年开始研发小程序技术,优化webview的功能和性能,并加入W3C和HTML5中国产业联盟。 2015年,DCloud正式商用了自己的小程序,产品名为“流应用”,它不是B/S模式的轻应用,而是能接近原生功能…

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库 一、背景二、技术路线三、配置四、从mysql同步数据到Elasticsearch和PostgreSQL数据库五、总结 一、背景 基于 Debezium 的端到端数据流用例,将数据流式传…

I/O 多路复用小结

Socket 模型 Socket 编程是一种使用 Socket 模型进行网络通信的编程技术。它是一种基于网络套接字的编程模型,用于实现不同计算机之间的数据传输。 事实上,在进行网络通信前,通信双方都要创建一个 Socket,双方的数据读写都要依赖于…

【Python】执行SQL报错

可以再数据库查询界面执行的SQL,一直报错 unsupported format character Y (0x59) at index 61 SQL如下: datapd.read_sql_query(sql"""selectdate_format(create_time,%Y-%m) as mon,count(distinct order_id) as ord_cntfrom prod.o…

HTTP与HTTPS

HTTP与HTTPS介绍 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息&…

qt源码--事件系统

qt的事件传播主要依赖于QCoreApplication、QAbstractEventDispatcher(会根据不同的平台生成各自的处理对象)、QEvent(各种事件类型)等。 首先看下QCoreApplication的实现: 2、了解QCoreApplication的构造函数 其构造函…

在最新ICP备案域名的基础上,结合其他网络营销手段,打造强大的品牌推广效果

API接口是一种软件系统之间进行交互的方式,通过API接口,可以在不同的系统之间传递数据、命令等信息。在网络营销中,API接口可以帮助我们更加高效地进行品牌推广。本文将以在最新ICP备案域名的基础上,结合其他网络营销手段&#xf…

JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

1.标记-清除算法 最基础的算法,分为两个阶段,“标记”和“清除” 原理: - 标记阶段:collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中&am…

vue-router 4.0 动态路由会跳转到 404 页面的问题

引子 开发过前端单页面应用的小伙伴们,应该对前端路由都不陌生吧。 无论是用 vue 或者 react,都有官方提供的 router 方案。 但是有些场景下,处于安全性和友好性考虑,我们需要用到动态路由。 如果你不知道什么叫动态路由&…

翻遍整个牛客网,整理出了全网最全的Java面试八股文大合集,整整4000多页

大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多,Java 岗位的招聘薪酬天差地别,人才要求也是五花八门。而很多 Java 工程师求职过程中,也是冷暖自知。很多时候技术有,但是面试的时候就是过不了! 为了帮…

4.7 x64dbg 应用层的钩子扫描

所谓的应用层钩子(Application-level hooks)是一种编程技术,它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互,系统事件,或者其他应用程序内部的事件。应用层钩子是在应用…

【Zabbix 监控 Windows 系统,Java应用,SNMP】

目录 一、Zabbix 监控 Windows 系统1、下载 Windows 客户端 Zabbix agent 22、安装客户端,配置3、在服务端 Web 页面添加主机,关联模板 二、Zabbix 监控 java 应用1、客户端开启 java jmxremote 远程监控功能1、配置 java jmxremote 远程监控功能2、启动…

【ARM Coresight 系列文章 3.1 - ARM Coresight DP 对 AP 的访问 2】

文章目录 图 1-1 如上图1-1 所示,DAP上可以集成多个MEM-AP,上图是集成了3个MEM-AP,它们可能是AXI-AP, AHB-AP, APB-AP。 那么AP的类型是如何区分的呢? 不同的组件会使用不同MEM-AP接口,如Cortex-A/Coretex-R 系列的c…

ai绘画工具有哪些?这几款好用的ai绘画工具免费分享给你

上周,我去了一家现代艺术画廊,墙上挂满了令人叹为观止的绘画作品。我被其中一幅细腻而充满情感的油画所深深吸引,想要了解背后的创作过程。这时,一位热情的艺术导师走到我身边。她微笑着说:“这幅作品实际上是由ai绘画…