忍者ブログ

Cyber Bird

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

OS自作入門 onLinux 14日目

400f8a5d.png

お久しぶりです。

OS14日目、無事できました。
今回は「中間地点の後処理」といった感じでしょうか。
具体的には
・解像度UP
・キー入力対応

の2つですね。

解像度が大きくなるだけでもOS感がグッとアップ。うーん、感慨深い。
しかし、ここまでたどり着くまでにいくつか山を越えねばなりませんでした。

ソースを貼り忘れていましたw
こちらです。


まずはこの有様。

09a74eeb.png

いやいや、この展開は早すぎるでしょ…
harib11dを参考に、VESAのファンクションを呼び出しただけなのに…

とりあえず冷静に。
確かVRAMのアドレスを変えていた。うん。そこでミスってる可能性が大きい。
0xe0000000から0x000a0000に戻してみよう。

b252fc1e.png

なんですかこれはー!

調べてみると、0x000a0000のVRAM(VGAのVRAM?)は64KBしかないらしい。
うーむ。表現が稚拙というか不正確というか…。そこはお許しを。(できれば指摘してほしいな…)
【参考】サポートウィキ:advance/QEMUVGA

それはおいといて、どうにかしてVRAMのアドレスってBIOSから取得できないのかなー
と思っていたら…

OS-Wiki:VESA

これこれ!これだよ!

参考にさせていただきながら苦労してソースを書き上げてコンパイル。

0ae8ce80.png

おおー!成功だ。

と思っていたら、同じ事を続きのharib11eでやっていた。なんかすごい疲労感…

でも、OS自作本ではアドレス0xe0000000でうまくいっているのに、なぜ僕の環境では
ブラックスクリーンなんだ。何がいけないんだ。
そこで、BIOSで取得したVRAMのアドレスを表示してみた。
それが最初のスクリーンショットだけどね。

400f8a5d.png

0xf0000000…なぜだ…。
しかし調べてもよくわからない。Mona OSではVRAMのアドレスが0xf0000000になっている(?)
らしいが。

まあ、この課題はひとまず置いておこう。



そしてもうひとつバグが。

sprintf関数がおかしい。

適当に書いたのがいけないんだ!と過去の自分に愚痴ってもどうしようもないので、
書きなおした。バグはint2hex関数にあり。

lib.c
// 数値を16進数文字列に変換する
// flag: 大文字なら1, 小文字なら0
void int2hex(char *s, int value, int flag) {
	int zero		= 0;	// 0以外の桁が出たかどうか
	int filter		= 0x0f;	// 16進数で1桁だけ抽出するフィルタ
	int i, n;
	// 16進数のアルファベット
	char alphabet 	= flag ? 'A' : 'a';
	
	// 16進数はint型で最大8桁
	for(i = 0; i < 8; i++) {
		n = value >> (7-i)*4;
		if(!zero && n != 0)	zero = 1;	// 初めて0以外の桁が現れたとき
		else if(!zero)		continue;	// 0以外の桁が現れていないとき
		// 桁が10~15なら'A'~'F'に変換
		if((n & filter) >= 10) {
			*s++ = alphabet + (n & filter) - 10;
		} else {
			// '0'~'9'に変換
			*s++ = '0' + (n & filter);
		}
	}
	*s = '\0';
}
これでOK。



こんな僕でも、なんとか14日目、中間地点に辿り着くことができました。
(1年近くかかってる気がするけどね!)

ここまででも、既にOSについていろいろ学べた気がします。
GDT、IDT、割り込み、なかなかヘビーな内容もありましたが、OS自作本の
解説とネット上の有志の方々による情報で乗り越えられました。

ここからマルチタスクやAPIなどに入っていき、特にシステムコールなどは
非常に実装したい気分ではあるんですが、如何せん受験勉強片手だと荷が重い。。。
この記事の内容も、2週間前にはもうできていたんですが、記事を書く時間もなく。
前々から言っていたとおり、この辺でいったんOSはお休みしようと思います。
もっと落ち着いてから、ゆっくりと再開するつもりです。
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

No Title

  • by NONAME
  • 2012/06/17(Sun)23:46
  • Edit
ソースコードのリンク貼り忘れてませんか?
URLを直接指定したらダウンロード出来たのですが。

で、UbuntuのQEMUで試しましたが、VRAMのアドレスが0xFD000000になってました。

VirtualBoxでも試しましたが、こちらは0xE0000000になってました。

Re:No Title

  • by levelfour
  • 2012/06/22 20:21
本当だ…。アップだけして忘れていました。修正完了です。

VRAMは、とするとホスト側の環境に左右されちゃうってことですかねえ。
もう少し調べてみましょうか。
他のテスト環境がなかったので、大変ありがたいです!

ブログ内検索

プロフィール

HN:
levelfour
性別:
男性
自己紹介:
ぼちぼち更新を再開する予定です。

twitter

最新コメント

[09/27 菜々氏]
[06/17 NONAME]
[04/30 mithril]
[04/29 Liva]
[01/30 NONAME]

最新トラックバック

コガネモチ

Copyright ©  -- Cyber Bird --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]