oscourse-tsinghua / rcore_plus

Rust version of THU uCore OS. Linux compatible.
MIT License
172 stars 26 forks source link

rCore Loadable Kernel Module: [Breaking!!] MountFS. #58

Closed gjz010 closed 5 years ago

gjz010 commented 5 years ago

Refactored entire path-resolution system into a more Linux one: relative-based path resolution. Added basic support for mounting. Now ramfs module should work. This commit breaks these things:

  1. The commit requires https://github.com/rcore-os/rcore-fs/pull/6 to compile.
  2. /dev/fb support breaks. (No absolute path on mmap)
  3. /proc/self/exec breaks. (Absolute path is bad on open)
  4. Shared library breaks. (No absolute path for program) Fixed. Standalone version: #59
  5. Some of filesystem syscalls don't handle AT_FDCWD well. (Impl bug)
gjz010 commented 5 years ago

(关于break掉的东西的一些讨论)

  1. /dev/fb, device driver and device file (我自己觉得这里是个大问题,这关系到Device Driver的接口的设计) 到现在为止,mmap的操作都是通过直接或者间接调用read_at实现的(例如INodeForMap) 但是这一点对于一些文件,例如设备文件是不成立的: 例如Linux的Userspace I/O,对它的read()操作会阻塞等待一个设备中断,并且返回4字节的至今为止的中断数;而其mmap操作则是将设备对应的Memory-mapped IO映射到用户态(甚至offset的含义都发生了变化,offset被用于指代“设备所提供的内存IO的编号”而非“内存偏移”)。 这意味着,假如我们不使用"/dev/fb"这种硬编码的话,我们必须为设备驱动一套接口,使得其能自行定义各种文件操作(例如分别定义read和mmap,对应于Linux下的struct file_operations) 而(我自己觉得,不一定正确)现在的硬件驱动框架好像存在一些小问题: 1.1. 设备的探测(probing)和驱动加载同时完成,而且没有严格区分设备和设备驱动。感觉需要一定重构才能实现“操作系统启动后再加载设备驱动”的功能。 1.2. Driver/Device继承关系有点乱:BlockDriver可以架在任何Driver上,impl BlockDevice for ide::IDEimpl BlockDevice for EmmcDriver之类驱动和文件系统耦合过强,impl BlockDevice for BlockDriver应该是足够的,但是会掉进Arc陷阱(Arc对应的是一个双重Arc的Device) 1.3. TODO...

关于设备文件我能想到的重构方案有两种:(模仿Linux)基于File进行改造和(模仿现有的Stdin Stdout Vga等伪INode)基于INode进行改造 基于File的改造模仿Linux的file_operations,允许驱动注册设备文件,并劫持对于设备文件的所有操作。(我的代码仓库的现有的dev分支里已经实现了这种机制,并且提供了一个serial驱动作为样例。)缺点是使本来就混乱的FileLike更加混乱:文件和驱动共用File,只有套接字占用Socket,给进一步重构带来困难。 基于INode的改造则是模仿现有的Pipe、Vga等设备用INode,允许驱动注册一类INode并且对其进行操作。缺点是INode的操作和File的操作并不一定重合,编写不小心可能会再次导致“把mmap直接落到read_at上”之类问题。

  1. /proc/self/exec 我们需要一个更真实的procfs?或者至少把/proc/self/exec实现掉 (/proc文件系统非常不posix,里面的符号链接全是魔法,这要求给文件系统提供“劫持解析符号链接”的接口)
  2. Shared library 标准操作是内核同时load两个东西然后用aux vector告诉ldso主程序在哪,我改改试试
  3. sfs device file support sfs没有设置rdev的接口(INode的set_metadata勉强算这个接口,但是sfs没有实现) 另外现在的sfs看起来是想维护一个“sfs里所有的设备文件的表”?(感觉这是没必要的)
Harry-Chen commented 5 years ago

Seems thinpad board support is broken. However, I do not deem it a regression.