OSTEP:35&&36&&37&&44 IO设备

存储设备

评价方法:价格、容量、速度、可靠性

存储介质:磁

磁带–>磁盘

存储介质:坑

光盘Compact Disk

利用坑来阻碍光的反射,有了母片很容易通过 “压盘” 复制产品,但是只读(挖坑容易填坑难,暗示我经常挖坑不填?😢)

存储介质:电

之前的持久存储介质有致命的缺陷

  • 磁:机械部件导致 ms 级延迟
  • 坑 (光): 一旦挖坑,填坑很困难 (CD是只读的)

Flash Memory “闪存”

  • Floating gate 的充电/放电实现 1-bit 信息的存储

image-20231009114124863

速度快,容量越大,速度越快 (电路级并行)

衍生出一系列产品:Compact Flash(CF卡,对就是mp3上的那种)–>USB Flash Disk(U盘)–>Flash-based SSDs(solid-state storage device,固态存储设备)

  • 听说固态最近好像价格回升,我大概五月份买的时候三星,西部数据这样的大厂都便宜的离谱,多是归功于国产ssd技术突破,长江NB

固态硬盘需要克服的问题

一个闪存面被分为闪存块,一个闪存块被分为闪存页,对于读来说正常读一个页,写来说需要将页所在的整个块擦除,这也是我们固态读比写慢的原因

最大问题还是放电 (erase) 做不到 100% 放干净

  • 放电数千/数万次以后,就好像是 “充电” 状态了

解决方案:每一个 SSD 里都藏了一个完整的计算机系统

image-20231009121357473

FTL: Flash Translation Layer

维护这逻辑块到物理块的一张映射表: 对于逻辑块的读写转化为物理块的写,当发现这个物理块被读写的次数对于大多数物理块时,将逻辑块重新映射到一个读写次数相对少的物理块,从而维持一种平衡叫做Wear Leveling

安全问题

FTL也就可以提供一种逻辑上的快速清除,实际上物理块没有被清除(冠希哥被动躺枪),清除后用垃圾数据覆盖或许可以避免悲剧😂

I/O设备

I/O 设备 (CPU 视角):“一个能与 CPU 交换数据的接口/控制器”

image-20231009132407402

通过接口来为上层提供服务,操作系统不需要关心设备internals以及内部怎么实现,只要按照设备手册通过接口来交流即可(给寄存器一个值,设备做出相应反应)

  • CPU 可以直接使用指令 (in/out/MMIO) 和设备交换数据(MMIO(memory-mapped I/O)用内存映射的方式通过内存地址和设备交互)

总线

为了支持越来越多的io设备(可拓展性)CPU上出现了总线:一个特殊的 I/O 设备

  • 把收到的地址 (总线地址) 和数据转发到相应的设备上
  • 总线上可以接dram,甚至可以给总线上接的设备进行内存编制,统一按照内存地址来操作设备,其他设备pci也可以连接到总线,如usb总线

为了提高cpu效率,当设备完成了自身操作,会主动抛出一个硬件中断,在此期间cpu可以执行其他进程(如果设备非常快,中断可能不如轮询)

DMA

向磁盘写一些数据,cpu需要将数据从内存拷贝到磁盘,磁盘 I/O执行完,cpu才能切走到其他工作,为了提高效率把简单的拷贝工作交给DMA

操作系统会通过编程告诉 DMA 引擎数据在内存的位置,要拷贝的大小以及要拷贝到哪个设备。

Direct Memory Access (DMA):一个专门执行 “memcpy” 程序的 CPU(用于I/O设备和系统内存直接的批量数据传送)

很容易可以联系到GPU,nvidia yes!

设备驱动程序

操作系统不应该把io设备的寄存器接口暴露给用户取操作,这是不合理且危险的,比如大多数普通用户操作不好打印机寄存器接口造成经济损失

linux把设备抽象成文件,linux驱动程序会把重新定义一些文件操作相关函数,驱动程序把系统调用 (read/write/ioctl/…) “翻译” 成与设备寄存器的交互,完成复杂的功能