HariboteOS @ Blog - Linux Life

移動

move firstmove previous|currentmove to page 1move nextmove last

30日でできる! OS自作入門 11日目:アプリケーションあれこれ

2008/05/02 ( n ) < HariboteOS >

初めにアプリケーションをC言語で作成するためにライブラリ(のようなもの)を作成する。作成したアプリケーションの先頭の数バイトを実行時に書き換えたりしてかなりあやしい。

それから不正なアプリから OS を守るためにかなり頑張る。
頑張って守ってみたが、意味不明。
例外にも少し対応。

で、アプリ用にいろんな API を追加してとうとうウィンドウに文字を表示できるようになりました。
Haribote OS - 11th day

30日でできる! OS自作入門 10日目:アプリケーション&API

2008/04/28 ( n ) < HariboteOS >

まず初めに、コンソールの昨日として様々なコマンドを実装する。
mem, ls, cat 等。ものすごく地道。でも重要。
FAT が地味。
改行コードの処理って Mac は考慮しなくていいのか?と思ったので \r だけでも改行するように改良。

次に、NASK で作った簡単なアプリケーションを実行するために色々頑張る。
GDT, far-JMP あたりが相変わらず微妙。

さらに、アプリ側からOSの機能を使用できるように API を作成する。
この辺のアセンブラも。。。
ついでに far-CALL, RETF, PUSHAD, POPAD, IRETD なんかも。。。

しかし、アプリから API をコールして文字(列)を表示するところまでなんとかたどり着いた。
Haribote OS - 10th day
次回はいよいよ C言語でのアプリ作成。

30日でできる! OS自作入門 9日目:コンソールみたいなもの

2008/04/23 ( n ) < HariboteOS >

今日はコンソール。本では17日目。
新しいタスクとウィンドウを作成して、両方のウィンドウでキー入力を受け付けるようにした。
途中で、Shift と CapsLock, NumLock, ScrollLock に対応。
Ctrl と Alt は?と思いつつ次へ。

2つのウィンドウでカーソルの点滅速度が違うのがすごく気になっていたら、 フォーカスが無い方は点滅しないようにして解決するようだ。。。

コンソールを作ったり簡単なコマンド(明日)を作るのもいいけど、 早く独立したアプリケーションで動かしたいぞ。
Haribote OS - 9th day

30日でできる! OS自作入門 8日目:マルチタスク

2008/04/21 ( n ) < HariboteOS >

今日はマルチタスクを実装。
この辺からソースの説明が大雑把になってくる。
CDのソースがメインで、本自体がおまけと著者が言っているのでしょうがない。

マルチタスクの仕組み、タスクの自動切り替え、優先度の設定などを実装。
今日もかなり満足。
Haribote OS - 8th day

30日でできる! OS自作入門 7日目:遊ぶ

2008/04/17 ( n ) < HariboteOS >

マルチタスクに進む前に、というか、進む気持ちが今日は起こらなかったので、 HariboteOS の C言語のソースを色々いじってみた。

typedef _Point
{
    int x;
    int y;
} Point;

と同じように Size, Rect 構造体を作って、
graphics.c や sheet.c の座標関係を扱っている部分を全て書き換えた。

C++ のクラスのようにメソッドを作れないとメリットが半減のような気がするが、 ソースの見た目は自分的にはとても良くなったようだ。

試しに、高速カウンタで計測してみると、、、、、2割くらい遅くなってるかも。
うーむ。よくない。でも、元に戻すのは何かくやしいのでどうするかは保留。

変更の途中で、背景、ウィンドウを描画しているところを書き換える際にKDE4ライクなイメージに書き換えた。
Haribote OS - 7th day

寄り道はこの位にして、明日こそはマルチタスクを実装しよう。

30日でできる! OS自作入門 6日目:チラチラ解消

2008/04/16 ( n ) < HariboteOS >

カウントアップアプリケーションを作成して表示をしてみると 画面がチラチラすることが判明したので、描画まわりの改善をとりあえず始めてみる。
途中で、本の map の使い方が気に入らなかったので自分方式に変更。

