忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/23 (Sat) / 編集
×

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

/ 2008/08/25 (Mon) / 編集
[OS-Wiki]メモリマップ
どうやらメモリにも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以降ではここにリセットジャンプ命令がある
つまり、ブートセクタをつかったプログラムを書くには開始番地を(「ORG 0x7c00 」とかで)0x00007c00にするといいらしい、マジか!


拍手[0回]

PR
/ 2008/08/23 (Sat) / 編集
OS自作入門2日目よりレジスタの話
  1. アキュムレータ(Accumulator)(16bitの時はAX):累積演算機
  2. カウンタ(Counter)(16bitの時はCX)
  3. データ(Data)(16bitの時はDX)
  4. ベース(Base)(16bitの時はBX)
  5. ベースポインタ(Base Pointer)(16bitの時はBP)
  6. スタックポインタ(Stack Pointer)(16bitの時はSP)
  7. ソースインデックス(Source Index)(16bitの時はSI):読み込みインデックス
  8. デスティネーションインデックス(Destination Index)(16bitの時はDI):書き込みインデックス
なんでまたいちいち「16bitのときは」なんて書いてあるかというとbit数によって名前が違うらしい、32bitになると頭にEがついてEAX,ECX,,,という感じ、64bitになるとRがついてREX,RCX,,,という感じになるらしい。

ここで、リストの1~4のレジスタには8bit版もあるらしい、というよりも16bitのレジスタを8bitのレジスタ2つとみて使う事ができるらしい。
たとえばアキュムレータ(AX)なら上位8bitをアキュムレータハイ(AH)、下位8bitをアキュムレータロウ(AL)と呼ぶ、つまりAXに「E22F」を代入するというのはAHにE2、ALに2Fを代入するのと同じ事らしい。
ちなみにいうと、32bitのアキュムレータ(つまりEAX)の場合は下位16bitをAXとして使えるらしい、ただし、上位16bitには名前がついておらず使う事はできないんだとか。


あとセグメントレジスタとやらもあるらしい
  1. コードセグメント(Code Segment)(16bitのときはCS)
  2. スタックセグメント(Stack Segment)(16bitのときはSS)
  3. データセグメント(Data Segment)(16bitのときはDS)
  4. エクストラセグメント(Extra Segment)(16bitのときはES)
  5. 名前なし(16bitのときはFS)
  6. 名前なし(16bitのときはGS)
ここでリストの4,5,6はおまけのセグメントらしい
でもってこのセグメントレジスタってのはなんなのかというと、、、、
16bitのレジスタしか作れなかった時代、レジスタでメモリの番地を表す時16bit分(つまり0x0000~0xffff)までの64KBの番地しか指定できなかったそうで、それだと64MBのメモリとか作ってもまったく意味がない状態に!
そこでセグメントレジスタの出番、番地の指定をするときに「セグメントレジスタの値x16+レジスタの値」にすれば32bit分指定できる!ってことらしい。

実はEAXなどの32bitのレジスタを使うときにも「メモリの番地を指定するときにはセグメントレジスタも使わなければならない」というルールがあるらしい、でもってアセンブラでセグメントレジスタを省略したときには大抵DSが使われるんだとか、だからアセンブラでプログラムを書くときには「DS=0」にしておく必要があるんだとか


詳しいレジスタの構造については[ITmediaエンタープライズ]x64のレジスタ拡張 (1/2)

拍手[0回]

/ 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
ふつうに通った、いいことだ

拍手[1回]

忍者ブログ [PR]