OS自作入門 / 2008/08/25 (Mon) / 編集 |
[OS-Wiki]メモリマップ
どうやらメモリにもIPアドレスのように利用区分があるそうで、上記ページから一部抜粋すると
どうやらメモリにもIPアドレスのように利用区分があるそうで、上記ページから一部抜粋すると
- 0x00000000 - 0x0009ffff : RAM
- 0x00000000 - 0x000003ff : リアルモード用INTベクタ
- 0x00000300 - 0x000003ffはBIOS用スタック?
- 0x00000400 - 0x000004ff : BIOS用ワークエリア?
- 0x00007c00 - 0x00007dff : ブートセクタが読み込まれるアドレス
- 0x0009fc00 - 0x0009ffff : ACPI用ワークエリア(の場合がある)
- 0x000a0000 - 0x000bffff : ビデオアクセス用アドレス空間
- 000c0000 - 0x000c7fff : ビデオBIOS?
- 0x000c8000 - 0x000dffff : 各種カードのROMがあったりなかったり?
- 0x000d0000 - 0x000dffffはたいてい空いている
- 0x000e0000 - 0x000effff : 拡張BIOS(ここが空いている場合もある?)
- 0x000f0000 - 0x000fffff : BIOS
- 0x00100000 - 0x00efffff : RAM (これに満たない可能性もある)
- 0x00f00000 - 0x00ffffff : RAMもしくはISAホール(どちらになるかはBIOSの設定などによる) 0x01000000 - メモリが尽きるまで : RAM
- メモリが尽きたところ - 0xffffffef : PCIデバイスなどのメモリマップトI/Oに利用可能な領域
- 0xfffffff0 - 0xffffffff : 386以降ではここにリセットジャンプ命令がある
PR
OS自作入門 / 2008/08/23 (Sat) / 編集 |
OS自作入門2日目よりレジスタの話
ここで、リストの1~4のレジスタには8bit版もあるらしい、というよりも16bitのレジスタを8bitのレジスタ2つとみて使う事ができるらしい。
たとえばアキュムレータ(AX)なら上位8bitをアキュムレータハイ(AH)、下位8bitをアキュムレータロウ(AL)と呼ぶ、つまりAXに「E22F」を代入するというのはAHにE2、ALに2Fを代入するのと同じ事らしい。
ちなみにいうと、32bitのアキュムレータ(つまりEAX)の場合は下位16bitをAXとして使えるらしい、ただし、上位16bitには名前がついておらず使う事はできないんだとか。
あとセグメントレジスタとやらもあるらしい
でもってこのセグメントレジスタってのはなんなのかというと、、、、
16bitのレジスタしか作れなかった時代、レジスタでメモリの番地を表す時16bit分(つまり0x0000~0xffff)までの64KBの番地しか指定できなかったそうで、それだと64MBのメモリとか作ってもまったく意味がない状態に!
そこでセグメントレジスタの出番、番地の指定をするときに「セグメントレジスタの値x16+レジスタの値」にすれば32bit分指定できる!ってことらしい。
*実はEAXなどの32bitのレジスタを使うときにも「メモリの番地を指定するときにはセグメントレジスタも使わなければならない」というルールがあるらしい、でもってアセンブラでセグメントレジスタを省略したときには大抵DSが使われるんだとか、だからアセンブラでプログラムを書くときには「DS=0」にしておく必要があるんだとか
詳しいレジスタの構造については[ITmediaエンタープライズ]x64のレジスタ拡張 (1/2)
- アキュムレータ(Accumulator)(16bitの時はAX):累積演算機
- カウンタ(Counter)(16bitの時はCX)
- データ(Data)(16bitの時はDX)
- ベース(Base)(16bitの時はBX)
- ベースポインタ(Base Pointer)(16bitの時はBP)
- スタックポインタ(Stack Pointer)(16bitの時はSP)
- ソースインデックス(Source Index)(16bitの時はSI):読み込みインデックス
- デスティネーションインデックス(Destination Index)(16bitの時はDI):書き込みインデックス
ここで、リストの1~4のレジスタには8bit版もあるらしい、というよりも16bitのレジスタを8bitのレジスタ2つとみて使う事ができるらしい。
たとえばアキュムレータ(AX)なら上位8bitをアキュムレータハイ(AH)、下位8bitをアキュムレータロウ(AL)と呼ぶ、つまりAXに「E22F」を代入するというのはAHにE2、ALに2Fを代入するのと同じ事らしい。
ちなみにいうと、32bitのアキュムレータ(つまりEAX)の場合は下位16bitをAXとして使えるらしい、ただし、上位16bitには名前がついておらず使う事はできないんだとか。
あとセグメントレジスタとやらもあるらしい
- コードセグメント(Code Segment)(16bitのときはCS)
- スタックセグメント(Stack Segment)(16bitのときはSS)
- データセグメント(Data Segment)(16bitのときはDS)
- エクストラセグメント(Extra Segment)(16bitのときはES)
- 名前なし(16bitのときはFS)
- 名前なし(16bitのときはGS)
でもってこのセグメントレジスタってのはなんなのかというと、、、、
16bitのレジスタしか作れなかった時代、レジスタでメモリの番地を表す時16bit分(つまり0x0000~0xffff)までの64KBの番地しか指定できなかったそうで、それだと64MBのメモリとか作ってもまったく意味がない状態に!
そこでセグメントレジスタの出番、番地の指定をするときに「セグメントレジスタの値x16+レジスタの値」にすれば32bit分指定できる!ってことらしい。
*実はEAXなどの32bitのレジスタを使うときにも「メモリの番地を指定するときにはセグメントレジスタも使わなければならない」というルールがあるらしい、でもってアセンブラでセグメントレジスタを省略したときには大抵DSが使われるんだとか、だからアセンブラでプログラムを書くときには「DS=0」にしておく必要があるんだとか
詳しいレジスタの構造については[ITmediaエンタープライズ]x64のレジスタ拡張 (1/2)
OS自作入門 / 2008/08/22 (Fri) / 編集 |
『30日でできるOS自作入門』という本を借りたので読んでみた
とりあえず、「Windowsかよ!せめてLinuxだろ!!」とかいってみたがまぁしかたないわな、世の中Windowsユーザが多いんだから、、、順番に読んで行けばとても勉強になりそうな感じ、説明もわかりやすいしね〜
でもってMacでやろうとする際の障害がアセンブラ、NASKという自作アセンブラを使っていて、これが「MASM系の(つまり非gas系の)文法体型です。 文法の多くはNASMをベースにしていますが、ラベル計算能力や自動JMP最適化などは、NASMを大きく上回っています」というものなのだがこれがMacでコンパイルできない、てゆうかreadmeの出来ひどくね?Linux用のバイナリは配布されてるからそれつかえばpwでもできるんだがいちいちリモートログインするのめんどくさい、、、
というわけでNASMインストールしてみた
%autoheader
%autoconf
%./configure
%make
%make install
ふつうに通った、いいことだ
とりあえず、「Windowsかよ!せめてLinuxだろ!!」とかいってみたがまぁしかたないわな、世の中Windowsユーザが多いんだから、、、順番に読んで行けばとても勉強になりそうな感じ、説明もわかりやすいしね〜
でもってMacでやろうとする際の障害がアセンブラ、NASKという自作アセンブラを使っていて、これが「MASM系の(つまり非gas系の)文法体型です。 文法の多くはNASMをベースにしていますが、ラベル計算能力や自動JMP最適化などは、NASMを大きく上回っています」というものなのだがこれがMacでコンパイルできない、てゆうかreadmeの出来ひどくね?Linux用のバイナリは配布されてるからそれつかえばpwでもできるんだがいちいちリモートログインするのめんどくさい、、、
というわけでNASMインストールしてみた
%autoheader
%autoconf
%./configure
%make
%make install
ふつうに通った、いいことだ