Twitter

最近のトラックバック

無料ブログはココログ

OS

2009年8月11日 (火)

OS(9途中-11途中)

■ここ最近はC言語での実装が多く、メモすることも少なかったです。
その分、ソースを読むのが大変でした・・・

一応一通り読みましたが、思い出せない部分も多いです。

大分進んだので、とりあえずここで一区切りしたいと思います。

調子にのって自分勝手にいじってますw

それと、USBメモリにDDforWindowsでイメージを書き込んだら・・・なんとちゃんと起動しました!
フロッピーとして認識されてるのかな・・・

ノートパソコンにUSBのフロッピードライブを接続すると、僕の環境では異常に遅いのですが、USBメモリではほぼ一瞬で起動します。

Sc000


Sc001

2009年8月 7日 (金)

OS(7-8途中)

大分ハードの話も終わってきて、ようやく、わかる!!っていう部分が増えてきて、楽しくなってきました。

C言語がメインになってきたので、大分楽です。

まだ解けていない謎などもありますが、この先解かれるみたいなので楽しみ。

マウスですよ!!
ぐるぐる動きますよ!!

■メモ

0x60 + IRQ番号をOCW2にアウトして、割り込み受付完了!を通知する。


セグメント番号の下位3bitは別の意味がある。よって、
番号 << 3 もしくは、 番号 * 8を行う。


割り込み部分はなるべく早く抜けるべき


制御回路ーマウスの順に初期化
この制御回路は、キーボードコントローラーが持っている・・・
KBCは、コマンドが受け取れるようになると、装置番号0x0064から読み取るデータのしたから2bit目が
0になる。
それを待ってあげないといけない。

0x60 KBCからデータが来るポート / KBCにデータを送るポート
0x64 KBCからステータスがくるポート
0x64 KBCにコマンドを送るポート

0x02 が準備完了、と言うステータス
0x60 がモードを設定する、と言うコマンド
0x47 マウスを利用するためのモード番号


マウスデータの1バイト目
下4bitは8~Fで変化
上は0~3で変化

Sc001
反応してます!!

Sc000
ぐるぐるー

Sc002
うあ!

2009年8月 6日 (木)

OS(5途中-6)

■感想

割り込みの話など、結構興味深かったです。
ソースをちゃんと読んでないと、ほんとついてけなくなるなぁ・・・

セグメントのおかげでいろんな謎が解けてきたけど、やっぱり全部にアクセスできてしまう謎が解けない・・・

asmheadで指定してる番地は、メモリ全体での番地だと思うんだけどなぁー・・・どうなんだろう。

■メモ
●セグメント
4GBを切り分ける仕組み
セグメントレジスタを使うが・・・
[DS:EBX]とした場合、DS*16ではなくて、DSであらわされるセグメントの開始番地にEBXが足される
ちなみに、DSは省略しても、つけたものとみなされる。

必要な情報
・大きさ
・開始番地
・属性

実際は64bitのデータだが、16bitの番号を振って区別する
ただし、下位3bitが使えない
よって8192個のセグメントが登録できるのだー

結局合計64kbyteの巨大?メモリ空間が必要
これをGDTっていう
Global Descriptor Table

そして、こいつの開始番地と、有効設定個数を
GDTRに設定
GDTレジスターの略、まんまだw

●割り込み
IDT = Interrupt デスクリプタ テーブル
割り込み番号0~255
何番だったら、関数なんとかを呼び出してねー
みたいなものらしい。

とりあえずプログラムから解読だー
● GDT,IDT続き

LIDTとかは6バイト(レジスタ)
有効バイト数 - 1 がlimitのことが多い

 ●セグメント
 base = 開始番地
 limit = 有効サイズ -1
 access = 属性
 ばらばらに登録するのは互換性のため

 リミットは20bitしか存在しないが、属性のGbitを立てることで、ページで指定をすることが出来る
 このページと言うのは、4kbyteのこと。

 属性は本来12bitだが、16bitの変数で扱っている
 xxxx0000xxxxxxxxという形
 上位4bitは拡張アクセス権
 386以降にできた
 GD00と言う形で、GはさっきのGビット、Dはセグメントのモードを16bit,32bitと切り替えられるが、通常は1の32bitで使う
  下位8bitの属性
  00000000(0x00) : 未使用
  10010010(0x92) : システム専用、読み書き可能、実行不可
  10011010(0x9a) : システム専用、実行可能、読み込み可能、書き込み不可
  11110010(0xf2) : アプリケーション用、読み書き可能、実行不可
  11111010(0xfa) : アプリケーション用、実行可能、読み込み可能、書き込み不可


● スタック後日談
!!あった!!
bootpack.bimで指定してるstack:の3136Kbyteの場所がちょうどそのアドレスだ!
・・・と言うことはスタックの開始アドレスを指定している?
システム属性のセグメントはメモリ全体にアクセスできるのかなぁ・・・

●割り込み
IRQ 0-7がマスタ (INT20-27)
IRQ 8-15がスレーブ (INT28-2f)

IMR = マスク、有効、無効を切り替える

IRQ12がマウス = INT 2c
IRQ1がキーボード = INT 21
INT27は不完全割り込み対応
この、21とか2cは、IDTの番号に対応している。

