操作系统

操作系统L3实验笔记

2019-06-09 23:11 CST
2019-06-10 14:29 CST
CC BY-NC 4.0

总共写了4404 - 2647 = 1757行……

  • ./src/vfs.c:虚拟文件系统,283行;
  • ./src/shell.c好看漂亮多功能shell,349行;
  • ./src/file.c:inode文件树相关API,42行(全都是递归挺好写的);
  • ./src/filesystems/naive.c:naiveFAT文件系统,523行(写到疯);
  • ./src/dev/ramdisk/initrd.img:文件系统磁盘镜像。
    • vim``:%!xxb纯手工手写写出来的
    • 内置了3个可读写文件和1个文件链接,包爽

wc-l

naiveFAT

经过和同学吵架数个小时之后,我终于搞懂了为什么不能直接内存访问而是要通过dev->ops来访问数据,所以抄袭借鉴FAT32实现了一个naiveFAT文件系统。

naiveFAT-fs-1

naiveFAT格式的磁盘前16字节是四个int32_t型元素,分别代表:

  • 每个单元(簇)的长度,必须为32;
  • 文件跳转表的起始位置;
  • 数据区的起始位置;
  • 最小可用单元(簇)号。

随后跟跳转表,每个表项均为int32_t,指示下一单元(簇)号。

naiveFAT-fs-2

对于目录类型的数据簇,每个单元(簇)由4个部分组成:

  • 一个int32_t,指示首块数据的单元(簇)号;
  • 两个int16_t,分别代表文件类型和文件权限;
  • 24字符的字符串,代表文件的相对地址。

sHELL

终端中可使用的指令有:

  • help:打印指令列表;
  • ping:输出pong
  • echo:复读机;
  • ls:列举当前目录下的文件;
  • pwd:打印当前目录;
  • cd:切换目录;
  • cat:打印文件;
  • write:向文件内写数据(会覆盖原有数据);
  • append:向文件结尾添加数据;
  • link:建立文件链接;
  • mkdir:创建文件夹;
  • rmdir:删除文件夹(内容必须为空);
  • rm:删除文件(不可删除文件夹)。

系统启动后,共有四个文件系统:

  • /:根目录,使用naivefs,读取初始化内存盘ramdisk0的内容;
    • 映射kernel/dev/ramdisk/initrd.img中的磁盘镜像;
    • initrd.img是用vim手写出来的二进制镜像(酸爽);
    • /root内有a.txtb.txtmain.cpp三个文本文件和指向main.cpp的文件链接main.link
  • /mnt:使用naivefs,对应硬件为ramdisk1,内容为空;
  • /dev:使用devfs,对应各个设备,可读可写;
  • /proc:使用procfs,对应各个进程,只读不可写。

终端支持的特性:

  • 终端所有指令均可使用相对路径或绝对路径:

    shell-1

  • 通过对/dev下的硬件进行直接读写可以进行tty间的通信:

    shell-2

  • /proc下保存进程信息,可通过/proc/self读取本进程信息:

    shell-3

  • writeappend提供两种不同的文件操作,但两种操作最后都会加上换行符:

    shell-4

  • 支持文件链接(硬链接):

    shell-5

  • 对链接的文件进行修改,所有文件信息都会同时更新:

    shell-6

  • 支持简单的错误处理:

    shell-7

  • 支持简单的文件权限检查(如/proc为只读):

    shell-8