2008 @ Blog - Linux Life

移動

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 をコールして文字(列)を表示するところまでなんとかたどり着いた。

次回はいよいよ C言語でのアプリ作成。

Seventeen’s Memorial

2008/04/26 ( n ) < Private >

午前中、新橋珈琲店にてだらだら仕事をする。
午後イチで、USオフィスの人他合計4人でランチを食べたあと、 インフォーマルなミーティング。
外国人同士の英語の会話は正直全然聞き取れない。
1対1でゆっくり話してもらってやっと簡単なコミュニケーションがとれる感じ。
来週のブリスベンの出張は果たして大丈夫なのだろうか。。。

で、夕方前に終わったので、銀座ソニービルSeventeen’s Memorial 〜尾崎豊 写真展〜 を見に行く。

さて、久しぶりに??酒でも飲んで寝るかな。

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

2008/04/23 ( n ) < HariboteOS >

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

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

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

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

2008/04/21 ( n ) < HariboteOS >

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

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

買い物

2008/04/20 ( n ) < Private >

GW に海外に行くのでデジカメを購入。
CASIO Exilim EX-Z200

その他、変圧器とかを購入。

飲み会

2008/04/19 ( n ) < Private >

神奈川の友達の家でベルギービールの会を開催。
日本のビールとは違って味が濃くてバリエーションがあって美味しかったぁ。

18時前から翌朝の5時すぎまで飲んでました。

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ライクなイメージに書き換えた。

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

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日目の分が終了。やっと半分。

ちょっと冷静に考えてみると、実質7日でこんなにOSらしく動いているのはすごい。

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

2008/04/15 ( n ) < HariboteOS >

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

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

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

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

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

2008/04/11 ( n ) < HariboteOS >

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

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

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

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

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

今日のところの成果。

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

移動

カテゴリ

スポンサードリンク

Copyright © 2025 Linux-Life.net