OSを自作してみる9 ~簡易プロンプトとコマンドを実装~



今回は簡易的なプロンプトと、簡単に実装できるコマンドを追加する。

※過去回の記事とソースコードは下記から入手できる
https://github.com/Shadow5523/osdev/blob/master/README.md
また、ここで使用するコードはGitHubからダウンロードできる。
https://github.com/Shadow5523/osdev/releases/tag/version0.8.0
 
 

目次

 
 

今回やったこと

前回から追加した機能は以下の通り。

  • プロンプトの作成
  • コマンドの追加(reboot, clear)
  •  
    ほんとはシステムコールやメモリ管理あたりをもっと整備しなきゃいけないけど、なかなか目に見える形で進捗がでないので(たぶん見た目は第3回目くらいからほとんど変わってない…)モチベーションアップの為にまずプロンプトなどを追加してみた。次回以降からこの辺の整備を行うことにしてみる。

     
     

    sh_strcmp追加

    1.string.cに新たな関数(sh_strcmp)を追加する。内容は標準ライブラリのstrcmp関数と同じで、文字列を比較し同じなら0を、違えば文字列1 – 文字列2の差を整数型として返すようにする。

  • int sh_strcmp(const char* s1, const char* s2) … s1とs2を比較しその差をintで返す(glibcのstrcmp()と同じ)
  •  
     
    2.string.hへ関数のプロトタイプを追加。

     
     

    プロンプト追加

    1.いよいよプロンプトの実装を行う。まずterminal.cの処理に少し変更を加える。いままでこのOSではテキストパットのように文字を入力したりそれを消したりする範囲がterminal全体になっているが、これをプロンプト名を除いた最終行のみに変更を加える。drivers/terminal.cを開き以下のように編集。

     
     
    2.プロンプト名の長さを保持する共有変数をdrivers/terminal.cとkernel/kernel.cで宣言する。externで変数宣言を行うと外部のソースファイルで宣言した変数や関数を使用することができる。

     
     
    3.kernel/kernel.cにも同じように追加する。また、コマンドラインの入力文字の長さを保持する共有変数iを宣言。(これはここのソース内でしか使えない)

     
     
    4.kernel/kernel.cで入力文字列を返す関数input_line()を追加する。

  • int input_line(char* prompt_name, char* cmdline)
  • … prompt_nameでプロンプト名を渡し、cmdlineに入力文字列が格納される。また入力された文字が’\n’であった場合は0が返りcmdlineには完全な文字列が格納され、それ以外の場合は-1を返す。

     
     
    5.プロンプト本体である関数prompt()を作成する。ここでプロンプト名の定義やinput_line()で受け取った文字列をコマンドとしてexecuting()へ渡している。

     
     

    コマンドの追加とkernel本体の修正

    1.受け取った文字列を判定し実際にコマンドを実行する関数executing()を作成する。

  • int executing(char* cmdline) … cmdlineにコマンド文字列を格納し、成功すれば0を、失敗すれば-1を返す
  •  
    terminalの初期化には、OS起動時に呼び出すterminal_initialize()関数を実行し、rebootにはキーボードコントローラ(0x64)に0xFEを書き込むことによって再起動を実現している。
     
    2.kernel_main()の最後にprompt()を呼び出すコードを追加する。

     
     
    3.最後にinclude/kernel.hに今回追加した関数のプロトタイプを宣言する。

     
     

    確認

    make実行後、生成されたISOイメージをVMWareから起動し、「clear」「reboot」等のコマンドが正常に動けばOK

    Leave a Reply

    Your email address will not be published. Required fields are marked *