トップページ⇒tech
1001コメント369KB

OSをつくろうpart2

■ このスレッドは過去ログ倉庫に格納されています
0001ひげぽんNGNG
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

では私の疑問から
(1)OSを作る場合、CPU周りに本当に近いところはアセンブリで
書かないと無理なのでしょうか。

私が、ソースを眺めたことのあるlinuxや、OSASKは、アセンブリと
Cで書かれてます。
(2)昔JavaBasedOSのソースを見たことがありますが、
結局はCで書かれている所が多かったです。
リアルタイム処理が苦手なJavaでOSを作るのは無理なんでしょうか。

Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。
0153デフォルトの名無しさんNGNG
>>152
それを思うとやっぱりgccしか選択しないなと思う。
0154デフォルトの名無しさんNGNG
GPLかぁ。。。
0155デフォルトの名無しさんNGNG
いまどきデバイスドライバがアセンブラってのはどんなOSだよ
vxdのヘッダだけとかじゃねーの?

初期化(ブートローダ)
仮想メモリ
割り込みハンドラ
ロック機構

くらいじゃねーの?
0156デフォルトの名無しさんNGNG
デバイスドライバって言ってもOSのカーネルモード通すんだったら
アセンブラで書かなくてもいいよな。
本当にアセンブラで書かなくてはいけないのは、むしろBIOSだな。
0157デフォルトの名無しさんNGNG
gccで生成したコードはGPLじゃないよ。
glibcを使わなければいい(どうせ使えない)
0158デフォルトの名無しさんNGNG
>>157
そうなんだ。それはいいこときた。
0159デフォルトの名無しさんNGNG
本気でやる気があるのなら、手短に
最初に作るのはローダーといいたいところだけど、もっと簡単に
ハードディスクからブートして画面にメッセージでもだすプログラム作るといいよ。
そのあと、割り込みとメモリ管理をするといいです。
それもいきなりハードディスクを使ったページングとかはせず、
単純に仮想アドレスを実アドレスにマップするのを作ってみるといいです。
そうこうしているうちに、手探りの作り方ってのが分かってくるから、
そしたら、OSの理論本でも見て設計するといいです。
最初はCを使おうとか考えたらダメですよ、オールアセンブラです。
やり方がわかってきたら、全部アセンブラで書くのが面倒になってきますから
そしたら C で書いてみるといいです。
実のところここまでできれば後はたいしたことは無いです、思いのまま設計するよろしいです。
0160デフォルトの名無しさんNGNG
>>159
HDDはパラメータ周りとか結構めんどくさいんで、
実際に画面が出て動くまでをフロッピーでやることを勧めたいんですが。
0161デフォルトの名無しさんNGNG
ああ、確かにそうですね。
後86特有のあの変なモードとかセグメントとかも先になれてから
メモリ管理がいいかも知れません。

しかし、86ッテヤダネェ
0162デフォルトの名無しさんNGNG
ポインタさえ殺せば仮想メモリ管理いらんやろ。
仮想マシンの線で言った方が楽やと思うで。
最近はなんやJavaや.NETやゆーて流行ってるみたいやし。
0163デフォルトの名無しさんNGNG
>>162
ドシロートはすっこんでろ
0164デフォルトの名無しさんNGNG
いっそ、最初はP/ECEで試作した方がいいかも。
ハードウェアは単純で、カーネルソースも公開されているし、CPUは
RISC物なので、x86のセグメントみたいな嫌らしさもない。
0165デフォルトの名無しさんNGNG
>>164
んでもエプソンのチップってイヤになるほどマイナーじゃない?
WonderWitchをさわった方がx86系だし良いんじゃないかな。
0166デフォルトの名無しさんNGNG
>>163
そらOSは作ったことはないけどやな。
たとえばJavaVMやったら
任意アドレス指定が可能なオペレーションは排除されとったと記憶しとる。
各種の変数は事前に囲い込まれた範囲内でしかアクセスでけへんし
オブジェクト境界を超えるアクセスは全部VM上でチェックが入る。
あれやったら、仮想メモリ管理、ちゅうか、アドレス空間の隔離はせんでも
安全に動くもんが実装できるんとちゃうんか?
ページングの話はまた別な。
これも習作のOSとして大目に見るんやったら
仮想メモリ管理なしで類似品が作れると思うで。
どっか間違うてるか?
0167デフォルトの名無しさんNGNG
>>162
本質的にVMはOSが発行するメッセージ、割り当てたメモリ,I/Oに対して
アクセスするのでそれ単体では何もでん。
JAVAチップもしかり。


