非情報系インフラエンジニアの情報系お勉強

OS自作、ネットワーク、セキュリティの備忘録

OS自作入門 13日目/30日(タイマーの改良)

OS自作入門 13日目/30日(タイマーの改良)

1.はじめに

13日目では、コードとタイマーを改良する。

問題点はharib09c,d,e,f,g,h,iの際に、CDの想定通りの挙動を示さない。現時点で、原因は不明。パッチ的な対応で動作させることはできた。詳しい内容については下記を参照

2.harib10a,b

複数の関数を一つにまとめたり、FIFOバッファを改良する

  1. 上記のためにbootpack.cの修正
No. 対象ファイル 修正内容
1 bootpack.c void putfonts8_asc_shtへの集約やFIFO部分の修正

3.harib09c,d,e,f,g,h,i

FIFOバッファの見直し等を行い、プログラムの高速化を図る。内容については、本のみで理解できたので、harib10iのみ実装

harib10bからの修正内容は下記の通り

  1. timer.cの修正
  2. bootpack.cの修正
  3. bootpack.hの修正
  4. fifo.cを修正
  5. keyboard.cを修正
  6. mouse.cを修正
No. 対象ファイル 修正内容
1 timer.c 線形リストや番兵実装他を実装
2 bootpack.c 同上実装に伴う修正
3 bootpack.h 同上実装に伴う修正
4 fifo.c FIFOバッファの32bit対応
5 keyboard.c FIFOバッファの32bit対応
6 mouse.c FIFOバッファの32bit対応

上記の内容を、テキストの通りに実施したが、10秒経ってもウィンドウにカウントが表示されない。また、キーボードを押しても非常に反応が鈍い(数秒遅れ)。問題点の切り分けを行ったところ、bootpack.cのfor文ループの初めに下記命令を記入すると、正常に割り込みが動作する。

テキストの記載

  for (;;) {
    count++;    
        io_cli();
    ~(略)~

切り分け

  for (;;) {
    count++;
    orisprintf(s, "%d", count); 
    putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10);
    io_cli();
    ~(略)~

原因を検討したが、全くわからなかった。割り込み禁止が不適切な状態になっているのではないかなど考えたが、正常に動作していた過去のプログラムと比較しても問題と思われるところが見つからなかった。