---
# System prepended metadata

title: 9Pをxv6に実装する

---

# 9Pをxv6に実装する
tcpの実装が無事？終わったので，次は9Pをxv6に実装し，ネットワーク透過なファイルシステムを実装する．

## 目標
- 9Pファイルシステムをxv6に実装して，ネットワーク透過なファイルシステムを実装すること

## 目標達成までにやること
- [x] 9pプロトコルのパケットを集める
- [x] xv6に9Pを埋め込む設計を考える
- [x] 9Pプロトコルの実装
- [x] 9Pサーバの実装(ファイルシステムとの連携をいろいろとするところ)
- [ ] 9Pクライアントの実装
- [ ] ファイルシステムと9Pの結合
  - [ ] マウント

## 9Pまとめ
- 参考
  - [Writing a 9P server from scratch](https://blog.aqwari.net/9p/)
  - [Plan9 Manual](http://man.cat-v.org/plan_9/)
  - [9P Manual](http://man.cat-v.org/plan_9/5/)
  - [Plan9 github](https://github.com/brho/plan9)
	- [gop9 github](https://github.com/knusbaum/go9p/blob/master)
    - 実装が参考になる
  - [plan9 overview](https://9p.io/plan9/about.html)

### 9P intro
- [9Pのintro](http://man.cat-v.org/plan_9/5)を読めばなんとなく9Pの外観がわかる
    - 細かいところは、メッセージごとに個別のマニュアルがあるため、それを読み込めば良い気がする
- 9Pプロトコルにはサーバとクライアントが存在する
- サーバはクライアントからのファイル操作に関する要求のレスポンスを返す
- 複数のクライアントと同じコネクションを共有できる
- bindシステムコールでサーバのファイルを名前空間に割り当てる
- null文字は使えない
- [plan9port](https://9fans.github.io/plan9port/)というプロジェクトが、Plan9内のプログラムをLinuxにportしたもので参考になる

### 9P Messages
- 9Pのメッセージはメッセージの長さを表すサイズから始まる
- `T-message`
  - クライアントからの要求メッセージ
- `R-message`
  - サーバからの応答メッセージ
- `fid`
    - T-messageではfidを付加する
    - fidはファイルを指定するfdみたいなもの

#### Version
バージョンのネゴシエーションを行う．メッセージの最大サイズを通知する．
```
size[4] Tversion tag[2] msize[4] version[s]
size[4] Rversion tag[2] msize[4] version[s]
```

#### Auth
```
size[4] Tauth tag[2] afid[4] uname[s] aname[s]
size[4] Rauth tag[2] aqid[13]
```

#### Attach
ルートディレクトリをアタッチし，fidと結びつける．
```
size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s]
size[4] Rattach tag[2] qid[13]
```

#### Error
```
size[4] Rerror tag[2] ename[s]
```

#### Flush
```
size[4] Tflush tag[2] oldtag[2]
size[4] Rflush tag[2]
```

#### Walk
新しいfidを割り当てる．
```
size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s])
size[4] Rwalk tag[2] nwqid[2] nwqid*(wqid[13])
```

#### Open
```
size[4] Topen tag[2] fid[4] mode[1]
size[4] Ropen tag[2] qid[13] iounit[4]
```

#### Create
```
size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1]
size[4] Rcreate tag[2] qid[13] iounit[4]
```

#### Read
```
size[4] Tread tag[2] fid[4] offset[8] count[4]
size[4] Rread tag[2] count[4] data[count]
```

#### Write
```
size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count]
size[4] Rwrite tag[2] count[4]
```

#### Clunk
サーバに指定したfidがもう使われていないことを通知する．ORCLOSEでfidが開かれていない限り，実際のファイルは消去されない．
```
size[4] Tclunk tag[2] fid[4]
size[4] Rclunk tag[2]
```

#### Remove
```
size[4] Tremove tag[2] fid[4]
size[4] Rremove tag[2]
```

#### Stat
```
size[4] Tstat tag[2] fid[4]
size[4] Rstat tag[2] stat[n]
```

#### Wstat
```
size[4] Twstat tag[2] fid[4] stat[n]
size[4] Rwstat tag[2]
```

## 設計

### 目標
**9Pサーバとクライアントを実装する**


### 現状の障害
- いい感じに各メッセージとfcallを抽象化できていない
  - unionを使う？
- サーバ・クライアント構造体