0168デフォルトの名無しさんNGNG
>>167
VMがCPUそのもんやと思てると?そこまでアホなこと言うかいな。
JavaVMみたいに、あらゆるアクセスが検査対象となる構造やったら、
実行時に動的にアクセスを制限するようなことをせんでも、
JITなりを通す段階で安全な処理に落とし込めるやろっちゅう話やがな。
x86のプロテクトモードやGDTやらLDTやらゲートやら面倒くさそうやからな。
そんなん弄るぐらいやったら実行バイナリを仮想コードで統一しつつ
裏ではJITなんかで調整して基本的な命令しか使わんような
単純な構造にした方がええんちゃうか言うてんねん。
これやったらI/O命令と割り込みぐらいでどうにかなるはずや。
それともこういうことはできへんのんか?
0169デフォルトの名無しさんNGNG
>>166
>>1が作りたい物を作るのが一番なんだから、
横から口を挟むのはどうかと。
0170デフォルトの名無しさんNGNG
>>165
手始めにWonderWitchはいいかも、簡単に手に入って
しかも86系アセンブラになれるのにももってこいですね。
あれって確か発売元バンダイでしたっけ?
0171デフォルトの名無しさんNGNG
>>169
こっちの方が楽ちゃうかぁ、思うてな。
参考程度に聞いたって。>1
0172デフォルトの名無しさんNGNG
(´-`).。oO(ワンダーウィッチ・・・・まだあったのか。)
0173デフォルトの名無しさんNGNG
>>172
えっひょっとしてワンダーウィッチ・・・・もう売ってない?
0174デフォルトの名無しさんNGNG
WonderWitch、まだ売ってるよ。
x86のアセンブラに慣れるには、確かにいいかもしれない。
0175デフォルトの名無しさんNGNG
WWが終わった後も386の壁486の壁が待ってるからな。
0176デフォルトの名無しさんNGNG
>>175
壁は286,386だけでしょ、後は大体みんないっしょ
0177デフォルトの名無しさんNGNG
>1
はまず標準入出力関数を作ってモニタプログラムを
書かなければいけないだろう。
それから記憶装置からブートだな。
そして最後にタスク、メモリ管理と。
0178デフォルトの名無しさんNGNG
ガタガタ言わずに月刊InterFace7月号買えよ
0179ひげぽんNGNG
>>159
>>160
まずは、フロッピーからブートというのはちょっと考えてました。
ブートに関しては、ここ↓
http://www.tkcity.net/~nobusan/boot/boot.html
で勉強しています。


>>178
買いましたよ。今読んでおります。

ところで環境構築なんですが
Cのライブラリ等は何を使えばよいのでしょうか。
linux,windowsどちらでも良いので教えてください。
0180デフォルトの名無しさんNGNG
>>179
安全なのは自分で作ることだな。
0181デフォルトの名無しさんNGNG
>>179
> Cのライブラリ等は何を使えばよいのでしょうか。
Interface 7月号買ってんだったら P.55 から読んでみたらどうよ。
0182ひげぽんNGNG
>>181
gnuということですか?
0183デフォルトの名無しさんNGNG
>>182
ぉぃぉぃ
0184181NGNG
>>182
P.55 に書いてある Chapter1 のタイトルをここに書いてみろよ。
あんた以外は、俺が何を言いたいかわかるはずだ。
(で、どうすればいいかは Interface を見ればわかる。Linux の環境が
あるんなら、まずは書いてある通りやってみればいい。知ってる人には
ちょっと冗長だけど、今までこの手のプログラムを書いたことない人には
なかなかいい記事だと思うよ。)
0185デフォルトの名無しさんNGNG
モウオワリ?
0186デフォルトの名無しさんNGNG
ウン、オワリ。
0187181NGNG
おわりかよ !!
0188ひげぽんNGNG
え?おわりですか?
0189デフォルトの名無しさんNGNG
>>188
おまえが決めることだろ。
あれだけのペースで書き込んでいたのに、
書き込みがぷっつり途絶えたと言うことは、
逃げたと解釈するしか無かったからな。

もし本人ならトリップつけろ
0190ひげぽんNGNG
http://pc.2ch.net/test/read.cgi/os/996204956/l50
を参考にして


「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
を読もうかと思っています。

>>188
は、私ではありません。

インターフェース誌まだ読んでいる途中です。
ところで上誌P55から「標準Cライブラリを使わないプログラミング」
がありますが、
ライブラリを使わない場合、自分でシステムコール系を
アセンブリ言語で書かなければいけないのですが、
>>151
の言っているようにこの部分を独自のライブラリとして
Cへのインターフェースを作成しなければいけないのでしょうか。

上記のライブラリは開発環境として誰かが書いたものに
+α自分で必要なものを書くのでしょうか。

それとも
全部自作??
0191ひげぽんNGNG
そういえばunixマガジンもブート特集してましたね。

0192デフォルトの名無しさんNGNG
>>190
普通1からOSを作るなら全部自作
既存の物を持ってきても良いとは思うが、まぁ、基礎だと思って作るのがいいんじゃないか。
一般に提供されているCライブラリはほぼ使えないと思った方が良い。
だからFreeBSDとかLinuxあたりから抜いてくるしか無い・・・かな。
勿論ライセンス問題もあるんだけど。

>Cへのインターフェースを作成しなければいけないのでしょうか
いけないわけじゃないけど、Cのインターフェイスで作らないと
結局全部アセンブラで書く羽目になるし、どうだろうね。
0193デフォルトの名無しさんNGNG
マタハジマタ
0194ひげぽんNGNG
>>192
なるほど。
システムコール系(全てではありませんが)は
アセンブラで書かなければいけないのですね。

「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
買って読んでいます。

まだ最初の数十ページですが、すでに買ってよかったと思っています。

0195ひげぽんNGNG
環境構築ですが、インターフェース誌が結構役に立っています。
bochsインストールしようかと思っています。

インターフェース誌紹介してくれた人ありがとう!!
0196デフォルトの名無しさんNGNG
Minix本そんなにいいの?
0197ひげぽんNGNG
まったくの初心者なので、勉強になるっす。

まったく同じ仕組みでつくろうとは思いませんが、
プロセス間通信とか、パイプの実装とか・・・
勉強になりますね。
0198デフォルトの名無しさんNGNG
タネンバウム(・∀・)イイ!!
0199ひげぽんNGNG
良スレハケーン
0200 ◆mDa3YTQk NGNG
キャップをつけます。
0201デフォルトの名無しさんNGNG
OSの魔法使い
0202デフォルトの名無しさんNGNG
2002 06/18
その日、2ちゃんねるの漢たちが立ち上がった・・・。
最高のOSを作るべく。


できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか
0203デフォルトの名無しさんNGNG
開発コード: ひげぽん618 とか
0204デフォルトの名無しさんNGNG
OS作りたいんだったら、理系の大学へ進学して
NEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。
0205デフォルトの名無しさんNGNG
>>204
趣味でそこまでできません。
0206155NGNG
ブートローダはOSの本質的な仕事じゃないな。
grubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか
「メモリの特定アドレスにkernel imageをロードする機能」
と
「そっから動くカーネル」
は別もんだ。
0207デフォルトの名無しさんNGNG
開発コード:ひげぽん0721
0208デフォルトの名無しさんNGNG
>>204
ダメだろ。そう言うところは、自分で OS を1から作ってるわけじゃないからね。
悪く言うと既存の OS を自社のマシンにポーティングしてるだけだよ。
そんなことするぐらいなら、英語の勉強して Linux とか FreeBSD とかのコミュ
ニティに参加した方がいいよ。

>>206
だからなに ?
0209ネギトロNGNG
>>206
だけど、そこがないと話になんないよな。
PC/AT互換機のROM-BIOSの機能とか、どこかで調べられないか?
俺もちーと興味ある。

んで、このスレッドには興味持ったのでコテハンで行きます。
0210デフォルトの名無しさんNGNG
>>208-209
>>206 は >>155 の発言で ブートローダをOSの一部のように書いたから
それを訂正したってだけだろ。

労力を他の部分に傾けるためにブートローダは既存のものを使うのも良し。
勉強もかねてブートローダからつくるもの良し。
0211208NGNG
>>210
「ああなるほど、そう言うことか。」って、三日も前の話だし、全然本質
的な話じゃないから正直わかんなかったよ。
0212ひげぽんNGNG
OSの技術的な話はまだ勉強中です。
ちょっとにぎわってきたのでうれしいです。

まだ先の話ですが、多少速度に目をつぶっても
CPU依存の部分は出来るだけ少なくしたいかなあと思っているんですが
どうでしょうか。

ちょっと昨日夢で見たのです(夢ですよ)
システムコール系はアセンブラで書き、インターフェース部分をCで書きます。
そして、JINI経由でjavaから呼び出す。
あーめんどくさいなこれは・・・・
でもなんかばかげてて楽しい。

言語はCでは無くC++で書こうかなあ。
そのほうがいろいろ素直にかけそう。
0213デフォルトの名無しさんNGNG
>>212
×JINI
○JNI

Jini を使ったOSというのもそれはそれで面白いけど。
0214デフォルトの名無しさんNGNG
Javaにこだわるなよ
0215ひげぽんNGNG
>>213
訂正ありがとう。
>>214
うん。あくまでも冗談です。そんな面倒なことはやってられません。
0216ひげぽんNGNG
>>209
ネギトロ氏よろしく。
多少でも興味のある方書き込みしてくれるとうれしいっす。

セマフォ勉強中・・・
0217デフォルトの名無しさんNGNG
Javaのyield()ってどうやって実現してるんだろ・・・

ヒントくださーい
0218デフォルトの名無しさんNGNG
>>212
意味不明。
システムコール系って何だ?
低レベルサービスをアセンブラで書いて、
そのインターフェイスをC互換にすると言うこと?
0219デフォルトの名無しさんNGNG
>>218
俺も良くわからんけど、システムコール呼び出しをアセンブラで書いて、
C用のインターフェースを作るってことじゃないの ? プロセッサの動作
モードをユーザーモードから切り替えるには割込みしかないから、システ
ムコールは (インラインでいいけど) アセンブラ使わざる得ないだろう
ね。(ちなみに、OSの受け口もアセンブラで書く必要がある。)

よく考えたら、システムコール呼び出しって変だね。System Call Call
だもんなァ...。
0220デフォルトの名無しさんNGNG
意 味 が 通 じ れ ば いいんじゃネーノ?
0221ひげぽんNGNG
>>218
システムコールをアセンブリ言語で実装し、
Cから呼び出すことが出来る用にインターフェースを用意するという
つもりで書いたんだけど。
日本語が変だったかな。変ですね。スマソ

インラインアセンブラとか・・・
インターフェースに書いてあるまんまだったりして・・・・
0222ひげぽんNGNG
日本語気をつけます。
反省・・・
0223219NGNG
>>221
> システムコールをアセンブリ言語で実装し、
システムコールの実装って、どこまでを指してます ?
OSって、ユーザープログラムからみるとシステムコール集合体みたいな
もんだから、こう書くとフルアセンブラで書いたOSのように取られるか
もしれないですよ。(そう言う意味で、>>219 では「OSの受け口も」と
言う表現にしてます。(まあ、まだまだあいまいですけどね。))
0224ひげぽんNGNG
>>223
えっと。
まだ一行もソースを書いてないで言っているので
あくまでも計画ですが、
基本的には、アセンブリ言語でしかかけない部分のみ
アセンブリ言語で書く予定です。

結局システムコールの一部をアセンブリ言語で書かざるを得なくて
Cから呼び出せるようにしたいということを言いたかった。
言ってること変わってますね→私
0225デフォルトの名無しさんNGNG
ゲーム機はスーファミまではオールアセンブラだったヨ。
0226デフォルトの名無しさんNGNG
ひげぽんの開発環境何?
0227デフォルトの名無しさんNGNG
>>224
そんなことより1よ。
BTRON作ってくれ。
超漢字買う金がない。
0228デフォルトの名無しさんNGNG
http://www.tron.org/
0229デフォルトの名無しさんNGNG
C#キボンヌ
0230デフォルトの名無しさんNGNG
C#ってOS組めるの?
0231デフォルトの名無しさんNGNG
>>230
無理に決まってんだろ!(w
0232  NGNG
今から10年前の某雑誌に、CGデザイナーで著名な方が、「将来、
CGのためのOSを作りたいですね」といってました。
「CGのためのOS?」。当時、OSのことについて何もわからなかった
自分はサパーリ理解せずに読み飛ばしていたのですが、今OSのことを
そこそこ理解した状態では、「CGのためのOS」の仕様がどのような
ものになるのかものすごく気になるのです。
ココのスレはOSの内部についても詳しい方がいるようなので、もし
「CGのためのOS」を考えるならどういう仕様になるのか教えてください。
0233デフォルトの名無しさんNGNG
GPUを並列動作可能なMPUとして扱うアーキテクチャ。
複数枚のGPU搭載ビデオカードを刺しておけば、
それぞれのカードに演算要求を出し、結果を1つに集約する。
0234ネギトロNGNG
ちょっとシステムコールの実装について誤解があるようなので。

C言語で書いた関数でも、コンパイルされたあとのバイナリでは機械語の並びになります。
んでもって、アセンブリ言語でいうところのJMPとかCALL命令を使って呼び出すわけですけど
x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
前者はJMP,CALL等の命令で可能ですが、
後者の関数呼び出しを実現するには、割り込みを発生させる、コールゲートを呼び出す
# 他にありましたっけ?
などの方法を用いなければなりません。
例えばLinuxではintXXを使ったソフトウェア割り込みを使っています。
そして、システムコール関数もC言語の中から呼び出すwrite()やsocket()といった
ものの実体は、引数をレジスタに積んでソフトウェア割り込みを発生させるだけのシロモノです。

ということで、OSをコーディングする時に言語を何にするかというのは実はあまり大きな問題ではなく、
その言語で提供されているパラダイムの中で、それがコンパイル後にどのような形になるかが問題です。
で、C言語の場合、同一のプロセス空間(同じセグメント)の関数をコールする、という形しか考えられていないので、
システムコール呼び出しのように、異なるパラダイムの部分は(インライン)アセンブラで書いているわけです。

文章の雰囲気からして、>>1は高校生っぽいので、
http://www.amazon.co.jp/exec/obidos/ASIN/4274073815/ref=sr_aps_d_1_1/249-2751067-2413142
「図解32ビットマイクロコンピュータ80386の使い方」W.B.スルヤント著
をオススメしておきます。私が高校生の頃に読んでた本だし、難易度的にも丁度いいんじゃない?
0235デフォルトの名無しさんNGNG
>>234
1は23だが、、、
まぁSEといってたから高校生ではないな。
0236ひげぽんNGNG
>>234
おっと。
文章はまだ若いということで勘弁してもらえないっすかね。
0237 NGNG
別にLinuxのシステムコールがことなるセグメントにあるわけじゃないけどね。
0238ひげぽんNGNG
>>234
詳しい解説ありがとうございます。
質問です。
ご紹介の本を読めば、分かるのでしょうけど
今ちょっといろいろな本を消化中なもので・・・・
>x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
>異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
同じセグメント、異なるセグメントとは何でしょうか?
0239デフォルトの名無しさんNGNG
>>238
「はじめて読む486」を参照。
0240デフォルトの名無しさんNGNG
http://newos.sourceforge.net/
0241デフォルトの名無しさんNGNG
セグメントって言う言い方誤解を招かないか?
セレクタの方が適切だろ。
0242デフォルトの名無しさんNGNG
おもしろそうなので一緒に勉強してます。

ときどきお話に出てくるブートローダ(MBRのことですよね?)やブートセクタ(パーティションの先頭?)を
直接見たり、書き換えるにはnasmとかmasmのツールでできるのでしょうか?

>>159さんのブートの話はとても魅力的です。どの辺の資料を読めばできるようになるか
教えていただけないでしょうか?「はじめて読む486」でしょうか?nasmなどのマニュアルでしょうか?

よろしくお願いします。
0243デフォルトの名無しさんNGNG
MBRはブートローダーを保存する領域
ブートローダーは保存されるプログラム
0244242NGNG
>>243
さっそくのレスありがとうございました。
勘違いしていました。

それで、どうやって、ブートローダを読み書きすればよいのでしょうか?
よろしくお願いします。
0245デフォルトの名無しさんNGNG
>>244
 じぶん で けんさく した ほうが あたまに はいる よ 。
 かころぐ を しらべて かんれんせい が ありそうな
 きーわーど を みつけて ごらん 。

 If you understand , use "google" and go to the mad house. Hyahaha
0246デフォルトの名無しさんNGNG
x86っつっても、80286、80C86、IA-32で、それぞれ呼び出し時になにが起こるかぜんぜん違うしな。
0247デフォルトの名無しさんNGNG
>>244
NT/2000ならリソースキットかインストールCDのdskprobe.exeを使ってごらん。

>>243
くだらん。

>>245
知らないなら知らないと言えよ。(w
0248244NGNG
>>247
ありがとうございます。2000ユーザなので、家に帰ったらやってみます。

>>246
ごもっとも。
あと、英語が少し変です。
0249デフォルトの名無しさんNGNG
>>247
最初の2行だけにしとけばよかったのにな。

>>248
246へのレスは245へのレスか?
どこが変なのか教えてたも
0250ウマさんシカさん ◆vBaka42s NGNG
>>244
rawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?
0251デフォルトの名無しさんNGNG
>>248
がんばってください。
でも、日本語が少し変です。
0252ひげぽんNGNG
>>242
242さんよろしく。
一緒に学んで行きましょう。

ちょうどブートのお話が出てきているので便乗質問です。
以下の(1)(2)(3)の認識はあっていますか?
(1)フロッピーディスクからブートする場合、
  ディスクの最初のセクタにあるコードが実行される。
(2)(1)で実行されたコードがさらに、フロッピーディスク上の
  他のコードを起動することで
OS本体を呼び出すことが出来る
(3)(1)(2)が正しいと仮定して、
あるCPUを載せた、PCがあるとする。
そのPC上でスタティックコンパイルすることにより作成された
バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
  上記バイナリイメージをフロッピーディスク上に配置し、
(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。

間違いや、認識違いを指摘していただけるとありがたいです。
■ このスレッドは過去ログ倉庫に格納されています