void sheet_refreshsub( struct SHTCTL* ctl, int vx0, int vy0, int vx1, int vy1, int h0 )
{
    int h, bx, by, vx, vy, bx0, by0, bx1, by1;
    unsigned char *buf, c, *vram = ctl->vram;
    struct SHEET* sht;
    if( vx0 < 0 ) vx0 = 0;
    if( vy0 < 0 ) vy0 = 0;
    if( vx1 > ctl->xsize ) vx1 = ctl->xsize;
    if( vy1 > ctl->ysize ) vy1 = ctl->ysize;
    
    // init map
    for( vy = vy0; vy <= vy1; vy++ )
    {
        for( vx = vx0; vx <= vx1; vx++ )
        {
            ctl->map[vy * ctl->xsize + vx ] = 0;
        }
    }
    for( h = ctl->top; h >= h0; h-- )
    {
        sht = ctl->sheets[h];
        buf = sht->buf;
        bx0 = vx0 - sht->vx0;
        by0 = vy0 - sht->vy0;
        bx1 = vx1 - sht->vx0;
        by1 = vy1 - sht->vy0;
        if( bx0 < 0 ) bx0 = 0;
        if( by0 < 0 ) by0 = 0;
        if( bx1 > sht->bxsize ) bx1 = sht->bxsize;
        if( by1 > sht->bysize ) by1 = sht->bysize;
        for( by = by0; by < by1; by++ )
        {
            vy = sht->vy0 + by;
            for( bx = bx0; bx < bx1; bx++ )
            {
                vx = sht->vx0 + bx;
                c = buf[by * sht->bxsize + bx];
                if( ctl->map[vy * ctl->xsize + vx] == 0 && c != sht->col_inv )
                {
                    vram[vy * ctl->xsize + vx] = c;
                    ctl->map[vy * ctl->xsize + vx] = 1;
                }
            }
        }
    }
}

一番上のレイヤーから描画していって、描画済みの部分にフラグをたてて、下位のレイヤーでは描画しないようにした。

次はタイマの作成。
IRQ0 の割り込み。仕様は見ていないけど、実装は難しくない。
割り込みハンドラの最適化も頑張って改善。アルゴリズム系はそんなに難しくない。

さらに高解像度に挑戦。
相変わらず BIOS 関係のアセンブラが登場すると理解ができない。
どのレジスタが何のためにあるのか、どういう風に使う(使える)のかが分かってないのが問題かなぁ。

で、適当にキー入力に対応して、マウスでウィンドウを動かせるようにしたところで、 14日目の分が終了。やっと半分。
Haribote OS - 6th day
ちょっと冷静に考えてみると、実質7日でこんなにOSらしく動いているのはすごい。

30日でできる! OS自作入門 5日目:メモリ管理、ウィンドウの表示

2008/04/15 ( n ) < HariboteOS >

週末は飲んでました。
昨日は仕事。

今日はメモリ管理からスタート。
32MB のメモリを管理して、一部の確保、開放なんかを実装。
シンプルだけど、よく考えられている。

次に画面のレイヤー管理。
SHEET 構造体を作成して位置、順序を管理して、描画処理を行う。
vx0, vy0, vx, vy, vx1, vy1 とか変数が増えてめんどくさい。
Point とか Rect とか作って。。。みるか。今度。
苦労の甲斐があって、マウスの動きで背景が上書きされる問題が解決。

で、最後にウィンドウの表示。
地道にウィンドウを描画して。。。 Haribote OS - 5th day
明日はタイマーの作成と描画の最適化。地道にがんばりましょう。

30日でできる! OS自作入門 4日目:マウスを動かす、メモリ容量

2008/04/11 ( n ) < HariboteOS >

今週は仕事を普通にしながら、夕食後から夜中にかけてOS作りをしていたので、 さすがに相当疲労が溜まってしまいまして、今日はあまり進まなかった。

