view user/matac42/note/2021/09/21.md @ 91:7c70b573b54f

backup 2021-09-22
author autobackup
date Wed, 22 Sep 2021 00:10:04 +0900
parents
children
line wrap: on
line source

# 研究目的

アプリケーションの信頼性を保証するために、アプリケーションが動作するOSの信頼性を高める必要がある。

本研究室では、信頼性に重きを置いたGearsOSを開発している。

GearsOSはノーマルレベル、メタレベルの処理を切り分けることができるCbC(Continuation Based C)で記述されている。

信頼性とは

- どのユーザーがどのようなファイル操作をしたかわかること
- logが残ること
- item 操作の辻褄があっていること

を指す。

また、GearsOSには現在未実装の機能があり、その一つにファイルシステムが挙げられる。信頼性を確保するため、ファイルシステムは

- ファイルシステム全体のトランザクション化
- ファイルシステム全体のバックアップ\&ロギング

を取り入れたDataGearManagerとして実装したい。

本卒業研究では、GearsOSへファイルシステムの実装を目指す。

# Gears

macbook上のlldbにて

```
$lldb ./hello_world
(lldb) target create "./hello_world"
Current executable set to '/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/hello_world' (x86_64).
(lldb) b main
Breakpoint 1: where = hello_world`main, address = 0x0000000100004ec2
(lldb) r
Process 23209 launched: '/Users/matac/ws/src/firefly/hg/Gears/Gears/src/parallel_execution/hello_world' (x86_64)
Process 23209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100004ec2 hello_world`main
hello_world`main:
->  0x100004ec2 <+0>: pushq  %rbp
    0x100004ec3 <+1>: movq   %rsp, %rbp
    0x100004ec6 <+4>: subq   $0x20, %rsp
    0x100004eca <+8>: movl   %edi, -0x14(%rbp)
Target 0: (hello_world) stopped.
```

- どうすればCbCのコードを表示してdebugできるか
- singularityの方でdebugできるっぽいのでそっちを使っていくかも

# xv6 

## docker & singularity

xv6をrun & debugできるdockerとsingularityを作った

作り方、使い方は下記参考

- https://growi.cr.ie.u-ryukyu.ac.jp/user/matac42/docker-xv6
- https://growi.cr.ie.u-ryukyu.ac.jp/user/matac42/singularity-xv6

## user application & system call

xv6でuser applicationやsystem callを作る方法を下記にまとめた

- https://growi.cr.ie.u-ryukyu.ac.jp/user/matac42/xv6-add-call

## pwd

pwdコマンドがxv6になかったので入れ込んだ

- pwdコマンドは既存のsystem callで作れる
- 例がたくさん転がっているので簡単
- ほぼコピペなので理解しているかと言われるとそうでもない

参考: https://dev.to/tyfkda/implement-pwd-command-on-xv6-gh5

他にやってみたいこと

- pathを通せるようにする
- editorを作る

## cd

cdコマンドはuser applicationとして登録されていないにもかかわらず打てた

- user/sh.cに下記のような記述が

```c
// Read and run input commands.
  while(getcmd(buf, sizeof(buf)) >= 0){
    if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
      // Chdir must be called by the parent, not the child.
      buf[strlen(buf)-1] = 0;  // chop \n
      if(chdir(buf+3) < 0)
        fprintf(2, "cannot cd %s\n", buf+3);
      continue;
    }
    if(fork1() == 0)
      runcmd(parsecmd(buf));
    wait(0);
  }
```

- なぜcdをuser applicationとして切り出さないのか
- 命令の簡素化をしているのでは、という話を聞いた

## filesystem

- inode
    - kernel/fs.cに書いてある
    - ファイルのメタ情報をinode numberとともに持っている
    - メタ情報
        - lsやstatした時に表示されるような情報
        - 所有者
        - 更新日時
        - ファイルサイズ
        - アクセス権
    - inodeをdataとは別の所定の位置に保存する
    - inodeはdataのアドレスを持っているのでinode numberでdataにアクセスすることができる
    - macbook上(APFS)でもinodeの確認ができる
        - `$ls -i`
        - `$df -i`
        - `$stat`
        - しかしAFSがinode番号を適当に返しているという話が
        - macOSのfilesystemのsource code探したけど見つからない(あれば知りたい)
    - inode数はあらかじめ決定されている
    - inode数上限を超えるとファイルやディレクトリが作成できなくなる
- spinlock
    - kernel/fs.cなどではacquireとreleaseを繰り返すような形でコードが書かれている
    - spinlockはlockされた資源が解放されるまでアクセスできなくなるような方法
    - 待たされている他のプログラムなどはループチェックで資源が解放されるのを待つ

# その他

- 蚊に刺されすぎてつらい
- 胸骨が痛い
- brainf\*ckのexampleがアスキーアートしてて面白かった
    - https://github.com/fabianishere/brainfuck/blob/master/examples/compiler/awib.bf