OS:lab5课下基础
OS:lab5课下基础 1. 文件系统概述 计算机文件系统是一种存储和组织数据的方法,便于访问和查找数据。文件系统使用文件和树形目录的逻辑抽象屏蔽了底层硬盘和光盘等物理设备基于数据块进行存储和访问的复杂性。 即用户不必关心数据实际保存在硬盘/光盘的哪个数据块上,而只需要记住这个文件所属的目录和文件名。 在写入新数据之前,用户不必关心硬盘上哪个块是空闲的,硬盘上的存储空间管理(分配/释放)由文件系统自动完成,用户只需记住数据写入到了哪个文件 常见的文件系统通常基于硬盘和光盘等块存储设备,并维护文件在设备中的物理位置。 广义上,一切带标识的、在逻辑上有完整意义的字节序列都可以称为文件,文件系统将外部设备中的资源抽象为文件,从而可以统一管理外部设备,实现对数据的存储、组织、访问和修改。 2. 文件系统的设计与实现 MOS是一种微内核设计 将传统操作系统的文件系统移出内核 将一些内核数据暴露到用户空间 将传统操作系统的设备驱动移出内核 3. IDE磁盘驱动 为了在磁盘等外部设备上实现文件系统,我们必须为这些外部设备编写驱动程序。(MOS已经在kern/mechine.c中实现了一个简单的控制台驱动程序) 本次要实现的硬盘驱动程序与已经实现的串口驱动都采用MMIO内存映射技术,并且本次编写的硬盘驱动程序完全运行在用户空间(微内核)。 3.1 内存映射I/O(MMIO) 几乎每一种外设都是通过读写设备上的寄存器来进行数据通信,外设寄存器也称为I/O接口,主要用来访问I/O设备。 外设寄存器主要包括控制寄存器、状态寄存器、数据寄存器,这些寄存器被映射到指定的物理地址空间 在MIPS的内核地址空间中(kseg0/kseg1)实现了硬件级别(高位清0)的物理地址和内核虚拟地址的转换机制,其中,对于kseg1段地址的读写不经过MMU映射,且不使用高速缓存,这正是外部设备驱动所需要的。我们可以通过简单地读写某些固定的内核虚拟地址来实现驱动程序的功能。 在之前的实验中,我们曾经使用KADDR宏将一个物理地址转换为kseg0段的虚拟地址,即加上kseg0段的偏移量(0x8000_0000) 在编写设备驱动时,我们需要将物理地址转换为kseg1段的内核虚拟地址,即给物理地址加上kseg1的偏移值0xA000_0000 以已经编写完成的串口设备驱动为例,MALTA提供的console设备基地址为0x1800_03F8,设备寄存器映射如表所示 例如写操作:通过向kseg1段的地址写入字符,就能在shell中看到对应的输出。 kseg0_offset + device_op_addr_base = KSEG1 + MALTA_SERIAL_DATA 1 2 3 4 5 //写 void printcharc(char ch) { //... *((volatile uint8_t *)(KSEG1 + MALTA_SERIAL_DATA)) = ch; } 在本次实验中,我们需要编写的IDE磁盘驱动位于用户空间,用户态进程若是直接读写内核虚拟地址会引发一个地址错误ADEL/S,故对于设备的读写必须通过系统调用实现 ...