初めにマウスを動かす処理。
昨日マウスからのデータの読み込みまで終了していたので、今日はこのデータを解析して、マウスカーソルを実際に動かしてみた。ついでにボタンに応じてカーソルの色を変えてみたり。

それからブートローダー関連で後回しになっていたアセンブラソースの解説を読む。
GDT,IDT の簡単な初期化、OSのメモリ領域へのコピー等など。
なんか若干理解できた気分。

次に、メモリ容量の取得。
すごくシンプルだけど、こんなもんでいいんだろうか。

それからメモリ管理部分に頭を突っ込んだけど、今日はギブアップ。

今日のところの成果。
Haribote OS - 4th day
本の9日目までを4日で進んだのでいいペース。ただ、ちゃんと理解できていない部分もある。 でも、とりあえず楽しんで作って、細かいことは後でちゃんと勉強するって方針でいいと思います。

30日でできる! OS自作入門 3日目:文字の描画、割り込みの設定

2008/04/10 ( n ) < HariboteOS >

まず最初に文字の描画。32bit になってしまったのでもはやBIOSはつかえない。
ビットマップみたいなフォントデータを作成して1ドットづつ地道に描画。。。
なかなか切ない。
本に付属のフォントデータを使用してASCII文字列の描画ができるようになった。
デバッグメッセージを表示できる様になったのは喜ぶべきことのはず。

次に、マウスカーソルの表示。
とりあえず表示だけ。

で、ここからが本日のメインイベント。
GDT と IDT
IDTの方はやりたいこともやってることも(やり方は別として)なんとなく理解できる。
一方GDTの方はさっぱり。要復習。

息抜き程度にソースを分割。
複数のソースファイル(*.c,*.nas)に対してヘッダファイルが一つっていう状況に違和感を感じるのは普通なんだろうか。

で、割り込みの設定をしてキーボードとマウスの反応を得る。
ハードの制御となると途端に難しく感じる。こちらも要復習。

途中で FIFO を実装。
オブジェクトにしてメソッド呼び出したいよーと思いながらも C++ でやることのハードルの高さに(全然見当もつかないけど)しぶしぶ我慢。
やっぱり C言語はあまり好きではない。

今日の結果。
Haribote OS - 3rd day
見た目はそんなに変わらないけど、マウスとキーボードを例にハードウェア回りの最初の一歩を踏み出した感じ。
今日はここまで。いいペース。

30日でできる! OS自作入門 2日目:アセンブラ初体験〜C言語でプログラム

2008/04/09 ( n ) < HariboteOS >

昨日手書きしたイメージファイル を作るためのアセンブラを、とりあえず本を見ながら打ってみる。
イメージファイルをバイナリエディタで作ってからアセンブラで作り始めるのは順番が逆では?と思いつつもこっちの順番の方が意外と理解しやすいのが不思議だ。

  • DB は 「data byte」。1バイトを書く命令。文字列も書ける。
  • RESB は 「reserve byte」。指定した分を予約(0で埋めてくれる) らしい。
  • ; はコメント
  • DW は「data word」。2バイト。
  • DD は 「data double-word」。4バイト。
  • などなど。後で説明しますよと書いてあってまだ出てきていない命令も多数。

Linux版開発セットを HariboteOS/Index から持ってきてアセンブルして実行。当然結果は昨日と同じ。

Linux/wako_memo をブックマークに追加。

......................

レジスタがたくさんあって、8ビットだ16ビットだ32ビットだと全然覚えられない。 そのうちアセンブラの教科書的なものを買ってこよう。

で、なんか調子がよくて、なんと本の四日目まで終わってしまった。
要所要所で説明が省かれて(後で説明しますとかなんとか)、 肝心なところが理解できていないような感じを残しつつ、 画面にお絵描きをするに至る。 Haribote OS - 2nd day
今日はここまで。GW前に終わらないかなぁ。

移動

move firstmove previous|currentmove 1|move nextmove last

スポンサードリンク

Copyright - ©2003- tasuku All Rights Reserved