- kernel側のsyscallを書き換える
- user側はあとで考える
- kernel側はsyscallに対応したinterfaceを作成する
- syscall entryで個別にインスタンスを作成するか、呼び出すか
# CbCXv6の実装Todo
- generate_stubの修正
- KernelのContext
- Readsyscall周りの再実装
- User側のAPI callをオブジェクト指向的にする
# そこまで優先度たかくない
- Interfaceの積を取れるようにする
- usbドライバの作成
- (Interfaceの多重実装)
# generate_stubの修正
いまのところinterfaceで定義したCodeGearを実装しているうちは正常
- Interfaceで定義していない(Implで独自定義したCodeGearの場合)は上手くgoto metaが変換されない
- generate_stubは
#interface
を見ているので、正常に生成される
# Read
-
PipeReadなどを個別のAPI化する- これではなくてFile Interfaceを実装していく
# File Interface
- kernel内部で利用している
struct file
に着目する- fileは必ず
read
,write
,close
,seek
ができる- これはunixの想定と同じ
- fileは必ず
- xv6では
struct file
はNONE
,Pipe
,INODE
の3種類に分類される - その為、
struct file
をInterface化し、none
などで実装をする
# image
# Interface
|
|
- 👆がFile Interface
- 既存のfile構造体に、API(=CodeGear)で利用する引数を設定している
# Impl
- pipeやnoneなどで実装する
|
|
- 👆のような雰囲気の構造体を作成すれば良い
# コンストラクタ
sys_open
やsys_read
の中で、対象のファイルがなんであるかでインスタンスを切り替える- system call以外のAPIを生やすのも可能ではある(user側との橋渡し)
# 図にした
@startuml
interface File { ..DataGear.. +union Data* file +union Data* impl ..CodeGear.. __code read() __code write() }
File <|– Inode
class Inode { ..DataGear.. TBD ..CodeGear.. __code readInode() __code writeInode() }
File <|– Pipe
class Pipe { ..DataGear.. TBD ..CodeGear.. __code readPipe() __code writePipe() }
File <|– None
class None { ..DataGear.. TBD ..CodeGear.. __code readNone() __code writeNone() }
@enduml