OSをつくろうpart2
■ このスレッドは過去ログ倉庫に格納されています
0001ひげぽん
NGNGスレッドになればと思います。
では私の疑問から
(1)OSを作る場合、CPU周りに本当に近いところはアセンブリで
書かないと無理なのでしょうか。
私が、ソースを眺めたことのあるlinuxや、OSASKは、アセンブリと
Cで書かれてます。
(2)昔JavaBasedOSのソースを見たことがありますが、
結局はCで書かれている所が多かったです。
リアルタイム処理が苦手なJavaでOSを作るのは無理なんでしょうか。
Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。
0153デフォルトの名無しさん
NGNGそれを思うとやっぱりgccしか選択しないなと思う。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNGvxdのヘッダだけとかじゃねーの?
初期化(ブートローダ)
仮想メモリ
割り込みハンドラ
ロック機構
くらいじゃねーの?
0156デフォルトの名無しさん
NGNGアセンブラで書かなくてもいいよな。
本当にアセンブラで書かなくてはいけないのは、むしろBIOSだな。
0157デフォルトの名無しさん
NGNGglibcを使わなければいい(どうせ使えない)
0158デフォルトの名無しさん
NGNGそうなんだ。それはいいこときた。
0159デフォルトの名無しさん
NGNG最初に作るのはローダーといいたいところだけど、もっと簡単に
ハードディスクからブートして画面にメッセージでもだすプログラム作るといいよ。
そのあと、割り込みとメモリ管理をするといいです。
それもいきなりハードディスクを使ったページングとかはせず、
単純に仮想アドレスを実アドレスにマップするのを作ってみるといいです。
そうこうしているうちに、手探りの作り方ってのが分かってくるから、
そしたら、OSの理論本でも見て設計するといいです。
最初はCを使おうとか考えたらダメですよ、オールアセンブラです。
やり方がわかってきたら、全部アセンブラで書くのが面倒になってきますから
そしたら C で書いてみるといいです。
実のところここまでできれば後はたいしたことは無いです、思いのまま設計するよろしいです。
0160デフォルトの名無しさん
NGNGHDDはパラメータ周りとか結構めんどくさいんで、
実際に画面が出て動くまでをフロッピーでやることを勧めたいんですが。
0161デフォルトの名無しさん
NGNG後86特有のあの変なモードとかセグメントとかも先になれてから
メモリ管理がいいかも知れません。
しかし、86ッテヤダネェ
0162デフォルトの名無しさん
NGNG仮想マシンの線で言った方が楽やと思うで。
最近はなんやJavaや.NETやゆーて流行ってるみたいやし。
0163デフォルトの名無しさん
NGNGドシロートはすっこんでろ
0164デフォルトの名無しさん
NGNGハードウェアは単純で、カーネルソースも公開されているし、CPUは
RISC物なので、x86のセグメントみたいな嫌らしさもない。
0165デフォルトの名無しさん
NGNGんでもエプソンのチップってイヤになるほどマイナーじゃない?
WonderWitchをさわった方がx86系だし良いんじゃないかな。
0166デフォルトの名無しさん
NGNGそらOSは作ったことはないけどやな。
たとえばJavaVMやったら
任意アドレス指定が可能なオペレーションは排除されとったと記憶しとる。
各種の変数は事前に囲い込まれた範囲内でしかアクセスでけへんし
オブジェクト境界を超えるアクセスは全部VM上でチェックが入る。
あれやったら、仮想メモリ管理、ちゅうか、アドレス空間の隔離はせんでも
安全に動くもんが実装できるんとちゃうんか?
ページングの話はまた別な。
これも習作のOSとして大目に見るんやったら
仮想メモリ管理なしで類似品が作れると思うで。
どっか間違うてるか?
0167デフォルトの名無しさん
NGNG本質的にVMはOSが発行するメッセージ、割り当てたメモリ,I/Oに対して
アクセスするのでそれ単体では何もでん。
JAVAチップもしかり。
0168デフォルトの名無しさん
NGNGVMがCPUそのもんやと思てると?そこまでアホなこと言うかいな。
JavaVMみたいに、あらゆるアクセスが検査対象となる構造やったら、
実行時に動的にアクセスを制限するようなことをせんでも、
JITなりを通す段階で安全な処理に落とし込めるやろっちゅう話やがな。
x86のプロテクトモードやGDTやらLDTやらゲートやら面倒くさそうやからな。
そんなん弄るぐらいやったら実行バイナリを仮想コードで統一しつつ
裏ではJITなんかで調整して基本的な命令しか使わんような
単純な構造にした方がええんちゃうか言うてんねん。
これやったらI/O命令と割り込みぐらいでどうにかなるはずや。
それともこういうことはできへんのんか?
0169デフォルトの名無しさん
NGNG>>1が作りたい物を作るのが一番なんだから、
横から口を挟むのはどうかと。
0170デフォルトの名無しさん
NGNG手始めにWonderWitchはいいかも、簡単に手に入って
しかも86系アセンブラになれるのにももってこいですね。
あれって確か発売元バンダイでしたっけ?
0171デフォルトの名無しさん
NGNGこっちの方が楽ちゃうかぁ、思うてな。
参考程度に聞いたって。>1
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNGえっひょっとしてワンダーウィッチ・・・・もう売ってない?
0174デフォルトの名無しさん
NGNGx86のアセンブラに慣れるには、確かにいいかもしれない。
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNG壁は286,386だけでしょ、後は大体みんないっしょ
0177デフォルトの名無しさん
NGNGはまず標準入出力関数を作ってモニタプログラムを
書かなければいけないだろう。
それから記憶装置からブートだな。
そして最後にタスク、メモリ管理と。
0178デフォルトの名無しさん
NGNG0179ひげぽん
NGNG>>160
まずは、フロッピーからブートというのはちょっと考えてました。
ブートに関しては、ここ↓
http://www.tkcity.net/~nobusan/boot/boot.html
で勉強しています。
>>178
買いましたよ。今読んでおります。
ところで環境構築なんですが
Cのライブラリ等は何を使えばよいのでしょうか。
linux,windowsどちらでも良いので教えてください。
0180デフォルトの名無しさん
NGNG安全なのは自分で作ることだな。
0181デフォルトの名無しさん
NGNG> Cのライブラリ等は何を使えばよいのでしょうか。
Interface 7月号買ってんだったら P.55 から読んでみたらどうよ。
0182ひげぽん
NGNGgnuということですか?
0183デフォルトの名無しさん
NGNGぉぃぉぃ
0184181
NGNGP.55 に書いてある Chapter1 のタイトルをここに書いてみろよ。
あんた以外は、俺が何を言いたいかわかるはずだ。
(で、どうすればいいかは Interface を見ればわかる。Linux の環境が
あるんなら、まずは書いてある通りやってみればいい。知ってる人には
ちょっと冗長だけど、今までこの手のプログラムを書いたことない人には
なかなかいい記事だと思うよ。)
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187181
NGNG0188ひげぽん
NGNG0189デフォルトの名無しさん
NGNGおまえが決めることだろ。
あれだけのペースで書き込んでいたのに、
書き込みがぷっつり途絶えたと言うことは、
逃げたと解釈するしか無かったからな。
もし本人ならトリップつけろ
0190ひげぽん
NGNGを参考にして
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
を読もうかと思っています。
>>188
は、私ではありません。
インターフェース誌まだ読んでいる途中です。
ところで上誌P55から「標準Cライブラリを使わないプログラミング」
がありますが、
ライブラリを使わない場合、自分でシステムコール系を
アセンブリ言語で書かなければいけないのですが、
>>151
の言っているようにこの部分を独自のライブラリとして
Cへのインターフェースを作成しなければいけないのでしょうか。
上記のライブラリは開発環境として誰かが書いたものに
+α自分で必要なものを書くのでしょうか。
それとも
全部自作??
0191ひげぽん
NGNG0192デフォルトの名無しさん
NGNG普通1からOSを作るなら全部自作
既存の物を持ってきても良いとは思うが、まぁ、基礎だと思って作るのがいいんじゃないか。
一般に提供されているCライブラリはほぼ使えないと思った方が良い。
だからFreeBSDとかLinuxあたりから抜いてくるしか無い・・・かな。
勿論ライセンス問題もあるんだけど。
>Cへのインターフェースを作成しなければいけないのでしょうか
いけないわけじゃないけど、Cのインターフェイスで作らないと
結局全部アセンブラで書く羽目になるし、どうだろうね。
0193デフォルトの名無しさん
NGNG0194ひげぽん
NGNGなるほど。
システムコール系(全てではありませんが)は
アセンブラで書かなければいけないのですね。
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
買って読んでいます。
まだ最初の数十ページですが、すでに買ってよかったと思っています。
0195ひげぽん
NGNGbochsインストールしようかと思っています。
インターフェース誌紹介してくれた人ありがとう!!
0196デフォルトの名無しさん
NGNG0197ひげぽん
NGNGまったく同じ仕組みでつくろうとは思いませんが、
プロセス間通信とか、パイプの実装とか・・・
勉強になりますね。
0198デフォルトの名無しさん
NGNG0199ひげぽん
NGNG0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNGその日、2ちゃんねるの漢たちが立ち上がった・・・。
最高のOSを作るべく。
できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか
0203デフォルトの名無しさん
NGNG0204デフォルトの名無しさん
NGNGNEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。
0205デフォルトの名無しさん
NGNG趣味でそこまでできません。
0206155
NGNGgrubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか
「メモリの特定アドレスにkernel imageをロードする機能」
と
「そっから動くカーネル」
は別もんだ。
0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNGダメだろ。そう言うところは、自分で OS を1から作ってるわけじゃないからね。
悪く言うと既存の OS を自社のマシンにポーティングしてるだけだよ。
そんなことするぐらいなら、英語の勉強して Linux とか FreeBSD とかのコミュ
ニティに参加した方がいいよ。
>>206
だからなに ?
0209ネギトロ
NGNGだけど、そこがないと話になんないよな。
PC/AT互換機のROM-BIOSの機能とか、どこかで調べられないか?
俺もちーと興味ある。
んで、このスレッドには興味持ったのでコテハンで行きます。
0210デフォルトの名無しさん
NGNG>>206 は >>155 の発言で ブートローダをOSの一部のように書いたから
それを訂正したってだけだろ。
労力を他の部分に傾けるためにブートローダは既存のものを使うのも良し。
勉強もかねてブートローダからつくるもの良し。
0212ひげぽん
NGNGちょっとにぎわってきたのでうれしいです。
まだ先の話ですが、多少速度に目をつぶっても
CPU依存の部分は出来るだけ少なくしたいかなあと思っているんですが
どうでしょうか。
ちょっと昨日夢で見たのです(夢ですよ)
システムコール系はアセンブラで書き、インターフェース部分をCで書きます。
そして、JINI経由でjavaから呼び出す。
あーめんどくさいなこれは・・・・
でもなんかばかげてて楽しい。
言語はCでは無くC++で書こうかなあ。
そのほうがいろいろ素直にかけそう。
0213デフォルトの名無しさん
NGNG×JINI
○JNI
Jini を使ったOSというのもそれはそれで面白いけど。
0214デフォルトの名無しさん
NGNG0216ひげぽん
NGNGネギトロ氏よろしく。
多少でも興味のある方書き込みしてくれるとうれしいっす。
セマフォ勉強中・・・
0217デフォルトの名無しさん
NGNGヒントくださーい
0218デフォルトの名無しさん
NGNG意味不明。
システムコール系って何だ?
低レベルサービスをアセンブラで書いて、
そのインターフェイスをC互換にすると言うこと?
0219デフォルトの名無しさん
NGNG俺も良くわからんけど、システムコール呼び出しをアセンブラで書いて、
C用のインターフェースを作るってことじゃないの ? プロセッサの動作
モードをユーザーモードから切り替えるには割込みしかないから、システ
ムコールは (インラインでいいけど) アセンブラ使わざる得ないだろう
ね。(ちなみに、OSの受け口もアセンブラで書く必要がある。)
よく考えたら、システムコール呼び出しって変だね。System Call Call
だもんなァ...。
0220デフォルトの名無しさん
NGNG0221ひげぽん
NGNGシステムコールをアセンブリ言語で実装し、
Cから呼び出すことが出来る用にインターフェースを用意するという
つもりで書いたんだけど。
日本語が変だったかな。変ですね。スマソ
インラインアセンブラとか・・・
インターフェースに書いてあるまんまだったりして・・・・
0222ひげぽん
NGNG反省・・・
0223219
NGNG> システムコールをアセンブリ言語で実装し、
システムコールの実装って、どこまでを指してます ?
OSって、ユーザープログラムからみるとシステムコール集合体みたいな
もんだから、こう書くとフルアセンブラで書いたOSのように取られるか
もしれないですよ。(そう言う意味で、>>219 では「OSの受け口も」と
言う表現にしてます。(まあ、まだまだあいまいですけどね。))
0224ひげぽん
NGNGえっと。
まだ一行もソースを書いてないで言っているので
あくまでも計画ですが、
基本的には、アセンブリ言語でしかかけない部分のみ
アセンブリ言語で書く予定です。
結局システムコールの一部をアセンブリ言語で書かざるを得なくて
Cから呼び出せるようにしたいということを言いたかった。
言ってること変わってますね→私
0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNGそんなことより1よ。
BTRON作ってくれ。
超漢字買う金がない。
0228デフォルトの名無しさん
NGNG0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG無理に決まってんだろ!(w
CGのためのOSを作りたいですね」といってました。
「CGのためのOS?」。当時、OSのことについて何もわからなかった
自分はサパーリ理解せずに読み飛ばしていたのですが、今OSのことを
そこそこ理解した状態では、「CGのためのOS」の仕様がどのような
ものになるのかものすごく気になるのです。
ココのスレはOSの内部についても詳しい方がいるようなので、もし
「CGのためのOS」を考えるならどういう仕様になるのか教えてください。
0233デフォルトの名無しさん
NGNG複数枚のGPU搭載ビデオカードを刺しておけば、
それぞれのカードに演算要求を出し、結果を1つに集約する。
0234ネギトロ
NGNGC言語で書いた関数でも、コンパイルされたあとのバイナリでは機械語の並びになります。
んでもって、アセンブリ言語でいうところの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デフォルトの名無しさん
NGNG1は23だが、、、
まぁSEといってたから高校生ではないな。
0236ひげぽん
NGNGおっと。
文章はまだ若いということで勘弁してもらえないっすかね。
0238ひげぽん
NGNG詳しい解説ありがとうございます。
質問です。
ご紹介の本を読めば、分かるのでしょうけど
今ちょっといろいろな本を消化中なもので・・・・
>x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
>異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
同じセグメント、異なるセグメントとは何でしょうか?
0239デフォルトの名無しさん
NGNG「はじめて読む486」を参照。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGセレクタの方が適切だろ。
0242デフォルトの名無しさん
NGNGときどきお話に出てくるブートローダ(MBRのことですよね?)やブートセクタ(パーティションの先頭?)を
直接見たり、書き換えるにはnasmとかmasmのツールでできるのでしょうか?
>>159さんのブートの話はとても魅力的です。どの辺の資料を読めばできるようになるか
教えていただけないでしょうか?「はじめて読む486」でしょうか?nasmなどのマニュアルでしょうか?
よろしくお願いします。
0243デフォルトの名無しさん
NGNGブートローダーは保存されるプログラム
0245デフォルトの名無しさん
NGNGじぶん で けんさく した ほうが あたまに はいる よ 。
かころぐ を しらべて かんれんせい が ありそうな
きーわーど を みつけて ごらん 。
If you understand , use "google" and go to the mad house. Hyahaha
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNGNT/2000ならリソースキットかインストールCDのdskprobe.exeを使ってごらん。
>>243
くだらん。
>>245
知らないなら知らないと言えよ。(w
0249デフォルトの名無しさん
NGNG最初の2行だけにしとけばよかったのにな。
>>248
246へのレスは245へのレスか?
どこが変なのか教えてたも
0250ウマさんシカさん ◆vBaka42s
NGNGrawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?
0251デフォルトの名無しさん
NGNGがんばってください。
でも、日本語が少し変です。
0252ひげぽん
NGNG242さんよろしく。
一緒に学んで行きましょう。
ちょうどブートのお話が出てきているので便乗質問です。
以下の(1)(2)(3)の認識はあっていますか?
(1)フロッピーディスクからブートする場合、
ディスクの最初のセクタにあるコードが実行される。
(2)(1)で実行されたコードがさらに、フロッピーディスク上の
他のコードを起動することで
OS本体を呼び出すことが出来る
(3)(1)(2)が正しいと仮定して、
あるCPUを載せた、PCがあるとする。
そのPC上でスタティックコンパイルすることにより作成された
バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
上記バイナリイメージをフロッピーディスク上に配置し、
(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
間違いや、認識違いを指摘していただけるとありがたいです。
■ このスレッドは過去ログ倉庫に格納されています