●スタック
スタックは
[ss:esp]みたいに指定される

PUSH EAX
add esp, -4
mov [ss:esp], eax

POP EAX
mov eax, [ss:esp]
add esp, 4

・・・となる
つまり、アドレスのしたの方へどんどんたまっていく。
PUSHAD
POPAD
たくさんPUSH!
EAX
ECX
EDX
EBX
ESP
EBP
ESI
EDI


C言語では、DS,ES,SSは同じセグメントを指していると思っている。


gatedesc 関数の番地と、セグメントを指定
ここでは2を指定しているが、*8なのは、下位3bitをあけたいから
2 << 3と同じ意味


関数って結局ラベルみたい。


FLAGSにZFとかCFとかIFがある。

● Makefile
一般規則にすると無駄なファイルが消える!?


よびだされたがわがPOPしてくれるのかなぁなんて思ったり、まだよくわかっていない。


「d6.lzh」をダウンロード


Sc000

2009年8月 5日 (水)

OS(4-5途中)

もはやHariboteOSの跡形もない見た目に・・・
でも頑張ったぞ!!w

今日のメモ
● C言語での引数

[ESP + 4] 一つ目
[ESP + 8] 二つ目
[ESP + 12] 三つ目...みたいな感じ

int型じゃなかったら変わるのかな??

●C言語との連携で自由に使っていいのは、「EAX ECX EDX」の3つだけ

io_out8( 0x03c9, rgb[2] / 4 );の/4の意味がわからない・・・
>> 2 ?
下位2bitを無視?
実験してみたら、やっぱりそうだったみたい(カラーピッカーで比べてみた)
つまり結局それぞれ6bit分の表現能力しかない
多分この画面モードにあわせるための処理


org 0で作られてるはずのプログラムがなんでメモリ全体にアクセスできるんだ・・・?
JMP命令は、今の番地基準に動くから問題ない(near jump)
相対ジャンプ的なかんじかな?
つまり、メモリアクセス自体は全部生?
スタック内部に確保されない変数は・・・?
68 [00000000]とかになってる・・・リンカが指定?
ということで、bimを見てみる
00003100?
あ・・・リトルエンディアンかぁ・・・
mapにあった値と同じだ
・・・と言うことは、bimファイル内の絶対座標で書かれていることになる?
そんなにアドレスないや・・・
ちなみにapp内部では2ECからスタートしていた。
お。。。ファイル先頭に2ecの文字発見
そもそも、リテラルの場合とPUSHの命令コードが違う・・・

とりあえず、メモリーにアクセスするのは生で可能と考える。
・・・じゃぁstaticに代入するのと、生のアドレスに代入するのではコードが違うはず・・・実験!

結果、なんと同じ値に!!
あれれー・・・
じゃぁいたずらしてみよう・・・おんなじ番地にアクセスしてやれー

うまくいった!!!うわー・・・

とりあえず今のところは、こういうモードと思っておくことにする・・・

●bin2obj
多分.dataに放り込む。

●asciiコードの最初の方は文字がないはず・・・
osaskフォントは色々詰め込んである・・・ってことは、自分の好きな文字組み込んでも大丈夫?

■感想
今日は一気にやっちゃいました。
関数を勝手に変えたり、画面いじりまくったりしたけど、内部はそんなに変わってないので大丈夫・・・かな?

おまけにフォント作成ソフトまでこしらえてしまった・・・w


「HariFont.exe」をダウンロード

Sc005


Sc006


Sc008
今のデスクトップ風

Sc007
・・・どうだ!!w

Sc009
・・・Finder・・・もどきw

Sc010

2009年8月 3日 (月)

OS(2)

メモ

●レジスタ(16bit)
AX アキュムレーター(計算が得意)
CX カウンタ(数を数える)
DX データ
BX ベース
SP スタックポインタ
BP ベースポインタ
SI ソースインデックス
DI デスティネーションインデックス

●以下は8ビットごとに区切れる
AX - AL AH
CX - CL CH
DX - DL DH
BX - BL BH

●レジスタ(32bit)
EAX
ECX
EDX
EBX
ESP
EBP
ESI
EDI

●セグメントレジスタ(16bit)
ES エクストラ(おまけ)
CS コード
SS スタック
DS データ

FS おまけ2
GS おまけ3

●今使っているCPUはリトルエンディアン?

●大きさ[番地]でメモリアクセス

●mov命令でのメモリアクセス
MOV データの大きさ [番地], データ
MOV データの大きさ [レジスタ], データも可能
●ただし、[レジスタ]は
BX, BP, SI, DI
しか使えない!


MOV AL, BYTE[SI]は1バイトしかありえない・・・よって
MOV AL, [SI]と短縮できる

●INT命令
ソフトウェア割り込みのこと(自分で割り込みを発生させられる??)
ここではBIOSが呼び出される。
詳細は
http://community.osdev.info/?(AT)BIOS

■感想

画面上は何も変わってませんが、中を理解できたと言うのはうれしいです!
Makefileさすが!

適当にプログラムを書き換えたけど、一応動いているみたいです・・・

「ipl.nas」をダウンロード

Sc000