旧THE-BBL掲示板
もうあまり必要性がないので凍結しました。

[Returns to a topicAll  1-  Newest 50
K氏のheboOSをまねてみる
1 名前:hideyosi 2004/9/22 17:32  
OSASKのK(川合氏)が、OS作成に関するチュートリアルを公開している。ふむふむ。なになに?

あいかわらずKは口がうまい!

なんだか出来そうな気がしてくるじゃねーかよ! そんなわけで、思いつくまま体験をばしてみたり。

参考:
http://community.osdev.info/index.php?FirstStep

Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 17:45  
さーって。まずはDOSのプログラムでいいんだよね。

・・・があぁぁあ!!

私って、そいえばDOSのプログラムもしたことないんだよね。(^^;)

とりあえず、昔つかったMinGWがセットアップされたまんまだ。これ使えるのかな???

Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 18:17  
MinGWでできるようだね。MinGWをインスコして、コマンドプロンプトでパスを通すだけ。

お決まりのHello Worldだよん。(いちおう区別できるように、名前とか書いてみたり。)

#include<stdio.h>

int main(){
printf("Hello World by hideyosi\n");
}

おー! めでたくa.exeが出来上がったニョ!

(なんか幼稚なことしてますねぇ・・・(^^;) )


Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 18:31  
さーて。こっからが大変。

MinGWを使って、DOSのシステムコールを使わないようにプログラムするにはどうしたらいいのかな?

(なんか確かにアセンブラ使ったほうがいいのかもしんないけどね。ちょっとがんばって調べてみよう。)

Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 19:51  
・・・うーむ・・・
どうもあっちこっちで調べてみたんだけど、C言語の中にアセンブラを自然に埋め込む「インラインアセンブラ」っつー機能を使うみたいだなぁ。

・・・あれ?そうすると、やっぱアセンブラがまったくわかんないとアカンつーことかな??? (^^;)

どうせ最初はHelloWorldをOSみたく起動させようってだけなんだし、しゃーない。ちょこっとアセンブラの解説を読んでみよう。

Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 20:15  
のわぁぁん!!!
MinGW(GCC)って、インラインアセンブラが高機能なぶん、エラクややっこしいじゃんか!
でもなぁ。アセンブラってややこしいから最低限に収めて、あとは御気楽なCとかでっていうのには、素のアセンブラは・・・
えーい!メンドイ!! とりあえずテケトーに文字だけ出すアセンブラのコード書いちゃえ!

Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 21:06  
・・・つかさ。NASKがあるじゃんか!!
ぐはぁ! Kタンのサンプルまであるじゃんかよ!!!
そんなわけで、まずはNASKでさっきのCと同じようなのを作ろう。

[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100
MOV DX,msg
MOV AH,0x09
INT 0x21
MOV AX,0x4c00
INT 0x21
msg DB "hello, world by hideyosi", 0x0d, 0x0a, "$"


えーっと。こんなんでnaskでコンパイルしてと。
あっれ? ぜんぜん出力しないぞ!? と頭を抱えていたんだけど、ふと思い立って、純粋DOS(95)で実行。うにょ! 動いた!

バンザーイバンザーイ!!!!!!!

・・・ だめじゃん!!!! orz

だーかーらぁ!!! INT21とか使っちゃいけないんだってば!!
うーん。やっぱ486本読まんとイケンかな?? (T∀T)


Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 22:45  
うーん。ちょこっと解ってきたぞ。えーっと。AT互換機の場合、BIOSに様々な実行命令があらかじめ格納されている。そこに命令するとその動作をしてくれるってわけだ。すんごく大雑把ではあるけど、DOSのファンクションコールやVBの関数と理屈が同じわけだ。

で、どうもある程度、パターンがあるみたいだ。DOSのファンクションコールは ahレジスタに呼び出したい機能の番号(ファンクション番号)を入れて INT 21 とやると、その機能が働く。
BIOSの場合は、どうもahレジスタに機能番号を設定して INT 10 とやるみたいだ。(もちろん例外とかオプションもあるけどね)

BIOSの機能番号で「文字表示」は、0eらしい。で、この機能は他のレジスタを使ってオプションを設定するわけか。

AL:表示する文字の16進コード

えーっと。するってーと、たとえば画面にAって表示するだけの場合だと、

mov al,0x41     ;「A」のアスキーコードは41hだよな。たしか
mov ax,0x0e
INT 0x10

っと、こういうことになるのかな?? (実験してみよう)


Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/22 23:31  
そんなわけで、こんなソースを作って実験。

[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100

MOV AL,0x41
MOV AH,0x0e
INT 0x10
JMP $

マシンをリセットして・・・・
キタ━━━━━━(゜∀゜)━━━━━━!!!!!!!!
へぇぇ! おもしれー! なるほどなるほどぉ!!!
もっといろいろなBIOSコールがあるみたい。やってみよ!


10 Re: K氏のheboOSをまねてみる  名前: -- K 2004/9/22 23:32  
MinGWで書いていた頃は、
「それじゃそもそもIA-16じゃなくてIA-32・・・」
とか思って心配したのですが、
なにやら毎度のガッツで元気に乗り切っている。
実に楽しみです。

11 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/23 1:12  
さーて! そんなわけで、BIOSだけで文字を表示することができました。こんなコードね。(^^;)

[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100


;画面クリア
;カーソルを0,0に設置して
MOV BH,0
MOV DH,0
MOV DL,0
MOV AH,0x02
INT 0x10

;全画面消去(80文字24行)
MOV AL,0
MOV BH,0
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,80
MOV AH,0x06
INT 0x10

;文字列の表示
MOV AL,0x01
MOV BH,0
MOV BL,0x0F
MOV CX,30
MOV DL,0
MOV DH,0
MOV ES:BP,msg
MOV AH,0x13
INT 0x10

MOV DL,0
MOV DH,1
MOV ES:BP,msg2
INT 0x10

MOV DL,0
MOV DH,2
MOV ES:BP,msg3
INT 0x10

MOV DL,0
MOV DH,3
MOV ES:BP,msg
INT 0x10

JMP $

;メッセージ部分
msg DB "******************************"
msg2 DB "* Kokoga Henndayo! *"
msg3 DB "* The-BBL!!! *"


動作も無事、DOSで確認。ちゃんと動いてる。
ほいだばほいだば!!!
さっそくこれをOSみたく、起動時に読み込むようにしてみましょ。
そのためにはIPLっつーもんを書かなくちゃいけない。

・・・・ギブアップ!!!! (;´д`)  (つか、あとで勉強しまする・・・)

heboOSに付いていたipl.binをそのまんま流用。なになに? copyコマンドで繋ぐ!??

えーっと。こーゆーことかな???

>copy ipl.bin+test2.com test2.bin

おぉ! 一個になったぞ!!!!

えーっと。そんでもってimgtolでFDに書き込むわけね。

>imgtol w a: test2.bin

そんで出来上がったFDを入れてリセットしてと・・・・
キタ━━━━━━(゜∀゜)━━━━━━!!!!!!!!
ぶははははは!!!! でけたでけたーー!!!!! (爆


12 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/23 2:58  
xxビットCPUの意味。

CPUについて調べてみた。・・・・ギブアップ!!!! (;´д`) 
いろいろややこし過ぎてわからんわい!!!!

だた、私お得意の「一旦大雑把な法則を見つけ出して憶えていく」に照らし合わせると・・・

xxビットCPU。つまり二つの要素に影響する。メモリアクセスと演算処理。

まずは演算処理。
「ビット」って言うとピンとこないので、ソロバン、もしくは電卓を想像してほしい。8ビットは、桁が8桁までしかない電卓と考える。
例えば8ビットCPU。8ビット。すなわち桁が8桁(零から千万まで)しかない電卓。0〜99,999,999までに収まるような計算(計算結果も含めて!)なら、一発で求められる。「=」を押せば、答えは液晶に表示される。
しかし、それを超えると面倒(時間が掛かる)になる。これは想像できるだろう。一旦、メモに書いたりして、桁を分割したりして計算しないと答えがでない。つまり、何倍も時間が掛かるわけ。
つまり、平べったい理屈で言えば、電卓の桁数(ビット)が多ければ多いほど、一回の計算で済む。すなわち、早いということになる。

次に、メモリアクセス。
アドレス空間が・・・っていうとピンとこないので、「使えるメモ帳のページ数」と考える。
ここで言うメモ帳はへんな性質があって、さっきの電卓の桁数に応じて、ページ数・一ページに書ける桁数が決まる。
つまり、8ビット(8桁の電卓)だと、メモ帳のページ数は0〜99,999,999ページまでしか使えない。さらに、一ページに書き込める数字も、0〜99,999,999に限定される。
この範囲に収まる計算ならよいが、桁があふれると、とたんに何倍もの計算時間が掛かるってのは、もうわかるよね。

8ビット、16ビット、32ビット。これだけ見れば、「たかが倍じゃん。たいして違わないんじゃないの?」と思うかもしれないけど、上記の例で比べればピンと来るでしょ?つまり、

8ビット(8桁電卓)
    ・一回で0〜99,999,999までしか計算できない
    ・メモ帳のページ数は9千万まで
    ・一ページに書ける最大の数字は99,999,999

16ビット(16桁電卓)
    ・一回で0〜9,999,999,999,999,999までの計算が出来る
    ・メモ帳のページは、9千兆以上!
    ・一ページに書ける最大の数字も9千兆以上!

これを考えれば、例えばもっともよく使う数字の桁が十億あたりだった場合、8桁と16桁では、倍ではすまない。ヘタすると何十倍も時間の差が出る。

だから、通常、ビットが多いと、それだけ早くて高性能ってことになるわけ。

(余談だが、「じゃ、ちょうどいい12桁の電卓作ればいいじゃん!」って意見がある。ごもっとも!でも、この電卓はなぜか倍というキリのいい数字でないとかえって作るのが大変という性質を持っていると考えてもらえば。)

・・・しかし、「じゃ、ビット(電卓の桁)が多ければ多いほどいいのか!」っていうと、そうでもないんだよね。これが! (^^)

今の物価を考えると、ウン十億まで(10桁)があれば十分でしょ?普通。
(私は7桁でジューブンだ!悪かったな!!!)
そうなると、液晶の桁が10個並んでいる電卓で十分だよね?。そんな世の中で、全ての電卓が、16桁あったら・・・邪魔!!!!
「今の」物価で考えれば、8桁の電卓で十分だし、小さいので扱いや持ち運びも便利。16桁の電卓は「過剰品質」ってことになるわけ。
でも、例えば10年後。またバブル景気があって、給料の平均が一億円。そのぶん、缶コーヒーが一本12万6千900円という世の中になったとしよう。そうすると、8桁電卓は「すさまじく不便」になり、多少大きくても16桁の電卓が一番便利になる。

つまり、その世の中や対象によって、一番使いやすくて便利な桁数が変わるということになるわけ。

だから、例えばライブドアの社長が便利なパソコンは64ビット。でも、私が使いやすいのは8ビット。とか、そういうふうになるわけ。
(これは電卓の例での話ね)

現在、一番使いやすいとされているのが、32ビット。もう既に64ビットのCPUはあるんだけど、ちょーっと過剰品質状態なわけ。
(でも、じりじりと「32ビットじゃ足りない!」という状況が増えてきているのね。)


13 Re: K氏のheboOSをまねてみる  名前: -- K 2004/9/23 8:28  
あとからここを読む人のためにちょっとフォロー

  MOV ES:BP,msg

はたまたまうまくいっていますが、本来は正しくない表記です。

  ES:BP == msgのアドレス

といった場合、msgのアドレスのオフセットをBPに、セグメントをESに入れます。
でも、残念ながらESとBPに値を代入するのは、1個のMOV命令ではできません。これはCPUの仕様です。

.COMファイルの場合、とりあえずESには適切な値が入っていますので、ESへの代入は気にしなくていいでしょう。ということで、

  MOV BP,msg

がこの場合の正しい記述になります。

14 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/23 17:55  
CPUのオベンキョ。
リアルモードとプロテクトモード。
(例によって大雑把だよ)

インテルのCPUは、幸か不幸か、8086という16ビット版のCPUが大ヒットした。そして、その上で動くことを前提にしたMS-DOSも大ヒット。沢山の資産が生まれた。

時代が進み、16ビットじゃ足りないってことで、インテルは32ビットの高機能な新型CPU、80386を開発!。これで今までの面倒な問題も一気に解決。高速・大容量のメモリも使える。ばんざーい!

・・・と思ったら、あまりにもMS-DOSがヒットしすぎていた。いまさらMS-DOSがまったく動かないCPUじゃ売れない。MS-DOSの32ビット版を作ったって、みんながその新MS-DOSを買って使ってくれるとは限らない。こまった・・・

で、しょうがない。せっかくの32ビットだけど、16ビット(8086)とまったく同じに動く機能を追加しよう。これなら古いMS-DOSしか使いたくない人にも安心して買ってもらえるぞ!

うーん。いろいろとリサーチしたら、なんかみんなMS-DOS以外、あんまし使いたがっていないようだ。32ビットのまんまだと、「動かねーじゃねーか!」とか苦情きそう・・・

じゃ、こうしよう。80386は本来は32ビットだけど、電源を入れた瞬間は8086ってことで動く。で、プログラムとかである特別なスイッチを入れれば、32ビットに切り替わるというように設計する。

・・・っとまあ、こういう感じだったようです。(本当の経緯は違いますよ!念のため)

で、その、電源を入れたばっかりの状態(8086として動く、16ビットの状態)、これを、「リアルモード」といい、なんらかの方法でスイッチが入れられ、32ビットになった状態を、「プロテクトモード」と言うわけ。

この、80386で定められた動作の規格は、今でもずーっと受け継がれている。80486・80586(Pentium)・80686(Pentium2)・・・・

OSはいろいろあるけど、インテルのCPUで動くものは、みなこの仕様(というか、制約?)に縛られる。なので、動作までは、

1、電源投入
2、いやおうなしに、CPUは8086(リアルモード)になる。
3、CPUの仕様として、決まった番地のアドレスにジャンプして実行する
4、この決まった場所は普通、ROMになっている。ここにBIOSというプログラムが書いてあって、これを実行する。(BIOSが壊れているとかでない限り、これは回避できない)
5、BIOSには、FDのある部分を読んできて実行しろというプログラムが書かれている。(これがIPL)
6、IPLが実行される。(へ理屈だが、このIPLに全ての命令を書き込むことが出来れば、この時点でOSということになる。IPLには大きさの制限があるので、普通はここには、xxxを読み込んで実行しろという程度の命令だけしか書かれていない)
7、IPLによって、OSの本体が読み込まれ、実行される。(OSが起動!)
8、この時点では、どんなOSでも16ビット。MS-DOSと大差なく、低性能。
9、LinuxやOSASKなどの32ビットOSの場合は、この16ビットの状態の時に、あるスイッチを入れて32ビット状態(プロテクトモード)に切り替えられる。
10、ここで初めて、マシンは32ビットになる。あとは、16ビットの時にあらかじめ読み込んでおいた32ビットでプログラムが書かれている場所にジャンプし、それを32ビットのCPUとして実行を開始する。
11、32ビットOS、起動・初期化処理開始!!!!

・・・っとまあ、大変大雑把だがこんな感じなのだろうなぁ。きっと。


15 Re: K氏のheboOSをまねてみる  名前: -- K 2004/9/23 18:56  
> ・・・っとまあ、大変大雑把だがこんな感じなのだろうなぁ。きっと。

まさにこんな感じです。あまりにも正確すぎて、フォローするところがありません(笑)。

16 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/24 3:46  
ずーーーーっとOSの骨組(というか概念)を調べていたら、こんな時間かよ!!!! (;´д`)
ヲレ、明日仕事なんでツけど・・・(つか、既に「今日」じゃん!)

Linuxのカーネル(の解説書)を読んでました。もう、なにがなんだかサパーリなんだけど、一つ、「もしかして、これか?」なのを見つけました。

      ・・・無限ループ・・・



      _人人人人人人人人人人人人人人_
        >    な なんだってー!!    <
       ‾^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^‾
        _,,.-‐-..,,_       _,,..--v--..,_
    /     `''.v'ν Σ´        `、_,.-'""`´""ヽ
    i'   /‾""''--i 7   | ,.イi,i,i,、 、,、 Σ          ヽ
.     !ヘ /‐- 、u.   |'     |ノ-、 ' ` `,_` | /i'i^iヘ、 ,、、   |
    |'' !゛ i.oニ'ー'〈ュニ!     iiヽ~oj.`'<_o.7 !'.__ ' ' ``_,,....、 .|
.   ,`| u       ..ゝ!     ‖  .j     (} 'o〉 `''o'ヽ |',`i
_,,..-<:::::\   (二> /      !  _`-っ  / |  7  ‾ u |i'/
. |、 \:::::\ '' /        \ '' /〃.ヽ `''⊃  , 'v>、
 !、\  \. ,‾        γ/|‾ 〃   \二-‐' //`




17 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/24 3:58  
MS-DOS(いやまあ、どんなOSも厳密にはそうだけど)は、起動して、必要な処理を全て終えると、プロンプト(命令の受付準備が完了しました。嗚呼・・・ご主人様。なんでもお命じください・・・)を出して、止まっちゃう。ほっとくと、ずーーーっと命令を待っている。そう。ずーーーと!!!

これって、「無限ループ」なんじゃないのかなぁ。

そんで、その無限ループの途中に、もしなんらかの命令があったらそれを実行し、実行が終わったら、また元のループに戻ってきて、またずーーーっと命令が来るまで無限ループをしてずーっと待っていると・・・

こんな感じ・・・・か?

       ↓
    初期化とかの処理
       ↓
       ↓
    スタート地点 ←←←←←←←←←
       ↓                 ↑
       ↓                 ↑
       ↓                 ↑
   もし、キーボードが押されたら、   (グルグル・・)
   「尿!」と表示して戻って来い     ↑
       ↓                 ↑
       ↓                 ↑
       ↓                 ↑
     スタート地点に戻れ!→→→→→

こういう理屈・・・なのかなぁ。


18 Re: K氏のheboOSをまねてみる  名前:hideyosi 2004/9/24 4:00  
つーか、寝ろよ!!! 俺!!!!  (;´д`)

19 Re: K氏のheboOSをまねてみる  名前:あっきぃ 2004/9/25 16:37  Site  
hideyosiさん、こんにちわん。
hideyOSを作っているとKタンからきいてきましたょ!
参考になるかわかりませんが、Mt.orzOSはオープンソースなので
よかったらみてみてください〜^^
(…といっても、同じくheboOSの発展版ですが^^;;;)
[Returns to a topicAll BACK100 NEXT100 Newest 50
BluesBB ©Sting_Band