独自にOSを作っているまたは、作ろうとしている人たちのための スレッドになればと思います。 では私の疑問から (1)OSを作る場合、CPU周りに本当に近いところはアセンブリで 書かないと無理なのでしょうか。 私が、ソースを眺めたことのあるlinuxや、OSASKは、アセンブリと Cで書かれてます。 (2)昔JavaBasedOSのソースを見たことがありますが、 結局はCで書かれている所が多かったです。 リアルタイム処理が苦手なJavaでOSを作るのは無理なんでしょうか。 Javaマシン(バイトコードをそのまま処理するやつね)上で 動かすなら事情は違うのでしょうけど。
もう外出だよ
Σ(´д`) ・・・・2getシトケバヨカタ・・・
4 :
デフォルトの名無しさん :02/06/18 23:51
1はちょっと本気っぽいな。 がんばれよ。
あ、しかもちゃんとpart2ってあるな・・・ || Λ||Λ ( / ⌒ヽ | | | ∪ 亅| | | | ∪∪
6 :
manko_chinko :02/06/18 23:53
カーネルだけで何万行ぐらいだろう、、、
7 :
デフォルトの名無しさん :02/06/18 23:53
linuxとOSASKを並列にするのもどうかと思うが・・・ けどアセンブリで書かなきゃいけないところってそんなに多くないよね。
アセンブリで書かないと逝けないのはブートローダーと、 IO関係でタイミングがシビアなドライバだけ。
>>4 ありがとう。
>>6 そうですね。途方も無いですね。
しかも、洗練されたコードが数万行・・・
それよりも、デバイスドライバーがきついかも。
>>7 そうなんですよ。
一部アセンブリ(パフォーマンスが重要なところ。。。)
ですよね。
10 :
デフォルトの名無しさん :02/06/18 23:56
ユニックスのソースコード int main(){ for(;;) getChar(); }
>>8 アセンブリって、CPU毎に違うんですよね?
何か良い参考書をご存知ありませんか?
特にOS作成にかかわる部分で・・・
13 :
デフォルトの名無しさん :02/06/19 00:01
ひげぽんって何歳?
1>>にも書きましたけど almost javaでOSは無理っすかね? 優秀なnativeコンパイラがあれば出来るのでしょうか。 JavaのほうがCよりも得意です・・・
15 :
デフォルトの名無しさん :02/06/19 00:01
アセンブラなんて、大学の時の授業で、Win上で動くZ80エミュレータ用 の書いたのが最後だ、、、。
>>11 >インテルのマニュアル
うぅ。
やはりそうきますか。
>>13 24才です。もしや年齢制限あり?
18 :
デフォルトの名無しさん :02/06/19 00:04
そうそう。前から思ってたんだけど恥かしくて聞けなかったので聞く。 よく言う機械語ってCPUが解釈できる言語(?)というかデータと教わったけど、 OSによってバイナリコードって違うじゃん。 ってことは、OSがexeファイルとかを機械語に翻訳してるの?
>>16 thanks!!
しかも日本語じゃん。
なんかわくわくしてきた。早速読ましてもらうよ。
これだけでこのスレッド立てた意味があったよ。
間違ってたら誰か突っ込んでね。
>>18 .exeファイルそのものが実行イメージだと思う。
メモリーにロードされてそのまま実行されるんじゃないのかな。
>>21 恥を忍んでさらに聞く。
じゃあ、exeファイルもx86系のCPUで動いてるほかのOSのバイナリ
コードと(ヘッダとかそういうの除いて)同じなわけ?
OSによって違うのは、ヘッダとか、データとの 配置レイアウトとか、DynamicLinkするテーブルとか。 実行される機械語としては、OS毎に違いは(あんまし)ない。
>>23 そうなんだ、、知らなかった、、。ありがおつ
25 :
デフォルトの名無しさん :02/06/19 00:13
つかぬ事をお聞きしますが、Windowsはどんな言語で組まれているんでしょうか?
>>22 OSによって異なっているハードウェアへの制御のコードの部分もあるから
まったく一緒で互換性があるとはいえないじゃないかなあ。
うーん自信なしです。→誰か識者さん助けて。
27 :
デフォルトの名無しさん :02/06/19 00:14
28 :
デフォルトの名無しさん :02/06/19 00:15
あと、システムコールとか違うだろ
>>25 昔C++で組まれていると聞いたことがあるがどうなんでしょう。
>>23 THANKS これからもよろしく
>>25 それは聞いた事ある。
基本はC/C++で、MFC使って書いてるらしい。
このMFCも外部に出してないMS秘蔵のMFCがあるらしい。
ま、OSでも上層部分の話だろうけど。
31 :
デフォルトの名無しさん :02/06/19 00:16
どんなC/C++コンパイラ使ったんでしょうか
まあ、どの部分までを"OS"って呼ぶかだよな、、
33 :
デフォルトの名無しさん :02/06/19 00:17
おほほ領すレの予感
NTのカーネルのソースは見てみたいね。 マイクロカーネルなんですかね?
>>31 INTELってコンパイラ出してましたよね。
あれってどういう開発者が使うんでしょうか?_
デバドラ関係?
>>34 いや………当初、それがウリだったんですが。
>>30 C++なら、ある程度はオブジェクト指向でかけるので
C ONLYよりはいいかも。
でも秘蔵のMFCってやだなあ。
>>36 やっぱりそうなんですか。
最近なんかの本に書いてあったのを見た記憶があります。
ある程度は成功してるってことですよね。
俺も、UNIX(初期のじゃない)がC書かれたように C++で独自OS(高性能)を書いて見たいですね
>>36 マイクロカーネルは、カーネルを細かいモジュールに分けて
複雑さを取り除こうという概念ですよね。
きちんと役割分担をもたせる。
でもそれって、モジュール間の関連が複雑になるんですよね。
モジュール数が増えれば増えるほど・・・
>>39 おいらもっす。
ていうか、ここで同志を見つけたり
自分のモチベーションを上げたいですね。
どうなんでしょうか。 既存OSをベースにするならunix系かなと思うんですが、 必ずしもunixの設計が理想的とはいえないと本で読んだことがあるし 分散化とか考えたら頭がパンクします。
>>40 モジュール感の関連を疎遠な物にするためのマイクロカーネルだが。
複雑なのはモノリシック
>>43 おお。モノリシックとは何ですか。。
勉強になります。
46 :
デフォルトの名無しさん :02/06/19 00:37
atheosとかは?
47 :
デフォルトの名無しさん :02/06/19 00:38
>>45 thnx!今はvmwareがあるから便利だね。
Powers CEベースのOSを作るというのはどうですか?
スレッドがにぎわってきてうれしいです。
>>46 明日会社で見て見ます・・・
>>47 vmware上でOSの実験とかって出来るんですかね。
ブートとか。
vmwareつかったこと無いです。
51 :
デフォルトの名無しさん :02/06/19 01:18
52 :
デフォルトの名無しさん :02/06/19 02:06
漏れはPowers CEでOSを勉強した。
Powers CE ってなんだ? ググってもそれっぽいのが引っかからないが。
patroで検索
さっぱり引っかからん。 直リンくれ。
>>51 ありがとう。
初めて読む486本屋で探してみます。-
さてまじめにOSを作ろうとしている(または挫折した人) お話をぜひ聞かせてください。
絶版
>>59 まじっすか???
むしろ図書館で探すか。
atheosちょっと見てみました。 やはり、ある程度はアセンブリが必須なんですかね。 vmware誰か使ったことあるっすか???
アセンブラとかの本は需要が無いのか絶版多し。
65 :
デフォルトの名無しさん :02/06/19 23:51
便乗質問。 昔あった98テクニカルデータブックとか IBM PC-ATハードウェアバイブルとか この手のに相当する資料って今はどっから入手するものなの?
持ってる香具師からもらうしかないんじゃないの?
>>64 そうですね。本当にごく少数の人しか今は使わないですよね。
アセンブラで書く部分はコード的には量は少ないけど
きっと重要なところなんですよね。
>>66 ドライバ屋なんかが参考にする書籍って売りに出てないのかなぁ。
>>68 見つけたらぜひ紹介してください。
68さんもOSを作ることに興味があるんですか・
よく見たらアセンブラのスレッドがありますね。 ちょっと今から読んでみます。
>>69 興味はあるけど時間はない(藁
テクニカルデータブックなら手元にあるから
古い98を買って何か作りたいなーなんて、たまに思うくらい。
98関連の資料なら スーパーテクニック、テクニカルデータブック、GDCテクニカルブック、プログラマーズバイブル あたりが転がってる。 ほしけりゃ捨てメアド書いておいてくれ。
>>71 なるほど、確かに時間は無いですな。
会社でこっそりやろうかな。
うちも9821があまってる。すごい重いノートだよ。
ひげぽんぽんは今までどんなもん作ってきた?
N88ベーシックから始まり C,C++,java,perl, ruby をかじりつつ 今はSEやってます。SEって言ってもほとんどPGですが、 うーん何を作ってきたかといわれると困る 仕事では、CでCGI書いたり、シェル書いたり・・・ javaだとftpクライアントもどきとか・・・ オセロとかも作ったなあ。
>>72 98は意外とオンラインで資料が手に入ったりするからパスかな。
それほど凝った入れ込み方は今更しないだろうし。
ATコンパチの方が欲しいけど、ないんだよなぁ。
77 :
デフォルトの名無しさん :02/06/20 15:28
昨日から少しずつアセンブラの勉強の準備を始めました。 「はじめて読む486」は見つかりませんでした。 週末に大きい本屋に行ってきます。 識者の方に質問なのですが、 OSを作るうえで、アセンブラでしか書けない部分というのは、 以下の2つの観点からはどのような感じなのでしょうか。 ・OS全体に占めるコードの量の割合 ・OS全体の機能の中で占める、重要さ
まず気にする部分はブートローダーだけ。 百〜千行程度。 ドライバとかはそれこそデバイスによって様々なので、定量化できない。
>>81 なるほど。
ブートローダーの部分ですが、これって一から書くのでしょうか。
ある程度は、既存のものを参考にすればよいのでしょうか?
ブート後の処理も良く分かってないなあ。
どなたか参考URLを教えてください。
>>80 識者じゃないが、
一般的に言って、ハードウェアを直接弄る部分は
アセンブラで書かないといけない。これには他の手段はない。
ハードを制御できなければ使い道がないから最重要部分であるのは間違いない。
ただ、その分量はどういう構成にするかによって随分と変わってくる。
これも大雑把な例示をすれば、
アプリケーション→ドライバ→OS→ハードウェア
という風に、ドライバの代わりにOSが
ハードウェアへの直接アクセスを常に代行するのなら
OSにハードウェアの基本操作ライブラリを入れればいいので量は減る。
しかしオーバーヘッドが入るので速度は遅くなる。
アプリケーション→ドライバ→ハードウェア
こんな具合にドライバが直接ハードウェアを操作するのなら
オーバーヘッドは減るが、コードが分散するので量も増える。
また、このような形だと全体制御、エラー処理などの問題も出てくる。
どちらがいいかは状況による。
ブートローダ、デバドラ、メモリマネージャ、スケジューラ、あたりはアセンブラだな。
マイクロカーネルで作るんでしょ? ハードウェアもioサービス等を通して高級言語からいじるべき。
NOWSMART OS は、実際に売れるかどうかは不明。 しかし、日本では珍しく、DOS 系と相性がよい OS だし、 最近のマスコミによる、日本のソフト技術者のレベル軽視 に対する良い反例になってるんじゃないかな。
>>83 >>85 なるほど。
ところで既存の代表的なOSは
アプリケーション→ドライバ→OS→ハードウェア
アプリケーション→ドライバ→ハードウェア
のどちらを採用しているのでしょうか。
OSを作ろうとした場合、
もちろん最初の設計が一番大事だとは思うのですが、
まずは、動くものを作りたいというのが人情じゃないですか。
その際の第一の壁がブート部分かと・・・・
でもやると決めたらやるしかないですよね。
マシンをお釈迦にしたくないのでvmware上で実験できれば良いのですが
どうなんでしょう。
88 :
デフォルトの名無しさん :02/06/20 22:22
オライリーの詳説linuxカーネル読んだ人いる? 誰か感想きぼんぬ。
アプリケーション->サービス->ドライバ(->OS->IOサービス)->ハード
>>89 ではOS製作者は、OS,IOサービス,ドライバーを
実装すればよいのでしょうか。
マジで初心者なんだけど、Cとかで書いた場合、コンパイラはどんなの使うの?
>>87 > アプリケーション→ドライバ→OS→ハードウェア
> アプリケーション→ドライバ→ハードウェア
> のどちらを採用しているのでしょうか。
アプリケーション → OS → ドライバ → ハードウェア
だと思うが。
> その際の第一の壁がブート部分かと・・・・
今出てるインターフェース誌を買って読むべし。結構詳しく載っている。
>>91 コンパイラは普通の奴。ヘッダファイル/ライブラリが違う。
>>91 あ、それ私も知りたい。
まずは環境構築ですよね。
一番大事なのはリンカ。 自分のOSに合ったバイナリイメージを作らないといけない。 それから、通常は提供されている標準C/C++ライブラリは使用できない。 >アプリケーション → OS → ドライバ → ハードウェア この形式だと、機能追加=OS(カーネル)の再構築だったりするから、 サービスを挟むべき。 それから、ドライバもユーザーモードドライバはOSやIOサービスを経由してハードをいじる カーネルモードドライバだけが直接ハードウェアをさわれるようにするべき。
とりあえず立ち読みでもいいから目をとおすべき。 「Lion's Commentary on UNIX」アスキー x86なら>51の言ってたタネンバウム先生の 「オペレーティングシステム」 どちらもコンパクトなコードが載ってるので即役立つはず。
>>95 言いたいことはわかるが、ここのレベル考えて書いてる ?
ドライバのダイナミックロードやユーザーモードドライバなんて言うのは
一応OSができてからでもいいと思うぞ。
レベルのことを言うんならJava方式だと思うが。
99 :
デフォルトの名無しさん :02/06/20 23:23
ここってネタスレ?すげー笑えるんだけど。
DX8SDKどこでダウソ?
>>98 ,99
うう。レベルが低いのは認めますが、
ここは出発点ということで徐々にレベルアップします。
少なくともやる気はある。
十五歳の誕生日にオペレーティングシステム 第2版買ってもらうことにしました。
>>102 もし本当に15才ならぜひ、将来良いOSを作ってください。
うーん若いですね
99=104 暇人
スレのレベルが高ければ誰も荒らしたりしないよ アホがageるから荒らされる
110 :
ひげぽん :02/06/21 00:00
>>88 さっき本屋で立ち読みしてきました。
OSを作ろうとするといろいろな事を考えなければいけないこと
があると痛感しました。
アセンブラの環境はnasmにしようかと思うのですが、
他にお勧めのものありますか。
いや、nasmがベストかと。 まぁ、漏れはTASM5.0とかでも良いと思うが
ほんと、低級PGってどこにでもいるんだね(笑
>>109 > スレのレベルが高ければ誰も荒らしたりしないよ
関係ない。どんなレベルのスレでも荒らされる時は荒らされる。
とにかく、「荒らし」には無視しかない。匿名掲示板の宿命だよ。
>>112 自分のことだろ
プログラムすら出来ないんでしょ。
116 :
ひげぽん :02/06/21 00:11
>>111 ありがとう。
さあて、nasmのドキュメントを読むか(英語)
コンパイラにgccを採用するならnasmじゃなくてgasにした方が親和性高いかもしれない。 インラインアセンブラでnasm使用できないでしょ?
>>113 なぜ荒らされるのかを認識しようとしないのは、思考停止してるだけ。
だから荒らされるんだよ。
もう荒らしの話は終わりに汁
>>117 実は開発環境をlinuxと、WindowsXP proどちらにしようか迷っております。
linuxマシンはスペックが低いのでOS実験機(オシャカになってもいい)
そうすると、gasは無理かもしれないです。
でもかなりの利点があるならメインマシンをlinux&XP のデュアルブートにしようかな。
121 :
デフォルトの名無しさん :02/06/21 00:21
OS板行けばと思ったのは俺だけかな?
開発マシンは関係なくて、採用するコンパイラが問題。
コンパイラなんぞ自分で書けばいい。 ハードの資料と時間と根気が最大の問題。
>>122 >>123 すいません、話についていけてません。
gccって、unix系用のコンパイラじゃないんですか?
もちろんここではcygwinは考えないとしての場合ですが。
125 :
デフォルトの名無しさん :02/06/21 00:28
>>123 実用レベルのコンパイラが簡単に書けるわけねーだろ!
ゴルァ!
>>125 てめーの実業務用の実用コンパイラなら幾つも書いてきてますが何か?
コンパイラを作るスレになりますた
>>127 ハイハイ、わかったわかった。一生そう言っててくれ。
文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。 こんなもん自慢になるかっつーの。 そんなことよりハードの資料。 BIOS叩くにしてもそこそこのもんが必要だろ?
>>126 使える!!!
今の私には最高のスレッド
>>124 別にUNIX用ってわけじゃないが。
つーか、こんなレベルでOS書けるんかいな?
135 :
デフォルトの名無しさん :02/06/21 00:42
問題はひげぽんが死ぬまでに形になるかだな・・・
(笑
>134 Onani-System なら書けるかも
>>131 > 文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
「実用レベル」と言う言葉が見えないのか ? それとも、一般人と定義が違うの
か ? いずれにせよ、スレ違いだからどっか逝ってくれ。
>>138 待て待て。喧嘩を売ったのは125。俺は「お前はバカか」と言っただけ。
実用レベル云々は色々と反論したくもあるがここでやるつもりはねぇよ。
一応5年計画です。 さすがに死ぬまではやらないかと(冗談を真に受けてる)
とにかくもっとアセンブラやハードウェアについて勉強した方がいいね。 今の知識だと、着手してからがとても大変だと思うよ。 昔は、アセンブラの初歩として「はじめて読む8086」をよく薦められた。 もしどこかで手に入るのなら読んでみるといいかも。
142 :
デフォルトの名無しさん :02/06/21 01:00
>>141 オレモテルヨ!
はかにも「初めて読むアセンブラ」もZ80を理解するのによかたよ
>>141 確かにハードウェアの専門知識は皆無です。
PC自作したり、RS232CにLEDつないで遊んだ知識は一切役立たず・・・
週末は本探しからはじめます。
>>139 >>123 付近の話の流れで、唐突に「コンパイラなんぞ自分で書けばいい。」と
言う発言はいかがなものかと。突っ込まれてもしょうがないと思うぞ。
アセンブラもろくに知らんとOS書くやつがいるんか いやBASICでOSだっつやつもいるが… こんなんではブートしてもプロテクトモードにはいるときにBIOS叩きで氏ぬのがオチ
>>145 これから勉強すれば良いんじゃん。
何を言ってるんだか・・・
せいぜいがんばれよ
>>145 OSを作りたいと思う。
→アセンブラが必要と分かる
→アセンブラ勉強する
→CPU等ハードウェアの知識が必要と分かる
→勉強する
→ちょっと作ってみる
→失敗!!
でもその過程が楽しい(少なくとも私は)のでよし!!!!
>>144 あー、それは済まなかった。申し訳ない。
(´-`).。oO(ひょっとして俺に責任があるのか?)
コンパイラ云々もたしかに大変だけどそれ以上にc言語で書くなら、 それのライブラリを作るほうが大変という罠。
割り込みとメモリ管理、タスクディスパッチのハザマで死ぬであろう。
>>152 それを思うとやっぱりgccしか選択しないなと思う。
GPLかぁ。。。
155 :
デフォルトの名無しさん :02/06/21 01:57
いまどきデバイスドライバがアセンブラってのはどんなOSだよ vxdのヘッダだけとかじゃねーの? 初期化(ブートローダ) 仮想メモリ 割り込みハンドラ ロック機構 くらいじゃねーの?
デバイスドライバって言ってもOSのカーネルモード通すんだったら アセンブラで書かなくてもいいよな。 本当にアセンブラで書かなくてはいけないのは、むしろBIOSだな。
gccで生成したコードはGPLじゃないよ。 glibcを使わなければいい(どうせ使えない)
159 :
デフォルトの名無しさん :02/06/21 02:51
本気でやる気があるのなら、手短に 最初に作るのはローダーといいたいところだけど、もっと簡単に ハードディスクからブートして画面にメッセージでもだすプログラム作るといいよ。 そのあと、割り込みとメモリ管理をするといいです。 それもいきなりハードディスクを使ったページングとかはせず、 単純に仮想アドレスを実アドレスにマップするのを作ってみるといいです。 そうこうしているうちに、手探りの作り方ってのが分かってくるから、 そしたら、OSの理論本でも見て設計するといいです。 最初はCを使おうとか考えたらダメですよ、オールアセンブラです。 やり方がわかってきたら、全部アセンブラで書くのが面倒になってきますから そしたら C で書いてみるといいです。 実のところここまでできれば後はたいしたことは無いです、思いのまま設計するよろしいです。
>>159 HDDはパラメータ周りとか結構めんどくさいんで、
実際に画面が出て動くまでをフロッピーでやることを勧めたいんですが。
161 :
デフォルトの名無しさん :02/06/21 03:07
ああ、確かにそうですね。 後86特有のあの変なモードとかセグメントとかも先になれてから メモリ管理がいいかも知れません。 しかし、86ッテヤダネェ
ポインタさえ殺せば仮想メモリ管理いらんやろ。 仮想マシンの線で言った方が楽やと思うで。 最近はなんやJavaや.NETやゆーて流行ってるみたいやし。
いっそ、最初はP/ECEで試作した方がいいかも。 ハードウェアは単純で、カーネルソースも公開されているし、CPUは RISC物なので、x86のセグメントみたいな嫌らしさもない。
>>164 んでもエプソンのチップってイヤになるほどマイナーじゃない?
WonderWitchをさわった方がx86系だし良いんじゃないかな。
>>163 そらOSは作ったことはないけどやな。
たとえばJavaVMやったら
任意アドレス指定が可能なオペレーションは排除されとったと記憶しとる。
各種の変数は事前に囲い込まれた範囲内でしかアクセスでけへんし
オブジェクト境界を超えるアクセスは全部VM上でチェックが入る。
あれやったら、仮想メモリ管理、ちゅうか、アドレス空間の隔離はせんでも
安全に動くもんが実装できるんとちゃうんか?
ページングの話はまた別な。
これも習作のOSとして大目に見るんやったら
仮想メモリ管理なしで類似品が作れると思うで。
どっか間違うてるか?
>>162 本質的にVMはOSが発行するメッセージ、割り当てたメモリ,I/Oに対して
アクセスするのでそれ単体では何もでん。
JAVAチップもしかり。
>>167 VMがCPUそのもんやと思てると?そこまでアホなこと言うかいな。
JavaVMみたいに、あらゆるアクセスが検査対象となる構造やったら、
実行時に動的にアクセスを制限するようなことをせんでも、
JITなりを通す段階で安全な処理に落とし込めるやろっちゅう話やがな。
x86のプロテクトモードやGDTやらLDTやらゲートやら面倒くさそうやからな。
そんなん弄るぐらいやったら実行バイナリを仮想コードで統一しつつ
裏ではJITなんかで調整して基本的な命令しか使わんような
単純な構造にした方がええんちゃうか言うてんねん。
これやったらI/O命令と割り込みぐらいでどうにかなるはずや。
それともこういうことはできへんのんか?
>>166 >>1 が作りたい物を作るのが一番なんだから、
横から口を挟むのはどうかと。
170 :
デフォルトの名無しさん :02/06/21 03:31
>>165 手始めにWonderWitchはいいかも、簡単に手に入って
しかも86系アセンブラになれるのにももってこいですね。
あれって確か発売元バンダイでしたっけ?
>>169 こっちの方が楽ちゃうかぁ、思うてな。
参考程度に聞いたって。>1
(´-`).。oO(ワンダーウィッチ・・・・まだあったのか。)
173 :
デフォルトの名無しさん :02/06/21 03:35
>>172 えっひょっとしてワンダーウィッチ・・・・もう売ってない?
WonderWitch、まだ売ってるよ。 x86のアセンブラに慣れるには、確かにいいかもしれない。
WWが終わった後も386の壁486の壁が待ってるからな。
>>175 壁は286,386だけでしょ、後は大体みんないっしょ
>1 はまず標準入出力関数を作ってモニタプログラムを 書かなければいけないだろう。 それから記憶装置からブートだな。 そして最後にタスク、メモリ管理と。
178 :
デフォルトの名無しさん :02/06/21 13:03
ガタガタ言わずに月刊InterFace7月号買えよ
>>179 > Cのライブラリ等は何を使えばよいのでしょうか。
Interface 7月号買ってんだったら P.55 から読んでみたらどうよ。
183 :
デフォルトの名無しさん :02/06/21 22:07
>>182 P.55 に書いてある Chapter1 のタイトルをここに書いてみろよ。
あんた以外は、俺が何を言いたいかわかるはずだ。
(で、どうすればいいかは Interface を見ればわかる。Linux の環境が
あるんなら、まずは書いてある通りやってみればいい。知ってる人には
ちょっと冗長だけど、今までこの手のプログラムを書いたことない人には
なかなかいい記事だと思うよ。)
185 :
デフォルトの名無しさん :02/06/22 17:57
モウオワリ?
ウン、オワリ。
おわりかよ !!
え?おわりですか?
>>188 おまえが決めることだろ。
あれだけのペースで書き込んでいたのに、
書き込みがぷっつり途絶えたと言うことは、
逃げたと解釈するしか無かったからな。
もし本人ならトリップつけろ
http://pc.2ch.net/test/read.cgi/os/996204956/l50 を参考にして
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
を読もうかと思っています。
>>188 は、私ではありません。
インターフェース誌まだ読んでいる途中です。
ところで上誌P55から「標準Cライブラリを使わないプログラミング」
がありますが、
ライブラリを使わない場合、自分でシステムコール系を
アセンブリ言語で書かなければいけないのですが、
>>151 の言っているようにこの部分を独自のライブラリとして
Cへのインターフェースを作成しなければいけないのでしょうか。
上記のライブラリは開発環境として誰かが書いたものに
+α自分で必要なものを書くのでしょうか。
それとも
全部自作??
そういえばunixマガジンもブート特集してましたね。
>>190 普通1からOSを作るなら全部自作
既存の物を持ってきても良いとは思うが、まぁ、基礎だと思って作るのがいいんじゃないか。
一般に提供されているCライブラリはほぼ使えないと思った方が良い。
だからFreeBSDとかLinuxあたりから抜いてくるしか無い・・・かな。
勿論ライセンス問題もあるんだけど。
>Cへのインターフェースを作成しなければいけないのでしょうか
いけないわけじゃないけど、Cのインターフェイスで作らないと
結局全部アセンブラで書く羽目になるし、どうだろうね。
193 :
デフォルトの名無しさん :02/06/23 11:31
マタハジマタ
>>192 なるほど。
システムコール系(全てではありませんが)は
アセンブラで書かなければいけないのですね。
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
買って読んでいます。
まだ最初の数十ページですが、すでに買ってよかったと思っています。
環境構築ですが、インターフェース誌が結構役に立っています。 bochsインストールしようかと思っています。 インターフェース誌紹介してくれた人ありがとう!!
196 :
デフォルトの名無しさん :02/06/23 23:39
Minix本そんなにいいの?
まったくの初心者なので、勉強になるっす。 まったく同じ仕組みでつくろうとは思いませんが、 プロセス間通信とか、パイプの実装とか・・・ 勉強になりますね。
タネンバウム(・∀・)イイ!!
良スレハケーン
キャップをつけます。
OSの魔法使い
2002 06/18 その日、2ちゃんねるの漢たちが立ち上がった・・・。 最高のOSを作るべく。 できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか
開発コード: ひげぽん618 とか
204 :
デフォルトの名無しさん :02/06/24 10:31
OS作りたいんだったら、理系の大学へ進学して NEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。
ブートローダはOSの本質的な仕事じゃないな。 grubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか 「メモリの特定アドレスにkernel imageをロードする機能」 と 「そっから動くカーネル」 は別もんだ。
207 :
デフォルトの名無しさん :02/06/24 18:24
開発コード:ひげぽん0721
>>204 ダメだろ。そう言うところは、自分で OS を1から作ってるわけじゃないからね。
悪く言うと既存の OS を自社のマシンにポーティングしてるだけだよ。
そんなことするぐらいなら、英語の勉強して Linux とか FreeBSD とかのコミュ
ニティに参加した方がいいよ。
>>206 だからなに ?
>>206 だけど、そこがないと話になんないよな。
PC/AT互換機のROM-BIOSの機能とか、どこかで調べられないか?
俺もちーと興味ある。
んで、このスレッドには興味持ったのでコテハンで行きます。
>>208-209 >>206 は
>>155 の発言で ブートローダをOSの一部のように書いたから
それを訂正したってだけだろ。
労力を他の部分に傾けるためにブートローダは既存のものを使うのも良し。
勉強もかねてブートローダからつくるもの良し。
>>210 「ああなるほど、そう言うことか。」って、三日も前の話だし、全然本質
的な話じゃないから正直わかんなかったよ。
OSの技術的な話はまだ勉強中です。 ちょっとにぎわってきたのでうれしいです。 まだ先の話ですが、多少速度に目をつぶっても CPU依存の部分は出来るだけ少なくしたいかなあと思っているんですが どうでしょうか。 ちょっと昨日夢で見たのです(夢ですよ) システムコール系はアセンブラで書き、インターフェース部分をCで書きます。 そして、JINI経由でjavaから呼び出す。 あーめんどくさいなこれは・・・・ でもなんかばかげてて楽しい。 言語はCでは無くC++で書こうかなあ。 そのほうがいろいろ素直にかけそう。
>>212 ×JINI
○JNI
Jini を使ったOSというのもそれはそれで面白いけど。
214 :
デフォルトの名無しさん :02/06/24 23:18
Javaにこだわるなよ
>>213 訂正ありがとう。
>>214 うん。あくまでも冗談です。そんな面倒なことはやってられません。
>>209 ネギトロ氏よろしく。
多少でも興味のある方書き込みしてくれるとうれしいっす。
セマフォ勉強中・・・
217 :
デフォルトの名無しさん :02/06/24 23:39
Javaのyield()ってどうやって実現してるんだろ・・・ ヒントくださーい
>>212 意味不明。
システムコール系って何だ?
低レベルサービスをアセンブラで書いて、
そのインターフェイスをC互換にすると言うこと?
>>218 俺も良くわからんけど、システムコール呼び出しをアセンブラで書いて、
C用のインターフェースを作るってことじゃないの ? プロセッサの動作
モードをユーザーモードから切り替えるには割込みしかないから、システ
ムコールは (インラインでいいけど) アセンブラ使わざる得ないだろう
ね。(ちなみに、OSの受け口もアセンブラで書く必要がある。)
よく考えたら、システムコール呼び出しって変だね。System Call Call
だもんなァ...。
220 :
デフォルトの名無しさん :02/06/25 00:04
意 味 が 通 じ れ ば いいんじゃネーノ?
>>218 システムコールをアセンブリ言語で実装し、
Cから呼び出すことが出来る用にインターフェースを用意するという
つもりで書いたんだけど。
日本語が変だったかな。変ですね。スマソ
インラインアセンブラとか・・・
インターフェースに書いてあるまんまだったりして・・・・
日本語気をつけます。 反省・・・
>>221 > システムコールをアセンブリ言語で実装し、
システムコールの実装って、どこまでを指してます ?
OSって、ユーザープログラムからみるとシステムコール集合体みたいな
もんだから、こう書くとフルアセンブラで書いたOSのように取られるか
もしれないですよ。(そう言う意味で、
>>219 では「OSの受け口も」と
言う表現にしてます。(まあ、まだまだあいまいですけどね。))
>>223 えっと。
まだ一行もソースを書いてないで言っているので
あくまでも計画ですが、
基本的には、アセンブリ言語でしかかけない部分のみ
アセンブリ言語で書く予定です。
結局システムコールの一部をアセンブリ言語で書かざるを得なくて
Cから呼び出せるようにしたいということを言いたかった。
言ってること変わってますね→私
225 :
デフォルトの名無しさん :02/06/25 01:28
ゲーム機はスーファミまではオールアセンブラだったヨ。
226 :
デフォルトの名無しさん :02/06/25 01:31
ひげぽんの開発環境何?
227 :
デフォルトの名無しさん :02/06/25 01:32
>>224 そんなことより1よ。
BTRON作ってくれ。
超漢字買う金がない。
228 :
デフォルトの名無しさん :02/06/25 01:37
229 :
デフォルトの名無しさん :02/06/25 01:42
C#キボンヌ
230 :
デフォルトの名無しさん :02/06/25 05:17
C#ってOS組めるの?
231 :
デフォルトの名無しさん :02/06/25 06:01
今から10年前の某雑誌に、CGデザイナーで著名な方が、「将来、 CGのためのOSを作りたいですね」といってました。 「CGのためのOS?」。当時、OSのことについて何もわからなかった 自分はサパーリ理解せずに読み飛ばしていたのですが、今OSのことを そこそこ理解した状態では、「CGのためのOS」の仕様がどのような ものになるのかものすごく気になるのです。 ココのスレはOSの内部についても詳しい方がいるようなので、もし 「CGのためのOS」を考えるならどういう仕様になるのか教えてください。
GPUを並列動作可能なMPUとして扱うアーキテクチャ。 複数枚のGPU搭載ビデオカードを刺しておけば、 それぞれのカードに演算要求を出し、結果を1つに集約する。
ちょっとシステムコールの実装について誤解があるようなので。
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.スルヤント著
をオススメしておきます。私が高校生の頃に読んでた本だし、難易度的にも丁度いいんじゃない?
>>234 1は23だが、、、
まぁSEといってたから高校生ではないな。
>>234 おっと。
文章はまだ若いということで勘弁してもらえないっすかね。
別にLinuxのシステムコールがことなるセグメントにあるわけじゃないけどね。
>>234 詳しい解説ありがとうございます。
質問です。
ご紹介の本を読めば、分かるのでしょうけど
今ちょっといろいろな本を消化中なもので・・・・
>x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
>異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
同じセグメント、異なるセグメントとは何でしょうか?
240 :
デフォルトの名無しさん :02/06/25 21:28
セグメントって言う言い方誤解を招かないか? セレクタの方が適切だろ。
おもしろそうなので一緒に勉強してます。
ときどきお話に出てくるブートローダ(MBRのことですよね?)やブートセクタ(パーティションの先頭?)を
直接見たり、書き換えるにはnasmとかmasmのツールでできるのでしょうか?
>>159 さんのブートの話はとても魅力的です。どの辺の資料を読めばできるようになるか
教えていただけないでしょうか?「はじめて読む486」でしょうか?nasmなどのマニュアルでしょうか?
よろしくお願いします。
MBRはブートローダーを保存する領域 ブートローダーは保存されるプログラム
>>243 さっそくのレスありがとうございました。
勘違いしていました。
それで、どうやって、ブートローダを読み書きすればよいのでしょうか?
よろしくお願いします。
245 :
デフォルトの名無しさん :02/06/25 23:44
>>244 じぶん で けんさく した ほうが あたまに はいる よ 。
かころぐ を しらべて かんれんせい が ありそうな
きーわーど を みつけて ごらん 。
If you understand , use "google" and go to the mad house. Hyahaha
x86っつっても、80286、80C86、IA-32で、それぞれ呼び出し時になにが起こるかぜんぜん違うしな。
>>244 NT/2000ならリソースキットかインストールCDのdskprobe.exeを使ってごらん。
>>243 くだらん。
>>245 知らないなら知らないと言えよ。(w
>>247 ありがとうございます。2000ユーザなので、家に帰ったらやってみます。
>>246 ごもっとも。
あと、英語が少し変です。
>>247 最初の2行だけにしとけばよかったのにな。
>>248 246へのレスは245へのレスか?
どこが変なのか教えてたも
250 :
ウマさんシカさん ◆vBaka42s :02/06/26 22:36
>>244 rawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?
>>248 がんばってください。
でも、日本語が少し変です。
>>242 242さんよろしく。
一緒に学んで行きましょう。
ちょうどブートのお話が出てきているので便乗質問です。
以下の(1)(2)(3)の認識はあっていますか?
(1)フロッピーディスクからブートする場合、
ディスクの最初のセクタにあるコードが実行される。
(2)(1)で実行されたコードがさらに、フロッピーディスク上の
他のコードを起動することで
OS本体を呼び出すことが出来る
(3)(1)(2)が正しいと仮定して、
あるCPUを載せた、PCがあるとする。
そのPC上でスタティックコンパイルすることにより作成された
バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
上記バイナリイメージをフロッピーディスク上に配置し、
(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
間違いや、認識違いを指摘していただけるとありがたいです。
253 :
デフォルトの名無しさん :02/06/27 00:04
>>245 understandの時点でうそ英語
馬鹿丸出しだね。
鈴木アグリー
255 :
デフォルトの名無しさん :02/06/27 00:13
>>253 understoodにするの?
教えてくれ。
256 :
デフォルトの名無しさん :02/06/27 00:20
あんでーすてんど
0000 0001 0000
258 :
デフォルトの名無しさん :02/06/27 06:17
>>232 電波だから気にしない方が良い。
水彩画家が『将来、アーティスティックなビルを建ててみたい』と言っているような物だから、
>>1 第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
一から勉強しながらOS作ろうっていうのがきついな minix,linuxを解析したほうが近道だろ 今のレベルでは素人がいきなりオリンピックに参加するようなもの
260 :
デフォルトの名無しさん :02/06/27 08:35
>>259 いや、学問に王道なし。
minixとかはOSとはなんぞやComputerとはなんぞや、Architectureとはなんぞや
がわかってからで遅くはない。
むしろ、わかってからならば早く理解できる。
まぁ、
>>1 はOADGとかも知らないだろうし、OSを組むのは1年早い。
>>260 そういうのを勉強しながら学ぶのにMinix本は最適なんだけどねー
なあ。なんで、どうでもいいお説教するやつ多いんだ。 おまえらじいさんか? どうせ自分じゃ何にもできねーんだろ。 うざいから、「検索しろ」だの「もっと勉強してから」だの言うなよ。
263 :
デフォルトの名無しさん :02/06/27 11:10
作りながら学習するのは楽しいぞ 楽しいからプログラミングする まさに本来の姿
>>258 >第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
必要性を示してください。
別に2種持ってないとOSがつくれんわけじゃないが、2種取れる程度の知識もないと、 OSの勉強すらままならんだろ。
あんつーれべるのひくさだ。
>>265 >2種取れる程度の知識もないと、OSの勉強すらままならんだろ。
これは同意。
でも
>>258 は「受けろ」と言ってるから。
基本情報処理技術者試験を受験する必要がどこにあるのかと。
268 :
デフォルトの名無しさん :02/06/27 21:14
>>267 粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
269 :
デフォルトの名無しさん :02/06/27 21:28
270 :
デフォルトの名無しさん :02/06/27 21:46
>>269 粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
^^^^
271 :
デフォルトの名無しさん :02/06/27 21:49
>第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
えーと。大学のときに受けて取得しました(汗)
今は名前が変わったんですよね。
なんだか、すごい自分が馬鹿な質問ばかりするからなんだろうけど
誤解が・・・
>>260 >>261 今現在、↓の本を読んで勉強中です。
minixのソースも多少読んでいます。
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
アセンブラができる人に質問です。 x86系のアセンブラ入門には、 NASM と gas(as)どちらが適しているでしょうか。 またアセンブラに関して ASKAを使用したことのある人いますでしょうか。 ASKAを使用する上でのメリット、デメリットを教えてください。
274 :
デフォルトの名無しさん :02/06/27 22:57
ひげぽんって無職?
nasm使っておけって
>>274 へなちょこSEです。
>>275 出来ればgasを薦めない理由もしくは、NASMを薦める理由
を教えてください。
>>276 gasのニモニックは少なくともx86環境に置いては一般的じゃないから
>>277 なるほど。
そろそろフロッピーブート&アセンブラHELLO WORLD
に取り組もうとしてたところなので助かります。
貴重なアドバイスありがとう。
279 :
デフォルトの名無しさん :02/06/27 23:26
OS作れるとどうなるの? 芸津のようにお金持ちになれるの? 自己満足?、要はオナニーソフト? OS作った先の未来にはナニが待ってるの? お家に帰ってきたら足の臭いお父さん達が、頭を禿に しながらせっせと築き上げてきたOSがそんな簡単に 出来上がるものなんの?
280 :
デフォルトの名無しさん :02/06/27 23:41
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪ なんてありきたりなんでしょうね♪ 誰もが皆、一瞬つけてみたくなる発想のレスです♪ しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、 こういうレスは控えます♪ しかし、この人はしてしまったのです(^^;ワラ 「誰もが思い付くような事」を堂々と♪ この人にとってこのレスは何なのでしょうか♪ このレスをしている間にも時間は刻々と 過ぎ去っているのです♪ 正にこの人のした事は「無意味」「無駄」でしかありません♪ ああ・・・何ていう事でしょう(^^;ワラ 図星で泣いちゃうかも(^^;ワラ
元々、無駄なスレに無駄なレスをつけて、無駄なレスを返す
>>280 や他も馬鹿っぽいよ(^^;ワラ
特に
>>280 は海馬にカビが生えてる。キモ
こういうときはおとなしくツレタ!、とか書いておけばいいんですよ。
283 :
デフォルトの名無しさん :02/06/28 00:15
マジレスがかっこ悪いというのには反対だけど コピペにマジレスはさすがにかっこ悪いと思うよ
>> 279 つくれるからどうというわけでは、ないでしょう。 でもその作る人にとっては、その作る上での技術を実際に体で 覚えられて経験上いいのではないでしょうか? また、「そりゃオナニーソフトだろう!」といわれたって、 「自分が気持良い」ソフトが一番うまく書けるということはないですか? それで他のみんなも気持良ければもっと良いでしょう。
285 :
デフォルトの名無しさん :02/06/28 17:20
>>272 ほんとかよ。
てっきり俺はJava専門プログラマかと思ったよ。
>>264 上の理由により。
OSを作るならノイマン型コンピュータの基礎くらい知っていて欲しいのでね。
Java環境だけじゃなくて。
minixを参考にするのに良い点はx86用OSを作るときの例としてだと思う。
minixがOSだと思うと、x86以外は取っつきにくくなっちゃうか、
後で後悔すると思うな。
あれはOSだがOSはあれではない。
もっと広い視点と腰を据えた覚悟と長期計画が必要だと思うな。マジでやるんなら。
趣味でやるら、まず、コード書いてNETに上げてみな。まずはそれからだと思う。
287 :
デフォルトの名無しさん :02/06/28 18:38
>>285 自信満々みたいだけど何が言いたいのか分からん。
表現力不足なのか分かってないのか。
いまのままじゃオナニー演説。
プログラマーならカキコでオナニーするんじゃなくて 作品でオナニーすべきだな。
289 :
デフォルトの名無しさん :02/06/28 20:03
プログラマーならオナニーはしない。
290 :
デフォルトの名無しさん :02/06/28 20:49
マーはニーしる!
291 :
デフォルトの名無しさん :02/06/28 21:04
ぶっちゃけ、特定のハードウェアを限定するようなOSなど、真のOSではない。 ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。 x86限定のOSなんて作るくらいなら、WindowsかFreeUNIXで十分だ。
292 :
デフォルトの名無しさん :02/06/28 21:08
>x86限定のOSなんて作るくらいなら、WindowsかFreeUNIXで十分だ。 きっと作る事に意味があるんだよ。 ゲームだって、しょぼくても作るとたのしいじゃん
>>291 それがJavaや.NET。 などといってみるテスト。
294 :
デフォルトの名無しさん :02/06/28 21:39
>>291 つまり、x86、Alpha、68、PowerPC、Sparc、
SH-3/4、ARM、V30 でも動くようにしろと。
296 :
デフォルトの名無しさん :02/06/28 22:08
ひげぽんさんがんばってなー そのうち、すげーへなちょこでいいから公開してや。 個人的にはDOSがいいなぁ。一枚ね。 くっだらねぇのでいいからゲームとかつけちゃってさ。 オセロとか、もうこの際数字あてゲームでもいいや。 シェルもあるんだかないんだか、suujigameとexitしか受け付けない みたいなね。 もう起動してから5分位であきちゃうのよ。 でもなんかね、 お、ひげぽんのOSちゃんと動くじゃん、みたいなね。 極端な話、そんなんでもいいと思うのよね、俺。 OSなんてとても作れそうにない俺にはきっとうらやまスィーのよね。
297 :
デフォルトの名無しさん :02/06/28 23:12
>>252 (1)-(3) PC/AT,PC-98xx,X68kに関して言えば、yes.
>>296 それはOSなのかと小一時間問いたい。
小学校に直起動のゲームがあったけどどっちかといえばそれに似てるな。
299 :
デフォルトの名無しさん :02/06/28 23:53
>>298 うーむ。それもそうだな・・。
まぁひげぽんさんの話ぶりだと
理想みたいなものはあるんだろうからして
そこまで極端ではないだろうけどね・・
300 :
デフォルトの名無しさん :02/06/29 01:59
>>292 おれはユーティリティ作る方が燃えるけどな。
システムを完全に、俺好みの方法でコントロール下においてやるぜグハハハハ。
って感じで。
301 :
デフォルトの名無しさん :02/06/29 02:04
>>293 Javaは実行環境。
.netはMS独自仕様プロトコル。戦略的にはRFC無視の方向で逝きたいんだろうな。
302 :
デフォルトの名無しさん :02/06/29 02:04
おれは足回りを作るのが好き I/O直叩き、デバドラ作成は楽しいよ 最近ディスク周りとかがマイブーム USBはターゲットもホストも簡単すぎてつまんない
303 :
デフォルトの名無しさん :02/06/29 02:13
>>302 すげー。いろいろ教えて欲しいよ。
あのさぁ、PCMCIAのドライバとかも作れる?
まあ煽りはほっときましょう どこのスレにも蛆のようにわいてくるんだから。
PCMCIAはPCIやISAをいじった人なら全然難しくないよ というかそのあたりを学ぶ過程で必ず PCMCIAは難しくないというのを知るし。 1394は手元に資料が何も無いんでパス。 つーか流行ると思わなかったから何も勉強してないし・・・
めちゃくちゃおもしれーじゃねーか c++の勉強してんのにハードの勉強させんなよ(笑) 俺もOSつくりてー でもまずはc++(笑) 23か、若いなぁ...俺今18だけど23でそれできるかなぁ... 頑張ってくださいsageながら見守ります
>>306 デバイスドライバの作り方の説明って、要約すると
「init と open と close 作りなさい」って感じじゃん?それはまあ分かるんよ。
でも、実際に目の前にPCカードが一枚あってそのドライバがネットには
いくら探しても無くて、自分で作るより他に手は無いってなったときに、
具体的にどうやってその init やら open やらを作ればいいの?
当然メーカーのウェブページに細かい仕様が載ってるわけでもなし、
どのIOポート(でいいのかな?)にどんなデータ送るとどんな風に反応するか
分からなくて、、、。
そういう情報はどっから手に入れる?
基本的にボードメーカは何も知らないフリをするから要注意。 すべてチップから想像するって感じ。 まず、とりあえずダメ元でメーカに電話。 平行してgoogleで全言語で検索。(日本語には情報はまず無い) さらに似たようなチップを使ってるデバイスの Linux(*BSD)のソースを見る。で、使えそうなら丸パクリ。 月刊インターフェイスのバックナンバーは捨てずにとっとく。
WinのドライバはよくわからんけどLinuxのドライバは 作りがバカみたいに単純(だから弊害も多いけど)。 NIC関連のソースはひじょーに勉強になったね。
って、OSからかけ離れてるな・・・ OSの華はやっぱりスケジューリングとメモリ管理だよね。 ファイルシステムも面白いけど、2の次だよね。
>>309 そっか。やっぱドライバ作る奴ぁすげーな。俺にはとても出来そうにない。
グラフィックスもだろう
>(1)フロッピーディスクからブートする場合、
> ディスクの最初のセクタにあるコードが実行される。
>(2)(1)で実行されたコードがさらに、フロッピーディスク上の
> 他のコードを起動することで
>OS本体を呼び出すことが出来る
>(3)(1)(2)が正しいと仮定して、
>あるCPUを載せた、PCがあるとする。
>そのPC上でスタティックコンパイルすることにより作成された
>バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
> 上記バイナリイメージをフロッピーディスク上に配置し、
>(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
>>297 ありがとう。
ひげぽんの当面の目標は(3)かな
>ぶっちゃけ、特定のハードウェアを限定するようなOSなど、真のOSではない。
>ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
>
>>291 私も同意見です。
ただし、1からこれを実現するのは難しいと思います。
ある程度メジャーなハードウェア環境で動くOSを作ることからはじめて、
あとで他の環境でも動くように移植すればいいと思っています。
もちろん出来るだけハードウェア依存する部分は少なくすることは心がけます。
>>296 ありがとう。
296さんもあきらめず。作ってみては?
317 :
デフォルトの名無しさん :02/06/29 13:58
お〜おもしれ〜じゃん。俺も参戦するぜ! で、例えばフロッピーからブートして"helloworldプログラム"表示させるのにファイルシステムを 作らなきゃダメなんですか?
CSH読み込んでLBA算出すればファイルシステム何ぞイラン。
じゃあみんなで手分けしてやろうぜ。漏れ helloworld担当でいいすか?(汗
320 :
デフォルトの名無しさん :02/06/29 15:50
javaで書けない部分とはアセンブラオンリーの部分を除いて具体的にどこなのだ。
なぜそんなにJAVA、JAVA言うんだい?
javavm
>>291 ハードウェアってどの範囲を指してんだ ? プロセッサの種別か ? 使ってるバス
のアーキテクチュアか ? ここら辺を特定しないで...
> ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
なんて言ってる奴は、多分真の厨房だろうな。
そう言う目的のOSと言うものもあるだろうし、ちょっとしたハードウェアの違い
を吸収すると言う目的は理解できるけど、ちゃんとやろうとすると苦労多くして益
なしになるのがオチ。極端な話、スーパーコンピュータから携帯電話まで同じOS
が走ると思う ? (そりゃ極端過ぎるよと言うかも知れんが、J○va なんてそれに
近いことほざいてたんだから。UCSD P-Machine の時代から誰もが考えて、誰も
成功していない課題だよ。) それに多くの場合、そう言うハードウェアの違いを
吸収するのはOSじゃなくてデバイスドライバ。だから、対象ハードウェアを増
やすには基本的に人海戦術しかないよ。はっきり言ってそんなことに労力を使う
のは、無駄だし「ひげぽん」が大金持ちでもない限りむり。普通のPCできちん
と動くOSを作るべし。
そうそう、理想論だけで現実的な線での妥協と言う物を知らないのが困る。
x86 AT が基準でイイがあまりべったりだと移植性に乏しくなるってことじゃん。 実際に対応するかどうかは別問題。
326 :
デフォルトの名無しさん :02/06/29 22:19
>>315 始めにプログラム向けの仕様を決めておいて、それからハードウェアを合わせていくって
手もあるかもよ。
理想的な環境をイメージしておいて、それを実現するためにハードウェアに近い部分
を構築するって感じで。
ファンクションコールで欲しい物をリストして、それをハードウェア仕様に合わせて
実現させればいい。手順も統一してあると嬉しいな。
>>323 まぁ、パフォーマンスは激悪になるだろうね。
これは仕方ないと思う。
だけど、プログラムやOSの移植性は抜群に良くなる。
327 :
デフォルトの名無しさん :02/06/29 22:22
>>323 スーパーコンピュータから携帯電話まで、同じライブラリが使えると嬉しいな。(w
一回コンパイルしとけば依存関係を気にしなくていい。
まぁ、OSと言うよりVMに近いかな。 OSとVMを統合して一歩進めた形だな。究極のOS環境。
>>328 そんなもん、ハードウェアが一つの規格に統一されれるほうが
利用者(プログラマ)側としては究極だろ。
>>327 いったいそれをどのような目的のために使うというのだ。
PCにつまれるx86系CPUにとって得意な処理もあれば苦手な処理もある。
あとROM,RAM等のハード資源を無視して強引にOSを作ってもまるで意味が無い。
>>330 それを言ったらOSだって統一されるわけねーし、
実装依存で余計に苦しむ場面も多々出てくるよ。
ハードウェアってのはどうしても、物理世界の壁に直面する。 電源容量、ノイズ、媒体特性、製造コスト、こういうのがある限り、ハードウェア を統一しようというのは無理。 だから、そのために、OSと言う物が存在している。 だけど、今のOSは、特定のCPUに依存しがち。 だから、CPU依存をできるだけ廃したOSがあれば、かなり良いと思う。 パフォーマンスは多少悪くなっても、まぁ、最近のCPU性能ならOld Pentiumクラス で動かしたWindowsと同等の性能程度で実現可能だろう。 リアルタイム性も持たせれば、クリティカルな処理以外は全く問題なくなる。 クリティカルな処理は、Network経由でCPUサーバが処理するようにするとか、 分散オブジェクトをサポートすればいい。
>>331 まぁ、どうだろ。
初歩的な関数から作ってみて、徐々に拡張してみては。
目的は・・・作者次第じゃねーの?
>>332 OSは統一されるべき。
だけど、アプリケーションソフトは統一されるべきではない。
基本は統一されるべきだが、応用は自由に発展すべき。
>>336 なんで ? OSだって単なるプログラムだよ。「バカッ速いけど、メモリー保護な
んてかったるくってやってられねーよ。」というOSや、ひたすらユーザーイン
ターフェースに凝りまくるOS。「ハードが死んでも、俺は実行を続けるぜ。」
と言うフォールトレランスなOS。いろいろあっていいんじゃないの ?
なんか、OSを特別なプログラムみたいに思ってない ?
じゃあOSつくるよかライブラリとかクラスライブラリとか 環境とか作った方が手っ取り早いね。
339 :
デフォルトの名無しさん :02/06/30 00:25
「ハードが死んでも、俺は実行を続けるぜ。」 カコ(・∀・)イイ!!
OSを"単なる"プログラムって言ってのけるあたり厨入ってるな。 明らかに特別なプログラムだろ?
341 :
デフォルトの名無しさん :02/06/30 00:35
342 :
デフォルトの名無しさん :02/06/30 00:41
>>340 >>337 の主張は「いろいろあっていいんじゃないの?」って部分なんだが、、
どうでもいい所にちょっかいだしてどうするんだ?
>>341 ,342
そんなことでageんなよ…
ひげぽん氏はどうした?
344 :
デフォルトの名無しさん :02/06/30 01:04
まぁ、色々バージョンがあるのは良いんだけど、このOSでは文字列の扱いがまちまち だとか、基本的なファンクションコールの呼び方がまちまちだとか、プログラマ泣かせ の状況は、本来OSという存在を作った意図から外れてる。 BIOSと何ら変わらないよ。 この状況で良いんだったら、CPUベンダかチップセットベンダがROM焼きなり、 ハードコーディングして出せば良いんだ。OSなんて要らないね。 と言ってみる。
345 :
デフォルトの名無しさん :02/06/30 01:14
マイコン用のOSってどうよ?HOSとか
いや、もうTRON最高
347 :
日本語おかしいので、訂正と追加 :02/06/30 01:15
まぁ、色々バージョンがあるのは良いんだけど、文字列の扱いがまちまちだとか、 基本的なファンクションコールの呼び方がまちまちだとか、処理系のbit数で計算結果 が変わるとか、こういうというプログラマ泣かせの状況は、本来OSという存在を作った 意図から外れてる。 この状況で良いんだったら、BIOSと何ら変わらないよ。CPUベンダかチップセットベンダが ROM焼きなり、ハードコーディングして出せば良いんだ。OSなんて要らないね。 単に、BIOSより使いやすいBIOSでしかない。 と言ってみる。
初めて読む486でアセンブラを勉強中です。 しばしお待ちください。
C言語でかけばそれをどんな環境でも その環境でコンパイルすれば使えるって入門書に書いてあったのですが どうですか?
コンパイラがあればな
351 :
デフォルトの名無しさん :02/06/30 01:22
>>349 コンパイラが存在するのと、
プログラムで使ったライブラリ関数が全く同じ外部仕様で提供されていること。
他にも、ビッグインディアン/リトルインディアンの違いでハマったり、
intのサイズが違ったり、数えればキリがない。
そんなえーかげんなことを書いている本は捨てちゃいなさい。
352 :
デフォルトの名無しさん :02/06/30 01:23
>>347 そうだね。このスレ中途半端な知識の展覧会って感じだな。
どんなOSがお望みなんだい?OSの設計はそれからだろ?
このスレまだ何も生んでないな…
ライブラリとかもっと上の層で対応した方が楽だし速いし柔軟じゃん。 なぜわざわざ一番下から…
354 :
デフォルトの名無しさん :02/06/30 01:28
>>351 まぁ、『入門書』だから。
難しいことは無視して平易に多少間違いも含みつつ書いてあるんだろ。
間違いを知るのも良い勉強になるし。
>>352 とりあえず、『OSの目的』が無いと始まらないんだよな。
UNIXは『ゲームを動かしたいんだ』って動機があったし、
Windowsは『PC/ATで動くMacが欲しかったんだ』って動機がある。
とりあえず『どういうのが欲しいのか』が無いとね。
>>344 文字列の扱いぐらいCの標準関数でも十分汎用性があるが。
本来のOSの役目とは共通のCPUで動くアプリケーションが個別に作成し
呼び出していたI/O、メモリブロックの確保(ヒープ)等に対して
共通のインターフェースを提供するというもの。
これがいわゆるシステムコールというやつだ。
あんたが言ってるのは理想論であり、大企業が作っているにもかかわらず
未だに使える次元で実現していないVMと同じ物を作るということである。
結果としてCPUのパフォーマンスに支障をきたすOSではいらない物となる。
少しでもOSのコードを見たことがある人なら知っていると思うが
速度を上げるために内部は関数ポインタの塊である。
357 :
デフォルトの名無しさん :02/06/30 01:42
>>355 >文字列の扱いぐらいCの標準関数でも十分汎用性があるが。
そうかい?
あ
を一文字出したいんだけど、MS-DOS(英語版)で。
言語レベルでは仕様までは規定してないよ。
システム環境を規定しているのは実質的にOS。
あ〜あまた始まった…
359 :
デフォルトの名無しさん :02/06/30 01:49
ノイマン型のコンピュータの講釈をするのは知識不足でアレだけど、 基礎的な事に限って言えば、処理装置と記憶装置等の5大装置があれば良い。 ハードウェアでこれを実現するか、概ねソフトウェアでハードウェアは基礎的な 部分にとどめるかは好きにして良いんだよ。 OSが提供するメモリをCPUのMMUでやろうとすれば、高速だがCPUによって変わる。 OSが独自にMMUを構築すれば、低速だがCPUが変わろうが動作する。 そういうことなんだよ。
ひげぽん氏よ、もう少し方向性を明確にしたらどうだい? でないと、不明瞭なまま話がどんどん広がってめちゃくちゃになってしまうよ
>>357 おいおい、それを実現するのはOSじゃないよ。
普通は言語サブセットだったり、他のOS配下にあるモジュールだって。
>>360 あのさぁ、おまえらが勝手に持ち上げているだけで、
ひげぽんは「とりあえず」習作としてOSを作って「みたい」というだけだろ
いきなり仕様がどうだって話してもしょうがない。
>>357 あんたが言っているのは<stdio.h>。
俺が言ってるのは<string.h>。
printf等は出力が絡むのでOSのwiteを使うことになる。
文字列の連結、評価であれば問題ない。
OSが無くても使える。実際使っている。
あとmath.hもつかえる。
ひげぽん氏は、いろいろな意味で偉いな。
がんばってくれ。
>>252 に関してだけど。
プログラムがシステムコールを使っていても、(3)のようになるのかな?
システムコールってのはOSへのサービスの要求だよね。
あ、特に返レスは不要だけどね。
365 :
デフォルトの名無しさん :02/06/30 02:03
>>361 おいおい。
OSの定義わかって話してる?
あんたが言ってるのはカーネルだよ。
>>357 内部表現と外部表現の違いについて小一時間勉強してこい
367 :
デフォルトの名無しさん :02/06/30 02:07
>>363 OSの話してるの。
別に、C言語の仕様じゃ文字列の扱いについて規定してない。
”あ”が文字コードの何番かであるかも規定してない。
OS非標準のコンソールドライバかもしれん(w
369 :
デフォルトの名無しさん :02/06/30 02:11
>>366 それは関係ないな。
文字列のテーブルを管理してるのはOS。C言語じゃない。
OSの基礎を小一時間勉強しろよ。(w
370 :
デフォルトの名無しさん :02/06/30 02:12
371 :
デフォルトの名無しさん :02/06/30 02:13
で、1はx86用カーネル組みたいの?
>>369 だから、文字列ってなんだよ?
パスカル文字列とか、Cの文字列とか
それこそ、アプリケーション定義による独自の文字列とかがあって、
OSが規定するべき物じゃない。
OSよりもオープンソースのゲームって出来ない?
>”あ”が文字コードの何番かであるかも規定してない この場合、OSが規定しているのは文字列ではなく、キャラクタセットじゃん。
どんな文字でもゴリゴリ描いちまえば俺の勝ち
376 :
デフォルトの名無しさん :02/06/30 02:18
DOSはキャラクターセットの定義と$で終わる文字列のコンソール出力のファンクションリクエストを提供していますが。
378 :
デフォルトの名無しさん :02/06/30 02:19
>>378 文字セットでも良いけど、文字セットは文字列じゃないぞ
上の言い争いが全部自作自演だたら(・∀・)ワラエル!!
拘泥
>>367 そんな事ぐらい判っているが。
M$がシフトJISでUNIXはEUCが標準文字コードだろ。
俺が言いたいのはつまりC言語でで'A'とすればそれはどんな処理系でも
文字コードは別にしろAとして扱われるということだ。
そんなことよりOSとして重要な機能は入出力機器への共通の抽象化された
命令やnew,malloc等でのメモリブロックの確保だと思うのが。
別にどうでもいいので俺は上げない。
なんかOSとは「どうあるべき」っていう人と 「どうやって作るの」っていう人が戦ったるみたい。 個人的には、ここで必要なのは「どうやって作るの」の意見が重要そうな気がする・・・
>>383 あ? 標準がShift_JISだったUNIXもあるし、最近だとUTF-8つーこともあるが?
インストール時に選択できるとかな。
>>252 のことを x86 でやろうとしたら、「バイナリ実行イメージ」てのはどうやって作るんでつか?
NE とか PE、MZ、ELF じゃダメっすよね?いわゆる com 形式でいいんでつか?
COM形式で良い。 16bitコンパイラとかで実行ファイルを作り、 exe2binとかでバイナリイメージにして書き込む。 プロテクトモードへの移行はローダーがやってもいいし、お好きにどうぞ。
通りすがりで申し訳ないが、
なんでOSのスレで文字列とかで争ってるんだろう・・・?
ちなみに俺は
>>311 に同意。
タスク(プロセス)をどうやって実現しているか、というのは
なかなか面白いと思う。
>>387 thx 今度やってみます。
あと、全くライブラリ使っていなければオブジェクトフェイルのままでもOKでつか?
>>389 ダメ。
オブジェクトファイルが実行可能イメージである保証はないし。
32bitコンパイラはつかえないんでつか?
使えない
昔、S-OSというOSモドキがあったの覚えてます? あれすごく面白かったよね
それじゃあ32bitOSはどうやって動いてるんですか? 1.まず16bit実行ファイルを起動 2.16bit実行ファイルが32bit実行ファイルのための環境を整える 3.32bit実行ファイルが起動 4.32bit実行ファイルが32bitOSのための環境を整える 5.32bitOSが起動 ? はっ、これが「ぶーとしーくぇんす」というやつでは・・・
>>340 > 明らかに特別なプログラムだろ?
素人さんかな ? だったら、黙ってた方がいいよ。
400 :
デフォルトの名無しさん :02/06/30 12:25
>>395 x86の場合、16bitのモードから32bitモードに切り替えるんじゃなかったっけ?
途中で。DOSでもWindowsでも動くようになってるはず。
リアルモードとか仮想86モードとかそういう複雑な構成だった気がする。
元々、x86って、MS製OSを前提にしてる設計だからなぁ。
WINTEL同盟以降、MSの要求を受けてCPU設計してるらしいし。
32bitリアルモードで初期化するにはどうしたら良いんだろ?
32bitリアルモードってなに?
402 :
デフォルトの名無しさん :02/06/30 12:54
(・∀・)シラン
403 :
デフォルトの名無しさん :02/06/30 13:04
protected: (・∀・)mode!!
404 :
デフォルトの名無しさん :02/06/30 13:20
何でプロテクトやねん!!
(・∀・)シラン
406 :
デフォルトの名無しさん :02/06/30 13:34
メモリ保護って事か? Windowsカーネルは保護されてねーじゃん。どういうことだよ。
407 :
デフォルトの名無しさん :02/06/30 13:35
(・∀・)シラン
408 :
デフォルトの名無しさん :02/06/30 13:38
(゚Д゚)ハア?
409 :
デフォルトの名無しさん :02/06/30 13:39
(゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア? (゚Д゚)ハア?
410 :
デフォルトの名無しさん :02/06/30 14:16
つまり、Windowsはx86を使いこなせてないという事で良いですね。
>>410 セグメントを殆ど使ってないLinuxよりはWindowsの方が386の
機能を活用してるように思うけど、どうなんだろう?
412 :
デフォルトの名無しさん :02/06/30 15:07
安定しないで数時間で落ちるOSと、安定してて数十日はもつOSと、どっちが良い?
安定してて数百日はもつOS
414 :
デフォルトの名無しさん :02/06/30 15:10
>>411 なぜそこでlinuxが出てくるのか小一時間
49日毎に確実に落ちるOSと、うまくいけば数百日持つけどハード が何も使えないOS、どちらが良い?
416 :
デフォルトの名無しさん :02/06/30 15:12
>>413 FreeBSDなら98日という記録をマークすますた。
ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ハードが何も使えないOS ・・・
>>415 49日があるのはWindows95だけだっけ?
NT系は大丈夫だっけ?
どちらにしろ9x系はだめだね。
NT系がいいよ。2000ならハードもかなり使えるし。
DOSはマイクロカーネル
ケンタッキーフライドチキンを食いたくなった。
422 :
デフォルトの名無しさん :02/06/30 15:21
>>419 カーネル保護されてねーOSが49日持つかよ。
どうせ、PRO串とかDNSとかWINSとかファイルサーバとか限定用途なんだろ?
これくらい一台のPentium PCで出来るはずの事だぞ。
「おい!サーバが、サーバが盗まれたぞ!」
「一台にまとめたんです。何でもできるんですよ。」
>>423 起動合計時間処理がどうたらとか聞いたなぁ。
興味ないんで突っ込まなかったが。
第一、Windows95系で49日持たせる用途なんてねーし。(w
NT系で十分
49day= 1176 hour = 70560 minute = 4233600 second = 4,233,600,000 ms つー事かい?
人間はOSですか?
win95はパッチがあるよ>49日 パッチ当てても49日も動かさないけど(w
はじめて読む486 第5章セグメントまで読み終わりました。 とりあえずこれを読めと薦めてくれた人の気持ちが分かりました。 x86系CPUで動くOSを作るうえで必要な基礎知識が書いてありました。 例) プロテクトモードとリアルモード レジスタとは? セグメントとは? MMUによるアドレス変換と仮想記憶 ただしアセンブリ言語のことは、あまり書かれていないので これを読んでHello World は書けない・・・ さあ頑張ってHelloWorld 書くぞ。
>>422 > カーネル保護されてねーOSが49日持つかよ。
(゚д゚)ハァ?
初めて読むItanium、蒲池先生書いてくれないかなー
432 :
デフォルトの名無しさん :02/06/30 17:52
>>429 アセンブラでHello Worldを書こうと思ったら
BIOSの呼び出しかVRAMへの直接書込が必要になる。
これにはアセンブラの知識だけじゃなくて、
ハードウェア(のアーキテクチャ)に固有のBIOSなどの知識が必要。
アセンブラの知識だけならこのスレの最初の方で出ていた
インテルの純正マニュアル(pdf)と各種入門サイトで一通りカバーできる。
BIOSなどについてはFreeDOSのソースを見るといいかも。
アセンブラ環境をとりあえず整えてみました。 OS:WindowsXP Pro エディタ:Meadow 1.14 アセンブラ:nasm for win32 リンカ:alink 上記環境下で、webで拾ってきた↓をアセンブル、リンクしました。 segment code ..start: ;各セグメントなどの初期設定 mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,stacktop ;文字列の表示 mov dx,hello mov ah,09h int 21h ;終了 mov ax,4c00h int 21h segment data hello: db 'Hello World',13,10,'$' segment stack stack resb 64 stacktop: 実行も成功! どなたかアセンブリ言語の入門に 最適なサイトを紹介していただけませんか?
>>432 入れ違いになっちゃいましたね。
BIOS呼び出しとVRAMへの直接書き込みどちらが、
入門者向きでしょうか?
また、メジャーなOSはどちらを選択しているのでしょうか?
>>435 OSを作るなら当然前者ではありえない。
ただ、前者を使ったモジュールもあるべき。
最初は前者で書いて、あとから後者を追加すればいい。
インターフェース 2002 7号に BIOS版「Hello, World」プログラムの作成という記事 がありました。 フロッピーからブートしてHello, Worldと 出力してみようという内容です。 これだ!と思ったものの。全部GNUツールでやってる・・・ 初心者のひげぽんには、これを読み替えて NASM on Windwosで実践する力がまだありません・・・ もっと勉強しないと。
ここで5年間問いつづけけながらOS作る気か。 くだらん質問する暇があったらまず本を読め 100冊読んでから出直せ。 ネタにしてもつまらん。
FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば 後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。 そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
>>440 そんな駄目レスを5年間続けながら
無駄に人生を送るよりは良いんじゃない?
本を読めって?
それはお前だろ
>>440 をいじめないでください。
弱い者いじめなんて、男のすることじゃないです。
>>441 ご迷惑をおかけいたします。
>FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば
>後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
>そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
現在の状況は、基本となる雛形も無い状態なので
良い意味でマネできる素材があればと思っています。
Webで探しているのですが今のところなかなか良いのが
見つからないです。
勉強の過程を同じような志の人たちにフィードバックできたら
と考えています。
446 :
タ僕 ◆njaj0FGY :02/06/30 20:11
>>444 それならSunriseOSがオススメ。
ソースがべらぼうに読みやすい。
449 :
デフォルトの名無しさん :02/06/30 20:23
447=450 はきっと寂しいんだよ。 みんな相手してあげて。
つか、まじめにスレ読もうとしたおれから言わせてもらうと、 うざいんですけど。 何で検索しないの? 質問の方が答えるの早いから? なめとるよ。
>>452 ひげぽんが結構教えて君なのは確かだな。
が、指摘された参考図書に実際に取り組んでいるし
テストコードも書いたりしているから前向きではある。
もうちょっとなま暖かい目で見守ってやっていい。
457??
発言予告だろ、とマジレスの振りをしてみるテスト。
ひげぽん結構がんばってるじゃん。
よく見ると質問もWebで検索して見つかる種類ではない場合が多い
と思うんだけど。
>>252 とかそんな感じじゃん。
勉強した上で出てきた疑問質問なら良いと思うよ。
linuxとかのソースとか。
>>457 知ってる事しか質問してないように見える.
私の質問と、質問の仕方によりご迷惑をおかけいたしております。 以後以下のことに気をつけます。 ・今でも十分調べてから、質問をしていますが WEBで調べて分かるものは、自分で調べます。 ・自分で調べたものについても、出来る限り ここに書き込むようにします。 どうぞよろしくお願いいたします。
>>460 あまり気にしなくていいと思ワレ
気にせず、いいOSをツクテクレ
>>452 ウザイと思ったら、来ないでね。言いたいのは、ただそれだけ。
464 :
デフォルトの名無しさん :02/06/30 22:28
>>460 ココはOSを作ろうとする人のための質問スレなんだから何でも聞いて良いんじゃない?
オープンに何でも話そうよ。
文字出力するだけでもVGAを叩かなくちゃいけないんですか?
ひげぽんが出てこないと妄想君が議論始めるから ひげぽんは気軽に出てくるように。
467 :
デフォルトの名無しさん :02/06/30 23:24
たまに出てきてね
うん、次は4年後だね
469 :
デフォルトの名無しさん :02/07/01 01:11
>>465 BIOS叩いてもできるけど結局同じこと。
>>436 を読むとBIOSを使うのはあまり良くないようだけど何故なの?
>>471 PCのBIOSはプロテクトモードから呼び出せないし再入可能でもない。
リアルモードで動くシングルタスクのOS以外からは使い物にならんよ。
474 :
デフォルトの名無しさん :02/07/01 06:05
>>472 ちょっとまて。
そうかといって本格的にOS作り始めたとき山のようにドライバ書かなくちゃならなくなるんじゃ?
BIOS叩いてやれば少なくともドライバがないから画面真っ黒とかいうことにはならんと思うが。
なにをいまさら
476 :
デフォルトの名無しさん :02/07/01 19:41
477 :
デフォルトの名無しさん :02/07/01 19:42
まいくろかーねるにしようぜ。いい加減。
SunriseOSのソースを眺めてちょっとずつ勉強しています。 とりあえず自分なりにコメントを付加してみました。 15%も理解していないですが・・・ これから理解を深めます osimg.asm ブート部分
; -------------------------------------------------------- ; SunriseOS boot loader 2001 Scherpereel Jelle ; -------------------------------------------------------- ; This code loads the actual kernel in memory and jumps to ; it for execute! ; -------------------------------------------------------- ; It needs to be compiled with NASM ; -------------------------------------------------------- ; ひげぽんが勝手にコメントを追加しました。 ; コメントを和訳したものではありません。 ; コメント ver1.0 org 0 ;bios read from here ■プログラムが0から始まる事を示す
start: ;setup the stack ;we can't allow interrupts while we setup the stack cli ;disable interrupt ■外部割込みを禁止する mov ax,0x9000 ;put stack at 0x9000 ■汎用レジスタに0x9000をセットする mov ss,ax ;ss=9000 ■セグメントレジスタ(スタックセグメント)にaxの値をセットする mov sp,0 ;sp=0000 ■スタックポインタに0をセットする sti ;enable interrupt ■外部割込みを可能にする ;remember the bootdrive information mov [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする ;load the kernel call load ;■コードラベルloadを実行 ;jump to the loaded program mov ax,0x1000 ;■axに0x1000をセット mov es,ax ;■esにaxをセット mov ds,ax ;■dsにaxをセット push ax ;■スタックaxをpush mov ax,0 ;■axに0をセット push ax ;■スタックからaxをpop retf ;■呼び出し元に戻る
; ------------------------------------------------------- ; functions and data used by the bootstrap program ; ------------------------------------------------------- ;data bootdrv db 0 ;variable containing the bootdrive ;load kernel from bootdrive load: ;reset the diskdrives push ds ;store DS ■データセグメントの値をスタックへpush mov ax,0 ;select function ■汎用レジスタaxに0をセット mov dl,[bootdrv] ;drive to reset ■データレジスタに変数bootdrvの値をセット int 13h ;reset ■13hの割り込み処理を行う13h? pop ds ;restore DS ■スタックからpop jc load ;failed try again■キャリーフラグ?が1のときにラベルへジャンプ load1: mov ax,0x1000 ;es:bx=1000 ■汎用レジスタaxに0x1000 mov es,ax ; ■エキストラセグメントにaxの値をセット mov bx,0 ; ■bxに0をセット ;read disksectors mov ah,2 ;select function ■ahに2をセット?? mov al,10 ;read 10 sectors ■alに10をセット?? mov cx,5 ;cylinder=0,sector=5 ■cxに5をセット mov dx,0 ;head=0,drive=0 ■dxに0をセット int 13h ; ■13hの割り込み処理を行う13h? jc load1 ; ■キャリーフラグ?が1のときにラベルへジャンプ retn ; ■呼び出し元に戻る times 512-($-$$)-2 db 0 dw 0AA55h
ソースのレイアウトがくずれてしまいました.
484 :
デフォルトの名無しさん :02/07/01 22:27
帰ってきたひげぽん。 おかえりーー
これから少しずつソースを読んで行こうと思います。 良いリファレンス、ひげぽんの間違い指摘、アドバイス等ありましたら ぜひ書き込みください。 まずはこの部分から。 >;setup the stack >;we can't allow interrupts while we setup the stack スタックセットアップをしているらしい。 > >cli ;disable interrupt ■外部割込みを禁止する ここはOK >mov ax,0x9000 ;put stack at 0x9000 ■汎用レジスタに0x9000をセットする axに0x9000を入れることにどういう意味があるか? ssに0x9000をいれるためか? >mov ss,ax ;ss=9000 ■セグメントレジスタ(スタックセグメント)にaxの値をセットする mov ss,0x9000とどう違うのか? またどういう意味があるか? >mov sp,0 ;sp=0000 ■スタックポインタに0をセットする どういう意味があるか? >sti ;enable interrupt ■外部割込みを可能にする ここはOK 勉強が足らないですね。
良いリファレンスを探さねばと、痛感しております。 もう英語でもいいから、いいところ無いかなあ。
スタックはss:spになる。 それだけだろ?
>>485 はじめて読む486の最後の方の命令セット一覧見てご覧よ。
セグメントレジスタに即値を mov できないでそ。
>>487 ありがとう
axを介しているのはなぜでしょうか?
cli
mov ss, 0x9000
mov sp, 0
sti
で良い様に見えるのですが何か理由があるのでしょうか。
>>488 ・・・すいません入れ違いになりました。
ありがとう。
491 :
デフォルトの名無しさん :02/07/02 01:23
うーん、ひげぴん、がんばってるなぁ
一般的に、 i++ ; // iに1足す。 みたいなコメントは、かな〜り逝ってよしです。
とりあえず、アセンブラ初心者はそれで良いんじゃないの? レジスタの名前は決まっちゃってるんだし、コメントがあっても邪魔じゃないだろ
アセンブラはそれこそ mov ax,0x9000 mov ss,ax の様に1つの動作を2〜3の命令の組み合わせで表す事があるから mov ax,0x9000 ; ssに0x9000を mov ss,ax ; 入れる みたいに、その動作単位でコメントを入れると良いかも。
0x9000 って数には何か意味がある? 単にメモリの後の方って事?
>>495 ss:spが9000:0000なのでスタックは9000:ffffから使われる。
つまり640KBのケツ。
ページ違反で落ちないの?
>;remember the bootdrive information > >mov [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする 作者のコメントを見るとブートドライブの情報を記憶とあるが dlには、ブートドライブ情報が元から入っているのでしょうか? >;load the kernel > >call load ;■コードラベルloadを実行 ここはOK 以後loadラベルに進みます。
>;load kernel from bootdrive > >load: > ;reset the diskdrives > > push ds ;store DS ■データセグメントの値をスタックへpush このデータセグメントには何らかの値が入っていて、それを保持するために スタックにpushしていると思うのですが、いったい何が入っているのでしょうか? > mov ax,0 ;select function ■汎用レジスタaxに0をセット ここは本当に意味が分からないです、axに0をセットしているものの、 これ以降どこかでつかっていないように見えるのですが。。。 > mov dl,[bootdrv] ;drive to reset ■データレジスタに変数bootdrvの値をセット > int 13h ;reset ■13hの割り込み処理を行う13h? 13h割り込み処理の定義は、どこかで調べればわかると思うので保留。 > pop ds ;restore DS ■スタックからpop > jc load ;failed try again■キャリーフラグ?が1のときにラベルへジャンプ kernelのloadが失敗している間はずっとループする???
>ここは本当に意味が分からないです、axに0をセットしているものの、 >これ以降どこかでつかっていないように見えるのですが。。。 int13hでつかってるんだろ。
>>500 さん
ありがとう。
これをヒントにいまint 13hを調べております
とりあえずこんなの見つけました。 INT (16進数) 説明 10 ビデオサービス 11 実装されているハードウェアリスト取得 12 メモリサイズ取得 13 低レベルディスクサービス 14 シリアルポートサービス 15 (予約:さまざまな用途に使われる) 16 キーボードサービス 17 プリンタサービス 18 ROM BASIC 起動 19 リブート 1A システムタイム取得 1B CTRL - BREAK ハンドラ 1C システムチックカウントタイマー 1D システムデータ (ビデオパラメータテーブル) 1E システムデータ (ディスクパラメータ) 1F システムデータ (8 x 8 グラフィックフォント)
>>504 500さん、あなたは英雄です。
すごすぎます。
>>504 ありがとうございます。
int,13h,axをキーワードにWebをさまよっていました。
ということでまとめると
load:
;reset the diskdrives
push ds ;store DS ■データセグメントの値をスタックへpush
mov ax,0 ;select function ■ディスクを
mov dl,[bootdrv] ;drive to reset ■リセット
int 13h ;reset ■する
pop ds ;restore DS ■スタックからpop
jc load ;failed try again■キャリーフラグ?が1のときにラベルへジャンプ
507 :
デフォルトの名無しさん :02/07/03 01:55
508 :
デフォルトの名無しさん :02/07/03 01:58
あと 「Ralf Brown interrupt」 でぐぐれば↑の内容がアーカイブ化 されててDL出来るようになってるとこが見つかると思う。
510 :
デフォルトの名無しさん :02/07/03 09:56
調子はどうだひげぽん ローダくらいはできたか
>>507 >>508 >>510 ありがとう。
はじめて読む486一応読み終わりました。(かなり斜め読み)
仕事から帰ってから1,2時間しか時間が無いので
進みは遅いですがよろしくお願いいたします。
ソースレイアウトがくずれるのが、見づらいのですが、
半角空白を&nbsp;で置き換えるしかないのでしょうか?
皆様のご好意により資料が増えましたので コメントを書き換えました。 ; -------------------------------------------------------- ; SunriseOS boot loader 2001 Scherpereel Jelle ; -------------------------------------------------------- ; This code loads the actual kernel in memory and jumps to ; it for execute! ; -------------------------------------------------------- ; It needs to be compiled with NASM ; -------------------------------------------------------- ; ひげぽんが勝手にコメントを追加しました。 ; コメントを和訳したものではありません。 ; インデントに変更を加えました ; コメント ver1.1 org 0 ;bios read from here ■プログラムが0から始まる事を示す
start: ;setup the stack ;we can't allow interrupts while we setup the stack cli ;disable interrupt ■外部割込みを禁止する mov ax,0x9000 ;put stack at 0x9000 ■スタックを mov ss,ax ;ss=9000 ■9000:0000に mov sp,0 ;sp=0000 ■設定する sti ;enable interrupt ■外部割込みを可能にする ;remember the bootdrive information mov [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする ;load the kernel call load ;■コードラベルloadを実行
;jump to the loaded program mov ax,0x1000 ;■axに0x1000をセット mov es,ax ;■esに0x1000をセット mov ds,ax ;■dsに0x1000をセット push ax ;■スタックaxをpush mov ax,0 ;■axに0をセット push ax ;■スタックaxをpush retf ;■呼び出し元に戻る ; ------------------------------------------------------- ; functions and data used by the bootstrap program ; ------------------------------------------------------- ;data bootdrv db 0 ;variable containing the bootdrive
;load kernel from bootdrive load: ;reset the diskdrives push ds ;store DS ■データセグメントの値をスタックへpush mov ax,0 ;select function ■ディスクを mov dl,[bootdrv] ;drive to reset ■リセット int 13h ;reset ■する 成功した場合キャリフラグが1になる pop ds ;restore DS ■スタックからpop jc load ;failed try again■キャリーフラグが1のときにラベルへジャンプ load1: mov ax,0x1000 ;es:bx=1000 ■エキストラセグメントに mov es,ax ; ■1000をセット mov bx,0 ; ■bxに0をセット ;read disksectors mov ah,2 ;select function ■セクタを読んでメモリにセット mov al,10 ;read 10 sectors ■10セクタ読む 格納先はes:bx mov cx,5 ;cylinder=0,sector=5 ■シリンダ0,セクタ5 mov dx,0 ;head=0,drive=0 ■ヘッド0,ドライブ0 int 13h ; ■実際にセクタを読み込む 成功した場合キャリフラグが1になる jc load1 ; ■キャリーフラグ?が1のときにラベルへジャンプ retn ; ■呼び出し元に戻る times 512-($-$$)-2 db 0 dw 0AA55h
ソースの概要および実行順序を今分かっている分を書いてみると (1)外部割込み禁止 (2)スタックのセットアップ (3)外部割り込み可能にする (4)ブートドライブ情報保存 (5)ディスクをリセットする (6)ディスクを読んでメモリにセットする (7)読み込んだプログラムへジャンプする??? でしょうか。
520 :
デフォルトの名無しさん :02/07/03 22:26
>>512 > 半角空白を&nbsp;で置き換えるしかないのでしょうか?
全角スペースで置き換える方が簡単だと思います。
>>521 ちょうど追加分があるのでやってみます
times 512-($-$$)-2 db 0 ;■nasmにファイルサイズが512byteであることを教える
dw 0AA55h ;■ブートストラップの最後の2byteは0AA55hがセットされていなければならない
523 :
デフォルトの名無しさん :02/07/04 23:42
ひげぽんがんばれage!!! 参考になればどうぞ。 >最後のブートシグニチャは必ずマジックナンバーと呼ばれる0xAA55という値が >入っています。この値が入っていないとマスターブートレコード自体が >無効なものとして扱われ、BIOSによってはブートストラップローダが >実行されませんし、パーティションテーブルも読み込まれません。 >つまりこのマスターブートレコードが正当なものであることを保証する署名(シグニチャ)です。
526 :
デフォルトの名無しさん :02/07/04 23:47
>>526 お前、すぐ上の
>>522 ぐらいみろよ。
> dw 0AA55h ;■ブートストラップの最後の2byteは0AA55hがセットされ
> ていなければならない
バカ丸出しだぞ。
>>523 ありがとう。
詳しい説明たすかります。
529 :
デフォルトの名無しさん :02/07/05 00:47
だんだんとひげぽんが成長するにつれ、 疑問に答えられるやつがいなくなってきたね。 オレモナー
>>90 MS-DOSみたいなのを作ればいいんじゃないかな。
なんか、話が発展しすぎてるけど。GUIとかJAVAは当分先だろう。
個人的には、GPLなLinuxよりもBSDをベースにして欲しい。
フロッピー1枚に収まるBSDとか探して、ソース見てみれば?
CUIで低機能でも、個人が作ったOSならば是非とも触ってみたい。
なんじゃこりゃ。 こんなにレスあったんか。 鬱だ・・・氏んできます。
ひげぽん以外を応援あげ。 みんな、性格がよく(煽りに乗らず、くだらんレスにもお礼を言う)、 勤勉で(会社から帰っての1、2時間を勉強にあてている)、 頭のいい(短期間でかなりの進歩を見せている)、 そんなひげぽんなんかに負けるな。 性格がゆがんでて、怠惰で、頭の悪い2チャンネラの底力を見せてみろ。
(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
オレ質問いいっすか?
>>514 なんだけど、一番最初で、割り込みを禁止して
ss:sp を設定したら、またすぐ割り込み許可してるじゃん。
でも、まだ、割り込みベクタを初期化してるわけでもないし、
割り込みが発生したときに実行されるべきルーチンもロードされてないわけじゃん。
そんな状況で割り込み許可なんてしちゃって良いの?
そんなとき割り込みが発生したらどうなるの?
あと
>>515 でひげぽんは retf の説明を「呼び出し元に戻る」と書いているけど
本当はそうじゃないのは分かってるよね? いや念のため確認したかっただけっす。
>535 あれ?リアルモードの割り込みベクタは、0:0〜0:1000までに存在してて ベクタ初期化はBIOSがやってくれてて、ルーチンも、UMAのどっかに BIOS ROMとして用意されていたはず。 #でないとint13hとか、int 09hとかで大問題になるはず……
まちがい。0:0〜0:400
538 :
まぁ、どうでも良いけど :02/07/05 04:41
>>535 ブートローダに制御が渡る前にBIOSが設定してる。
>>516 int 13h のコメントが「成功した場合キャリフラグが1になる」 になってますけど、これは「失敗した場合」ですよね? つまり 成功するまで同じ処理を繰り返す、と。
>>533 >(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと
>たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
その通りです、まずは取っ掛かりですね。ブートローダーがきちんと作れれば
一応先に進めるんで・・・
まずは動く物を作りたいっす。
>>535 >>536 >>537 >>539 私の思いつかない疑問と、その回答ありがとうございます。
BIOSってさまさまですね。
割り込みルーチンが無かったら確かにえらいことですよね。
>>540 間違いでした。すいません。
誤 BIOSってさまさまですね 正 BIOSさまさまですね
>>535 失礼しました。
あまり考えずに進んだところに罠が・・・
確かに呼び出し元に戻るっていうのはどう考えてもおかしいですね。
ret:call命令でコールされたサブルーチンから復帰する。
と同等のものとの認識でした。
以下
http://members.tripod.co.jp/guriponn/others/japanise/chapter7.txt より引用
(*) コードセグメントが一つ(tiny,small,compactモデル)の時は、関数は
nearです。つまり、関数の引数がデータセグメントに置かれるかスタ
ックに詰まれた時の関数のポインタは16 bitsの長さのオフセットと
言う事です。(CSレジスタはその値を永遠に変更せずいつでも全ての関
数のアドレスを返します。)そして関数は普通のnearの`CALL'で呼び出
され、`RETN'を用いて関数へ戻ります。(NASMでは、`RETN'と`RET'を同
義語として扱います。)つまり、あなたが自分のルーチンを書く時に、
関数へ戻るには`RETN'を使い、外的な(externの)Cのルーチンを呼び出
すときにはnearの`CALL'を使わねばならないと言う事です。
(*) コードセグメントが1つ以上(medium,large,hugeモデル)の時は、関数は
farです。つまり、関数のポインタは32 bitsの長さと言う事です。(16-
bitのオフセットと16-bitのセグメントで処理される)そして、`CALL FAR'
(または`CALL seg:offset')で呼び出され、`RETF'で関数に戻ります。も
う一度繰り返しますが、従ってあなたが自分のルーチンを書くときに関
数へ戻るには`RETF'を用いて関数へ戻り、`CALL FAR'で外的な(extern
の)Cのルーチンを呼び出すのです。
引用ここまで
良く分からないです。
CALL FAR で呼び出されているのは何でしょうか?
スタックに0x1000:0000を積んで、そのアドレスにretfで戻る(飛ぶ)。 retだから呼び出し元に戻るという考えは捨てよ
確認です
>;jump to the loaded program
>
>mov ax,0x1000
>mov es,ax
>mov ds,ax
>push ax
>mov ax,0
>push ax
>retf
retfの手前では
ax →0
es →0x1000
ds →0x1000
スタックには、0x1000と0が積まれています。
>>546 さん
>スタックに0x1000:0000を積んで、そのアドレスにretfで戻る(飛ぶ)。
retfはどのレジスタ(スタック)を参照してそのアドレスに飛ぶのでしょうか?
それ以外のレジスタは、とんだ先で実行されるコードで参照されるためのものでしょうか?
質問ばかりで申し訳ないですが、お願いいたします。
今日は仕事はお休みのため、勉強するチャンスです。
retfだけじゃなくてretn(ret)もスタックの一番上から アドレスを取り出してそこにジャンプする命令
>>544 なんでこのページは第7章しかないの?
はじめから見てみたい。
目次の場所教えて。
archive.orgへ逝け
そろそろ自分でソースを書きそうなのですが アセンブラのソースって、どういうインデントが良いのかなあ。 コメントは、日本語英語どっちがいいんだろう。 PJ名(仮称)はどうしよう。
552 :
デフォルトの名無しさん :02/07/05 17:46
>コメントは、日本語英語どっちがいいんだろう。 本気なら英語のほうが良い。 でも2chでは日本語のほうが良いかも。 PJ名は、2chとかどうよ?
554 :
デフォルトの名無しさん :02/07/05 18:05
日本人以外の奴等とオープンソースで開発するならばという意味です。 英語圏のやつらでなくても、日本語よりはましかと・・・
英語のほうがいいかも。 今のところひげぽんは本気っぽいからね。 プログラム板の猛者も、立ち上がるかもしれん。 PJ名(仮称) higeponOSでいいんじゃない?
はっきり言ってガイジンと開発はだめすぎ クズOSじゃガイジンは見向きもしないし、 良いOSになりそうだったらそれは日本人の手柄でありたいと思うがどうよ?
英語のメリット 日本人以外のやつにとって敷居が低くなる 英語のデメリット 日本人にとって読みにくい。 いんちき英語コメントになる可能性がある。 日本語のメリット 日本人にとって非常に読みやすい。 日本語のデメリット 日本語はマイナー言語である。
558 :
デフォルトの名無しさん :02/07/05 19:16
技術以外の話題になるとみんなとたんに元気になるね。
いいじゃん。 少しでも貢献したいんだよ。 純粋に。
アセンブラのインデントはemacsのasm-modeに準じることにしました コメントは、どうしましょう。 一応良いOSを作るつもりなので、 英語のほうが良いのでしょうか?
つもりって… 死ぬほど無謀だな
562 :
デフォルトの名無しさん :02/07/05 19:46
ひげぽん期待age! 2ch発信のOSをつくれり。
オープンソースにしてsourceforgeにプロジェクト登録はどうか?
ttp://sourceforge.jp/ 容量無制限かつcgi可のHPスペースとか、MLとかが無料で利用できるし、
何よりも新規プロジェクトに飢えてるから、本家よりも軽快だし。
>>559 単にブートローダーの話がつまらないだけだと思われ。
アプリケーションプログラマには関係ないし。
日本語はUTF-8だのSJISだのEUCだのの変換が面倒かもな。
せっかくだからUCS4ネイティブで行きましょう。
>>565 コメントは英語で行くことにしました。
いんちき英語にならぬよう祈るのみです。
>>555 引き続き名前募集です。
>>563 それは良いかもしれませんね。
骨格部分が出来て公開できる段階になったら
sourceforgeにいくかも!!
569 :
デフォルトの名無しさん :02/07/05 20:45
OSのデベロッパーってすごいな
>>568 見てみました。
なんだか見ているだけでやる気が出てきます(笑)
やはり複数人で開発すると楽しそうですね。
>>571 作者がファンだから、あやかってるらしい。
575 :
デフォルトの名無しさん :02/07/06 07:06
お前らUNIX Magazine 7月号の特集は読みましたか?
なかなか、参考になるぞ。
っと言おうと思ったが、
>>573 の方が詳しい罠
>>575 おーい。あんまり変なスペース入れなよ。俺様の大事なスレなんだから。(w
ウニクスマガジンの特集って白崎博生さんのだよね。
5月から読んでるけど、俺、これが楽しみでしょうがない。
(俺はウイン屋だから、こういう雑誌見たことなかった。)
ページ数を3倍増くらいしてがむばってほしい。>>白崎さん
って、2チャンなんか見てないかな。
>>573 貴重な情報サンクス!
ブート部はgasで書かれているようですが、
参考になります。
昨晩は、bochs(x86エミュレータ)を入れていろいろ実験していました。
かなり便利ですね。
アセンブル→ブートテストのサイクルが同じマシン上ですぐ出来る!
PC のブートの勉強用としてはこんなのもある。
ttp://www.rbt.his.fukui-u.ac.jp/~naniwa/comp/OS/ GPL。μITRON 上に POSIX API を実装したという珍品。しかも純和製。
ドキュメントが少ないので勉強用としては今一つかな。カーネル本体は
複雑で訳わからんが、ブート部 (eota/sfsboot, eota/boot 以下) は比
較的すっきりしている。eota/boot は gas と C で書かれていて、
eota/sfsboot 以下はそれを nasm と C で書き換えて拡張したようだ。
Bochs でも動いた。
参考になるかな。
>>578 さん
ありがとう。
nasmで書かれたbootソースというだけでも
大変助かります。
Bochs等お詳しそうですね。
今後もアドバイス頂けるとうれしいです。
単なるマイナー OS オタなのでアドバイスは無理っぽい。
>>580 では、580さんに目をつけてもらえるようになったら
マイナーOSの仲間入りですね(笑)
早くそうなるようにがんばります。
;------------------------------------------------------------------------------- ; Name : higeboot.asm ; Description : boot from floppy disk and echo "2ch" ; Revision : $Revision: 1.1 $ ; Copyright (c) 2002 HigePon ;------------------------------------------------------------------------------- [ORG 0] jmp 07C0h:start start: hello: mov al, '2' call print mov al, 'c' call print mov al, 'h' call print jmp hang print: mov ah, 0Eh mov bx, 7 int 10h ret hang: jmp hang times 510-($-$$) db 0 dw 0AA55h
やっと動くものを自分で作れました。
>>582 のソースをnasmでコンパイルして
フロッピーディスクにddコマンドなどでコピー
ブートすると"2ch"の文字が!!
全然たいしたものではないのですが、やっぱりうれしいですね。
上記ソースだと文字列を表示するのが大変なので ↓のようにしたのですが "Hello!"の後に文字化けした文字列が出てしまいます。 なぜでしょうか? msg db 'Hello!' start: mov si, msg print: lodsb cmp al, 0 je hang mov ah, 0Eh mov bx, 7 int 10h jmp print
>>584 'Hello!' の後ろに、00h がないからじゃないの ? アセンブラは、C みた
いに "ABC" で 00h は付加してくれないよ。
Intel 系のアセンブラは良くわかんないけど...
msg db 'Hello!', 00h
とか書けばいいのでは ?
>>584 msg db 'Hello!' を
msg db 'Hello!$'
cmp al, 0 を
cmp al ,'$' にしてみては?
わーだぶっちゃったごめんなさい
;------------------------------------------------------------------------------- ; Name : higeboot.asm ; Description : boot from floppy disk and echo "Hello 2ch!!" ; Revision : $Revision: 1.3 $ ; Copyright (c) 2002 HigePon ;------------------------------------------------------------------------------- [ORG 0] jmp 07C0h:start msg db 'Hello 2ch World!', 00h start: mov ax, cs ; what?? mov ds, ax ; what?? mov es, ax ; what?? mov si, msg ; set msg print: lodsb ; set al=current charcter at si cmp al, 0 je hang mov ah, 0Eh ; print mov bx, 7 ; a charcter int 10h ; at al jmp print ; next charcter hang: jmp hang times 510-($-$$) db 0 dw 0AA55h
>>585 586
thanks!!
これで結構すっきりかけたと思います。
>>586 なんか懐かしい。そう言えば、Intel 系って文字列のターミネータが何故
か '$' だったよね。Motorola 派 (流派かよ!!) としては、結構不思議
でした。
>>589 ひげんぽん一歩前進、おめでとう。俺がついていけるのは、このあたりま
でだけど、がむばってね。
>>585 本当にありがとう。
おかげさまで、ちょっとだけ前に進みました。
次の目標は、
フロッピーの最初の512byte以降のプログラムを読み込めるように
することです。
>>590 文字列のターミネータが$なのはMS-DOSのシステムコールの仕様。
このスレ見てたらなんか作りたくなってきた…(w
>>592 >このスレ見てたらなんか作りたくなってきた…(w
作りましょう。
ぜひ・・・
594 :
デフォルトの名無しさん :02/07/07 01:24
ひげぽん期待age 有言実行すばらしい。
ひげぽん素晴らしい。 漏れもOSとまではいかないでもハードウェアとアセンブラの勉強を 兼ねてOSもどきを作ろうとか思ってたけどまだ、何もはじめてない… 水戸黄門の歌みたいだ…♪後から来たのに追い越され〜 鬱…
>>592 ちょっと惜しい。CP/M からだよ。固定文字列なら、いいんだけどカーソル位置
指定なんかで動的に文字列生成する時に、たまたま '$' が生成されてはまった
事あり。
と言うように、優れていない仕様でもとにかく具体的に動くものがあるとなんか
萌える。そう言う意味で、
>>588 みたいにソースを適時出すのはいいことだと
思う。ひげぽんがむば。
>>596 Intel系って80系も含めて言ってたわけね。
なんかアホみたいだ、俺。
ってことで、mingw32とnasmをインストール。
いくつか疑問点があります。 >[ORG 0] > >jmp 07C0h:start セグメント07C0hに行くということだと思うのですが、 どういう意図なのでしょうか? 意味も分からず書いていました。 > msg db 'Hello 2ch World!', 00h > >start: > mov ax, cs ; what?? > mov ds, ax ; what?? > mov es, ax ; what?? csの値を、ds,esに設定しているのですが、 これは絶対必要な処理なのでしょうか?
7c0h:startはseg:offの形式だっつーの。
cs=dsとはコードとデータが同一セグメントにあると言うこと。 vcのリンカ設定で言うなら、/merge:.data=.textってことサ
ありがとうございます。
>>600 jmp 07C0した時点で、セグメントアドレスが決まるのか?
もともとセグメントアドレスは、07COだったのでしょうか?
>>601 なるほど。
コードとデータが同一セグメントであることを指定しない場合、
どういう扱いになるのでしょうか?
該当部分をコメントアウトすると、実行しても文字列が
表示されませんでした。
>>602 プログラムの先頭に来た時点 (=jmp 命令実行直前) で CS (コードセグメント
レジスタ) と IP (命令ポインタ/プログラムカウンタ) は、各々 0x0000 と
0x7c00 になっている。(インターフェース誌7月号 P.68 参照のこと)
それで、この jmp 命令で CS に 0x7c00 を入れて IP に Start ラベルの
オフセットを入れる。
msg 等のラベルも全て 0x07c0 セグメント内でのオフセットとなっているから
DS (データセグメントレジスタ) は、0x07c0 を入れておく必要がある。
(そう言う意味では、mov es, ax は不要。)
> コードとデータが同一セグメントであることを指定しない場合、
> どういう扱いになるのでしょうか?
その時の DS が示す値 (正確には × 16 して) に msg のオフセットを加えた
所から文字列を持ってこようとする。(要は、変な DS の値を元にアクセスする
アドレスを計算するため、変な場所から無理矢理データを持ってこようとする。)
ちなみに、SS (スタックセグメントレジスタ) と SP (スタックポインタ) も
設定しておいた方が良いと思う。(インターフェース誌, P.70, リスト1〜2参
照のこと)
604 :
デフォルトの名無しさん :02/07/07 13:56
いんたーふぇーすかってこよ
org 0 jmp 0x07c0よりも org 0x7c00としたほうがds,esにcsをセットしなくてよくてお徳なんじゃないですか?
そんなことはない。 raw binaryの実行イメージだから、セグメントの設定は行ってくれない。
そうなんですか?orgとdsを0x7c00と0x07c0の組合わせで試してみてだめだったので、 dsの設定をはずしてみたら正しく動いたのですが、これはなにか別なところで問題が あることが考えられるのでしょうか?
>>603 603さんの解説とインターフェース誌を総合すると
jmp 0x07C0:startの替わりに
jmp startとした場合には、コードセグメントは0のままである。
その場合は、セグメント0のオフセットアドレス0x7C00のところへ
ブートプログラムがロードされてしまう。
するとセグメント0がブートプログラムによって分断されてしまうので
よろしくないということですよね。
ところがjmp 0x7C0:startとすると
ブートプログラムは、セグメント0x7C0の先頭の場所へロードされる。
↑
ここが分かりません。
BIOSはブートプログラム512byteを物理メモリのあるアドレスに読み込み,
CPUはそのアドレスへジャンプし、実行すると思うのですが
なぜセグメント0x7C0を指定するセグメントの先頭にブートプログラムが
ロードされているかが分からないです。
ロードされる物理メモリの場所は一定。 far jmpではCSの値も変更できるから、07c0:0000にロードされると見ることが出来るわけ。 07c0:0000 と 0000:7c00は物理的には同じアドレスを指してるってコトをよぉく理解しよう。
>>609 さん
ありがとう。
少ない頭で、ただいま考え中です。
まぁ、segment:offsetの概念ってなかなか理解しがたいものがあるしね… 物理アドレス = segment * 16 + offset つまり、同じアドレスを示すsegとoffの組み合わせが何通りもあるという事。 利点としては、「64k以下のプログラムなら何処にでもロードできる」と理解しておくのがいいかも。 以上の話は「リアルモード」でしか通用しないので注意。 プロテクトモードでどーなるのかは、プロテクトモードに入れる段階になったら考えればよし。
>>609 さん
1セグメントのサイズは必ず64KBであり、物理メモリを64KBずつに
区分けしたものがセグメントだと思っていたので混乱していました。
結局ブートプログラムは、
リニアアドレス = 0x7C00に
ロードされているのですね。
そこでセグメントレジスタを07C0にセットするとセグメントの先頭ということもあり
非常に都合が良いと。
ブートプログラムが開始されてjmpした以降は、
07C0のセグメントの中でのお話になるという事ですね。
はじめて読む486の125ページにCSレジスタの役割が書いてありました・・・
↑
日本語が変ですが、609さんのおかげで分かってきました。
正解。
>>609 さんに大感謝!!!!
ちょっと欲を出してマクロまで使ってみました。
ディスクリセットまで実現!!
;-------------------------------------------------------------------------------
; Name : higeboot.asm
; Description : boot from floppy disk and echo "Hello 2ch!!"
; Revision : $Revision: 1.3 $
; Copyright (c) 2002 HigePon
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; Name : PRINTSTR
; Description : print string
; Param1 : string(db)
;-------------------------------------------------------------------------------
%macro PRINTSTR 1
mov si, %1
%%hige:
lodsb ; set al=current character at si
cmp al, 0 ; if al == 0 then
je %%end ; end this macro
mov ah, 0Eh ; print
mov bh, 0 ; the charcter which is
int 10h ; at al
jmp %%hige ; next character
%%end:
%endmacro
;------------------------------------------------------------------------------- ; Name : main ; Description : boot program ; Param1 : NONE ;------------------------------------------------------------------------------- [ORG 0] ; use segment 07C0h and offset is address of start ; cs = 07Coh jmp 07C0h:start osStart db 'Hige start...', 0dh, 0ah, 00h resetOk db 'disk reset ok', 0dh, 0ah, 00h start: cli ; disable interrupt mov ax, cs ; code segment address is 07C0h mov ds, ax ; when data access, use 07C0h segment mov ss, ax ; when use stack, user 07C0h segment sti ; enable interrupt PRINTSTR osStart reset: mov ax, 0 ; reset mov dl, 0 ; drive 0 int 13h ; jc reset ; if failed try again PRINTSTR resetOk forever: jmp forever times 510-($-$$) db 0 dw 0AA55h
>>609 さんのおかげにより
ディスクリセットまでこぎつけました。
次は、ディスクの513byte以降を、或るセグメントに読み込み
そのセグメントにjmpすれば、そのコードが実行される!!
ということを実現しようと思っています。
この読み込まれるプログラムをアセンブラオンリーでなく
Cオンリーまたは、C with インラインアセンブラで書きたいのですが、
どのような環境を整えればよいのでしょうか?
ひげぽんの環境は、
Windows XP Pro
NASM
C++のコンパイラは、
cygwin のgccと、VC++6.0 standardです。
すいません。まだ分からない奴がいるんですが、
>>605 に関連して
org 0x7c00
mov ax,cs
mov ds,ax
mov es,ax
なら jmp 07c0h:start をしなくても ok って事?
あと、
jmp offset
は相対アドレスのジャンプで、
jmp segment:offset
は絶対アドレスのジャンブって事ですか?
>>616 まだプロテクトモードに入ってないから、
32bitコンパイラは使えないよ。
16bitコンパイラでバイナリを生成した後にexe2bin汁。
MSのexe2binは.com形式のためにorg100扱いで実行ファイルを生成した鴨
>>617 >なら jmp 07c0h:start をしなくても ok って事?
OKかもしれないけど…
…よく分かりません…
jmp offsetってのはIPにoffsetを代入。
jmp segment:offsetってのはIPにoffset、CSにsegmentを代入です。
>>618 >>619 何も考えていませんでした。
とりあえずプロテクトモードに入ったと仮定しての
お話でお願いします。
(プロテクトモードへの移行は一応はじめての486に記述があるので
いけそうだと踏んでいます。)
アセンブラとCのつなぎの部分とかが全然分かっていない状態です。
どういう環境で、どういう手順を踏んだら良いかすら分かっていないです。
アセンブラとCの繋ぎなんて関係ない。 メモリ上にロードしてエントリポイントのアドレスへjmpするだけだから。 #場合によっては環境の設定をしてから。
Cでソースを書く(インラインアセンブラを含む??) →どのライブラリ、関数が使用可能かということが分からない コンパイラでコンパイル →どのコンパイラ(もしくは特別なコンパイルオプション)をつかえば 良いかが分からない。 コンパイル済みのバイナリをそのままディスクに書き込めばよいのか? もう分からないこと尽くしです、 どなたか、取っ掛かりだけでも教えてもらえないでしょうか?
1 コンパイラ依存だし、ライブラリのソースが無い物の場合、 自分で調べられないなら全部作る必要がある。 まぁ、string.hくらいは使えるかもね 2 世に出ている16bitのコンパイラで、OS固有のヘッダ領域を除去可能なツールが使える物。 2 ディスクに書き込んでも良いし、ファイルシステムに保存しても良いけど、 後者の場合は自前で読み込むか、FSサブシステムをロードしておく必要がある。
ていうか、ローダーの時点でさっさとプロテクトモードに移行して、 そこから実行するのが吉かと。
果たしてあれだけの処理が512バイトに収まるかという問題も有る気が… 一旦リアルモード -> プロテクトモードにいく16BitプログラムをCで作って exe2bin(exeヘッダを取り除く)して、それをディスクのブートセクタ以降に配置 とかの方がいいかも。 確かexe2binしたプログラムのエントリポイントは普通0だった気がするから、 セグメントの先頭に配置してやれば動くはず。
>>627 MS-DOSの.com形式は256バイトのPSP領域を勝手にOSが用意するから、
ORG 100hのバイナリが生成されたと思うけど?
629 :
デフォルトの名無しさん :02/07/07 17:52
別に32bitコンパイラでも使う即値が16bit以下ならリアルモードでも動かせるんじゃなかったっけ?
exdebのマニュアルからコピペ。 ;""""""""""""""""""""""""""""""""""""""" ; .EXE ファイル・ヘッダー ; .EXE File Header ;""""""""""""""""""""""""""""""""""""""" EXH Offset Size Name Description 00h 2 BYTEs exe_ID ;'MZ'または'ZM' 02h WORD last_page_byte ;最終ページ内のバイト数 04h WORD file_page ;ファイルの大きさ(1ページ=512バイト) 06h WORD relocation ;リロケーション数 08h WORD header_size ;ヘッダの大きさ(1パラグラフ=16バイト) 0Ah WORD last_byte_min ;プログラムの後に必要な最小メモリ(パラグラフ) 0Ch WORD last_byte_max ;プログラムの後に必要な最大メモリ(パラグラフ) 0Eh WORD SS_inital ;SSの初期値 10h WORD SP_inital ;SPの初期値 12h WORD head_chk_sum ;チェックサム 14h WORD IP_inital ;IPの初期値 <= ここの値 16h WORD CS_inital ;CSの初期値 18h WORD reloc_tbl_off ;リロケーションテーブルのオフセット 1Ah WORD overlay_no ;オーバレイ番号 1Ch WORD reloc_table ;リロケーション情報 ここの値が幾つかによるわけだ..
>>625 ,626,609,628さん
ありがとうございます。
プロテクトモード移行後であれば32bitコンパイラが
使えるということですね。
ブートプログラム内または、ブートセクタ以降でプロテクトモードに移行
すればよいのですね。
お勧めな環境とかってありますか?
こういうのってどこで調べればよいのでしょうか。
キーワードが悪いのか全然だめです。
話題が映っているのに恐縮ですが、、
609さん
>>621 の最後の2行は「教科書的意味」でそうなるのは分かりますが、
厳密にそうなるのでしょうか?
今オレは nasm を試せないのですが、 linuxの as86(いわゆる gas だと思う)
で↓をアセンブルすると、
jmp L1
jmp L1
L1:jmp L1
jmp 0x07c0:L1
出力されるコードが、
eb 02 eb 00 eb fe ea 04 00 c0 07
となります。つまり最初の6バイトに関しては eb が jmp 命令で
その後の1バイトが相対アドレスだと思います。
(負の数を2の補数で表している)
つまり、機械語レベルでは代入ではなく加算なのではないでしょうか?
一方最後の5バイトは ea が jmp 命令で 続く4バイトでジャンプ先の
絶対アドレスを指定しているので文字どおり代入が行われているとおもいます。
以上をまとめると、jmp off は相対アドレスジャンプで jmp seg:off は絶対アドレスジャンプ
になり、だからこそ
>>480 とかは自分が読みこまれている場所を意識しなくても
上手く言ったと思うのですが、、
あと、微かな記憶ですが、 jmp off でも -128 から 127 に入り切らない場合は
絶対アドレスジャンプの命令に置き換わっていた気がしますが、、
>>632 ザッツライトです(汗
私の言っていることが不正確でした。
jmpがどのジャンプかはアセンブラがかってに判断してくれるみたいですね…
普通にアセンブラで書くときは即値かオフセットなのかは全然気にしてなかったもんで..
MASMとかTASMはかってに絶対アドレス命令に置き換えてくれます。
(知ったかぶり口調は自制するです…スマソ
634 :
デフォルトの名無しさん :02/07/07 18:33
おいおい。 ひげぽんがしらぬまにまた成長している・・・
>>632 shortは8bit相対ジャンプ
nearは16bit相対ジャンプ
farは32bit(seg:off)絶対ジャンプ。
リアルモードでプリフィックスなしではこうなるはず。
おれも知りたいコンパイラ。
もちろんこれから作るOSは操作でわからないことがあると 幼女声で答えてくれたり気紛れな態度を取ってくれる萌えOSなんだろうな?
>>639 それは萌え(w
それ以前に喋らすためにはサウンドドライバ書かなきゃいかんだろ
昔のソフトみたいにBEEPで喋らすのもありだが(藁
ひげぽんたん‥‥‥ハァハァ(ぉ
>>637 gcc(mingw32)もnasmもWin32で動くぞ。
>>637 いくらひげぽんOSがいいものになっても、それを自分でコンパイルするには、
VCとか他の有料アプリを購入しなければ行けないとなればオレ的に萎え〜です。
gccとnasmは萌え〜。
644 :
デフォルトの名無しさん :02/07/08 10:47
mingwinってどうやって使うの? 使い方がいまいち分かんない。
そもそもそれ何?
MingW32の間違いでした。 MingW32は発音できないから、ミングウィンか、ミングイン、の方が言いやすいなぁ。(ぼそ) みんぐwは尻切れっぽい感じが・・・。(ぼそぼそ)
いや、だからさ、そのMingW32って何なのさ。 おせーて、おせーて、おせーてよ。
648 :
デフォルトの名無しさん :02/07/08 17:26
なんかこのスレさ。 ひげぽんを中心とするエリート軍団と、俺みたいなオッチー軍団に別れちゃったな。 あーあ。オッチーにも愛の手(やさしい説明)を。
ム板でスレ建てるコテハンに優秀な奴はいないと思ってたけどそうでもないんだな とひげぽんを見てふと思ひ
650 :
デフォルトの名無しさん :02/07/08 18:03
> ム板でスレ建てるコテハンに優秀な奴はいない 誤解だな。正確には 「ム板で単発質問でスレ建てるコテハンに優秀な奴はいない」だ ここの1は単発質問をしていないので上記の条件には当てはまらない。
653 :
デフォルトの名無しさん :02/07/08 19:54
FreeDOS教徒たんの開発環境ってどんな感じょ?
655 :
デフォルトの名無しさん :02/07/08 22:03
>>647 Windows上で動くGCC
GCCはGNU Compiler Collectionの略(になったらしい。前はGNU C Compiler)
Windows上で動くフリーのコンパイラって事らしい。ちなみにGPL。
【追加説明】
MinGW: Minimalist GNU For Windows
詳細こちら(英語)
http://www.mingw.org/ tar.gzはいまダウンロード中だけど、どうすれば良いんだ?
ソースっぽいし。
UNIXでコンパイルしてもWindows上で動くのかな?
exe形式になるの?
SJIS通るのかな?
PATH通せばいいだけ?
SJIS通らないよ。 それから、gcc3.1系をばらで落とした方が良いかも知れない
>>656 UNIXでコンパイルすればUNIXでWin32のコードを吐くクロスコンパイラになる。
>>657 別に通らないってことはないだろ。
ただ、特にSJIS対応してないから
// ソ
とか
// 表
とか2バイト目に '\' が入ってると楽しいことになるだけで。
660 :
デフォルトの名無しさん :02/07/08 23:05
キタ━━━━━━(゚∀゚)━━━━━━ !!!!! Latest MinGW-1.0 Snapshot を解凍して、DOSプロンプトから実行したら動いたよ。
1.0Snapって2.9.4じゃなかった? 3.1落とせって
662 :
デフォルトの名無しさん :02/07/08 23:26
ああ。ソースフォージに行けばいいのね。最新はここか。
http://sourceforge.net/projects/mingw/ ・・・なんか良くわかんないな。
いっぱいファイルあるけど。
っしかし、なんで、日本語なんだ?
クライアントコードページでも参照してるのかな?
CVSもどういう事なんだか良くわかんないし、死にそう。
CVS超わかんねーよ。ヽ( `Д)ノウワァァァァン
ソースフォージどうなってんだよ。ヽ( `Д)ノウワァァァァン
VRAM直接アクセスで画面表示出来たよん。 int13h 使うのと違って画面の左上に"2ch"って上書きしちゃうから bochs 使うと "2ch bios" ってなって(・∀・)ワラエル!! ----------------- [ORG 0] jmp 07C0h:start start: hello: mov ax, 0B800h mov ds, ax mov di, 0 mov al, '2' call print mov al, 'c' call print mov al, 'h' call print jmp hang print: mov [di],al add di,2 ret hang: jmp hang times 510-($-$$) db 0 dw 0AA55h ---------------- んじゃ、ひげたんこれからもガムバテネ。
>>662 httpリクエストのAccept-Languageヘッダ見てるだけだと思うが。
666 :
デフォルトの名無しさん :02/07/08 23:46
とりあえず、スナップショットが実行可能形式配付ファイルだと思われる事は解った。 最新版は1.0.8。 386、586、686、って分かれてるな。最適化済みの実行ファイルって事か。 なんかexeっぽいけど何だ?インストールプログラムかな? バラバラにダウンロードして組み込んでも良いの? バージョンでおかしくなったりしないのかな? 適当にまとめられてる奴無いのかな。
>>665 どうもありがとう。
>Ada/Pascalも欲しければどうぞ
ああ。なるほど。
言語ごとにバラバラしてるわけね。
で、GCCはそれをコントロールしてるって事か。
gcc-coreはc/c++コンパイラも含んでる
なんだか盛り上がって来てうれしいですね。
今日は仕事の合間に駄目もとでcygwin gccを試していたがだめでした。
それで
http://www.delorie.com/djgpp/ を見つけました。
これもWin上で動くgccらしいです。
でもなんとなく皆さんが紹介してくださった
Mingwのほうがよさげなのでそちらにしようかと思っております。
なんだかそろそろgnu makeをきちんと勉強したほうが良い気が
してきました。必要そうだし。
って訳でもないか。 binutilsって何?何かのユーティリティなのかな? DOS窓だとmanとか無いし、htmlドキュメントをブラウザで開くのかな? これらの混在環境って良いのか? バージョンで混乱したりしないのかな?
>>663 >VRAM直接アクセスで画面表示出来たよん。
それはすごい!!
ありがとう。
今日はちょっと試す時間が無いので
明日試してみます。
>>665 取りまとめありがとう。
利用させてもらいます。
ちなみにNASM&BochsはWin版を使ってます。
あり?良いのか。 ああ。良いんだ良いんだ。 release note.txt読めば良かったんだね。 頭混乱してた。恥ずかしいからsage
>>669 前言撤回Mingwやめました。
DJGPPにしました。
明日はVRAM叩きをまねして、
あとはmakeの勉強。
プロテクトモードへの移行もやらないと
でもなんだか前より増してやる気が出てきた!
会社でこそっとやろう。。。
djgppって32bit DOS extender搭載したDOS用のコンパイラじゃないの?
675 :
デフォルトの名無しさん :02/07/09 03:41
DOSエクステンダ用のコンパイラなら、 TOWNS用にHigh-Cなんてのを持ってたなぁ.... 今はどこかへ行ってしまったが。
メディア、5インチでよければあるよ、High-C
>>674 以下のようなオプションが使えるので
OS開発に使えるようです。
>-ffreestanding
>produce code that is meant to be run without an OS (ie:kernel code)
>-c
>compile but don't link (creates an object file)
678 :
デフォルトの名無しさん :02/07/09 22:34
gcc 使う場合リンカは何使うの? オレ gcc の標準の ld を使おうかと思っているけど -oformat output-format を何にしたら良いか分からなくて止まってる。 ぐぐっても良く分からないよ〜。
>>678 試してはいませんが、
OS developer's siteでは、
ld -Ttext 0x100000 --oformat binary -o
ld -o xxx -Ttext 0x0 -e main xxxx.o
のようなものを使っていた。
ちょっと分かった。 windows では分からないけど linux では、 nasm -f elf xxxxx.asm gcc -c yyyyy.c ld -oformat binary -Ttext 0x0 -e start xxxxx.o yyyyy.o こんな感じにすると C とアセンブラのくっついた COMファイル(?)ができる。 つまり、バイナリにヘッダとかなくていきなり実行イメージがきているような奴。 でも、これだと問題点が二つある。 * 最後に AA55 をくっつけることが出来ない。 * C で書いたコードは32bit用コードになっている。 だから、やっぱり最初の512バイトはオールアセンブリで書いて その中でフロッピーをメモリに読みこんでプロテクトモードにして それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい。
>>681 681さん、同じところで悩んでいますよね。
>だから、やっぱり最初の512バイトはオールアセンブリで書いて
>その中でフロッピーをメモリに読みこんでプロテクトモードにして
>それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい
プロテクトモードへの移行の前には、
GDTの設定、ITDRの設定などを行わなければいけないんでよね。
その辺のことは、本に書いてあるのですが。
ブートコードからCでコンパイルした
(bootディスク上にある)実行イメージを呼び出す方法が分からない・・・
(1)実行イメージのサイズがきちんと分かっている場合
ディスクを必要セクタ分読み込めばよいのでしょうか?
int 13hを使う感じで・・・
(2)アセンブラで出来たブートイメージと、
Cで書いて出来た実行イメージを
ひとつのイメージにまとめて
diskに対して ddコマンド等で書き込んでやればよいのでしょうか?
今日は一日中悩みました。
いろいろ実験したのですが、
Cで実行イメージを作成しようにも、そいつが読み込まれて
動作したかを確認する方法がないっす。
int main() {
}
と空のmainを書けばライブラリに依存しないのでOKかと思ったのだが
動作確認が出来ない(涙)
683 :
デフォルトの名無しさん :02/07/10 00:47
プロテクトモード移行は 2nd boot でやった方が良さそうな気がして来た。
で、『はじめて読む486』では、MakeSegDesc とかいう関数作ったりして
大がかりだけど、eota の boot/2nd/start16.S とか見ると
ディスクリプタを最初っから直書きしていて、こうした方が楽な気がする。
できれば、『はじめて読む486』のようにC を使って書きたいところだけど、
gcc に 16 bit 用コードを吐きださせる方法が分からないから。
アセンブリ使うしかなさそう。
(1) そうだと思う。
(2) 1st boot でプロテクトモードにするならそれでOKだと思うけど、
2nd boot でプロテクトモードに切り替えるなら2nd boot の先頭はアセンブリの
コードにしておいて(プロテクトモードに切り替えて)そこから C の関数を
呼べば良いと思う。
動作確認は
>>663 の VRAM直接アクセスをCで書けば良いと思う。
/boot/2nd/lib.c の write_vram が参考になる。
上手く行かなければ、
int c_func()
{
return 'A';
}
という関数をアセンブリからcallすれば ax に 'A'が入る。それを
アセンブリで画面表示すれば良いと思う。
どうしてもダメならリアルモードに戻してBIOSコールってことになるかな。
684 :
デフォルトの名無しさん :02/07/10 00:51
プロテクトモード移行は 2nd boot でやった方が良さそうな気がして来た。
で、『はじめて読む486』では、MakeSegDesc とかいう関数作ったりして
大がかりだけど、eota の boot/2nd/start16.S とか見ると
ディスクリプタを最初っから直書きしていて、こうした方が楽な気がする。
できれば、『はじめて読む486』のようにC を使って書きたいところだけど、
gcc に 16 bit 用コードを吐きださせる方法が分からないから。
アセンブリ使うしかなさそう。
(1) そうだと思う。
(2) 1st boot でプロテクトモードにするならそれでOKだと思うけど、
2nd boot でプロテクトモードに切り替えるなら2nd boot の先頭はアセンブリの
コードにしておいて(プロテクトモードに切り替えて)そこから C の関数を
呼べば良いと思う。
動作確認は
>>663 の VRAM直接アクセスをCで書けば良いと思う。
/boot/2nd/lib.c の write_vram が参考になる。
上手く行かなければ、
int c_func()
{
return 'A';
}
という関数をアセンブリからcallすれば ax に 'A'が入る。それを
アセンブリで画面表示すれば良いと思う。
どうしてもダメならリアルモードに戻してBIOSコールってことになるかな。
>>682 スタートアップルーチンの存在は知らないんだな。
687 :
デフォルトの名無しさん :02/07/10 00:58
とりあえず、今後進みやすい道のりは、 step1 1st boot, 2nd bootともにオールアセンブリで、 BIOS を使って "Hello higepon" step1.5 1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon" step 2 1st boot, 2nd bootともにオールアセンブリで、2nd bootでプロテクトモードにして "Hello higepon"(もちろん VRAM アクセス) step 3 1st boot はオールアセンブリ 2nd boot はアセンブリ+C言語 アセンブリ部分でプロテクトモードにして C の関数を呼び出し C の関数が "Hello higepon" step 2.9 ( step 3 がダメだった場合) C の関数を char *higepon_string() { const static char buf[]="Hello higepon"; return buf; } とかしといてそれを アセンブリで表示。 って感じでどう? step 1 で作った 1st boot はそのままずっと使い、 以後は 2nd boot 部分だけ 書き換えれば良くなるでしょ?
>>686 つまり、普通にコンパイルしたんではスタートアップルーチンがあるから
上手く行かないって言いたい?
689 :
デフォルトの名無しさん :02/07/10 17:55
あれ?スタートアップルーチンってリンカがつけるもんじゃなかったっけ?
違う
正確に言うとエントリポイント(スタートアップルーチン)を含んだ オブジェクトファイルやライブラリを、大抵のリンカが暗黙の内にリンクしているだけで、 それを回避するオプションが付いているはず
>>683 ,684,687
ありがとう。
>step1.5
>1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon"
を書いてみました。
boot.mac ;------------------------------------------------------------------------------- ; Name : PRINTSTR ; Description : print string ; Param1 : string(db) ;------------------------------------------------------------------------------- %macro PRINTSTR 1 push ax mov si, %1 %%hige: lodsb ; set al=current character at si cmp al, 0 ; if al == 0 then je %%end ; end this macro mov ah, 0Eh ; print mov bh, 0 ; the charcter which is int 10h ; at al jmp %%hige ; next character %%end: pop ax %endmacro
;------------------------------------------------------------------------------- ; Name : higeboot.asm ; Description : boot from floppy disk and echo String ; Revision : $Revision: 1.4 $ ; Copyright (c) 2002 HigePon ; WITHOUT ANY WARRANTY ;------------------------------------------------------------------------------- %ifndef BOOT_MACRO %define BOOT_MACRO %include 'boot.mac' %endif %include 'firstboot.asm' %include 'secondboot.asm'
;------------------------------------------------------------------------------- ; Name : firstboot.asm ; Description : boot from floppy disk and echo String ; Revision : $Revision: 1.1 $ ; Copyright (c) 2002 HigePon ; WITHOUT ANY WARRANTY ;------------------------------------------------------------------------------- [ORG 0] ; use segment 07C0h and offset is address of start ; cs = 07Coh jmp 07C0h:start osStart db 'Hige start...', 0dh, 0ah, 00h resetOk db 'disk reset ok', 0dh, 0ah, 00h start: cli ; disable interrupt mov ax, cs ; code segment address is 07C0h mov ds, ax ; when data access, use 07C0h segment mov ss, ax ; when use stack, user 07C0h segment sti ; enable interrupt PRINTSTR osStart reset: mov ax, 0 ; reset mov dl, 0 ; drive 0 int 13h ; jc reset ; if failed try again PRINTSTR resetOk
read: mov ax, 1000h mov es, ax ; es:bx is mov bx, 0 ; data buffer mov ah, 02h ; read sectors into memory mov al, 5 ; number of sectors to read mov ch, 0 ; low eight bits of cylinder number mov cl, 2 ; sector number mov dh, 0 ; head number mov dl, 0 ; drive number int 13h ; read! jc read jmp 1000h:0000 ; jump to the secondboot forever: jmp forever times 510-($-$$) db 0 dw 0AA55h
;------------------------------------------------------------------------------- ; Name : secondboot.asm ; Description : firstboot read this from disk and execute. ; Revision : $Revision: 1.1 $ ; Copyright (c) 2002 HigePon ; WITHOUT ANY WARRANTY ;------------------------------------------------------------------------------- second: mov ax ,cs mov ss, ax mov ax, 0B800h mov ds, ax mov di, 0 mov al, '2' call print mov al, 'c' call print mov al, 'h' call print jmp hang print: mov [di], al add di, 2 ret hang: jmp hang
>663さんに感謝
699 :
デフォルトの名無しさん :02/07/10 21:55
ひげぽんさん、サイト作ろうよ
プロテクトモードに移行したあとの次の命令で、Bochsは3rd exeptionって言ってくる んですがなにが原因なんでしょう?誰か助けてー
701 :
デフォルトの名無しさん :02/07/10 22:06
/cpu/exception.cppによれば, --- BX_CPU_THIS_PTR errorno++; if (BX_CPU_THIS_PTR errorno >= 3) { BX_PANIC(("exception(): 3rd exception with no resolution")); BX_ERROR(("WARNING: Any simulation after this point is completely bogus.")); #if BX_DEBUGGER bx_guard.special_unwind_stack = true; #endif return; } --- 3回目の割り込みは発生しちゃだめって事らしいヨ
>>700 それ俺もなった。で試行錯誤の結果やっと上手くいった。
それ貼るからちょっと待ってて。
3rd exception を発生させずにプロテクトモードに移行できたバージョン 1/2 基本的には、『はじめて(略』に従ったけど、一部変えてある 2nd-boot は俺は 0x0100 セグメントに読みこまれるように してあるから リニアアドレスに変換する部分では 0x1000 を足している。 もっと上手い方法がありそうだけど分からない。また、『はじめて(略』に 書かれている offset は nasmでは使えなかった。 最初はこのリニアアドレス変換をしていなくて 3rd exception しまくってた。 ------------ [ORG 0] bits16 lgdt[gdtr] RealToProto cli moveax,cr0 oreax,1 movcr0,eax ;; jmpflush_q1 gdtr:dw256 * 8 -1 ; ここは適当 ( eota に従った ) ddgdt + 0x1000 ; リニアアドレスに変換 gdt: dw0; limitL dw0; baseL db0; baseM db0; type db0; limitH db0; baseH ;; seg-08 (code-seg) dw0xffff; limitL dw0; baseL db0; baseM db0x9a; type code db0xcf; limitH db0; baseH ;; seg-10 (data-seg) dw0xffff; limitL dw0; baseL db0; baseM db0x92; type data db0xcf; limitH db0; baseH ;; seg-18 (stack-seg) dw0; limitL dw0; baseL db0; baseM db0x96; type data db0xc0; limitH db0; baseH ; -------------------- 大きすぎて一度に書き込めないので一度ここで切る。
>>703 の続き
3rd exception を発生させずにプロテクトモードに移行できたバージョン 2/2
------------
bits32
flush_q1:
db0eah
dw set_cs_desc1 + 0x1000 ; リニアアドレスに変換
dw08h ; 08h は code-segment
set_cs_desc1:
moveax,10h ; 10h は data-segment
movds,ax
moves,ax
moveax,18h ; 18h は stack-segment
movss,ax
movesp,0x1000 ; ここが 0 だとなぜかエラー
hello:movedi,0B8000h
moval,'2'
callprint
moval,'c'
callprint
moval,'h'
callprint
hang:
jmphang
printmov[edi],al
addedi,2
ret
times512-($-$$)db 0
ごめんタブが消えた、、、
>>705 どうもありがとうございました。これから格闘してみます。
ここまではなんとかなりましたが、ここからが厳しいところですね。
頑張りたいと思います
708 :
デフォルトの名無しさん :02/07/11 00:46
少なくとも3人は出来るやつがいる模様。(ひげぽんも含む) お前ら全員で2ch OS作ってください。
もちろん 2ch 運営に最適化されたOSということで (w
運営ですか!!!
作っても夜勤が採用しないワナ。
説得汁。
作れないうちから心配するなアフ
714 :
デフォルトの名無しさん :02/07/11 01:24
> 704 > movesp,0x1000 ; ここが 0 だとなぜかエラー 0だとスタックに積んだとたんに逝っちゃうよ。
無事動きましたー。csが1000ならアドレスは10000だということを忘れてました。 こんにちはプロテクトモード
とりあえず、2ndローダでプロテクトモードに切り替えるところまで成功。 PE形式のカーネルのロードは面倒そうだ…。
皆さんブートローダの次のステップをどのようにする予定ですか?
メモリマネージャとタスクマネージャ
文字出力、ファイルIO、プロセス終了のファンクションリクエストくらいあれば、とりあえずいろいろ動かせる。
>>720 いきなりは無理では。
まず、
1. とりあえず何もしなくていいから、OSを終了するシステムコール(Halt)
2. 1文字ずつコンソールに出力するシステムコール(Input)
3. キーボードから1文字ずつ入力を受け取るシステムコール(Output、後回しで
いいかも)
4. ディスクのセクタを直接指定して読み書きするシステムコール(Read, Write)
5. 特権モードのままでいいし、特定の物理メモリ上でいいし、一つしか実行で
きず、呼び出したタスクに戻ってこなくていいから、ディスクから読み込んだ
バイナリを展開し、実行するシステムコール(Exec)
6. とりあえず何もしなくていいから、タスクを終了するシステムコール(Exit)
を実装し、
ブートローダ
↓
カーネル
↓
文字を表示し、入力を受け取り、特定のセクタの内容を読み込み表示し、特定の
セクタに適当なデータを書込み、終了する、Cで書かれたプログラム
という感じで動作するものを作ってみるのはどうだろう。
そのあとで、ユーザモードで動作し、複数展開可能で、呼び出したタスクに戻って
くるExecを実装し、ユーザモードで動く簡単なコマンドラインシェルを実装する、
というのはどう?
>>721 あ、かぶった。
>>722 をちょい訂正。
> 2. 1文字ずつコンソールに出力するシステムコール(Input)
> 3. キーボードから1文字ずつ入力を受け取るシステムコール(Output)
名前が逆じゃん、出力がOutputで入力がInputね。
724 :
デフォルトの名無しさん :02/07/11 19:12
ネイティブな開発はよくわからんが システムコールの設計は慎重にやってくれよp
>>724 別に
>>722 のシステムコールを最後までそのまま使えって意味じゃないよ。
あくまで暫定的なもの。ファイルシステムがなければ、openやread、write、
close等のファイルに関するシステムコールなんて作れないでしょ?ファイル
システムやメモリマネージャが出来たら、そのときシステムコールを作り
直せばいい。
実務開発で言うなら、いわば技術検証(と言う名のお勉強)でしょ? まだ設計に入る段階じゃないと思われ。 勿論、先に設計が来る方が良いけど、未経験なんだから良いんじゃないの?
だよねーテヘヘぼくちゃん先走っちゃったアハハ
そのうちlibcを採用しようかと・・・
いま、 eota の boot/2nd/console.c とか boot/2nd/lib.c あたりを 読んでる。lib.c の set_cursor_pos が、こんな感じになってる。 ------------------------- void set_cursor_pos (int x, int y) { int addr; lock (); addr = CURSOR_POS (x, y); /* addr *= 2; */ outb (GDC_ADDR, 0x0e); outb (GDC_DATA, (addr >> 8) & 0xff); outb (GDC_ADDR, 0x0f); outb (GDC_DATA, addr & 0xff); unlock (); } ----------------------- lock(), unlock は各々 cli,sti を実行するだけ。 で質問だけど、 (1) こんな風に IO ポートのどこに何を書けばどうなるのか、 ってのはどっかにまとめて載ってない? (2) なんでここで割り込みを禁止する必要があるの? まあ漠然とは、 outb(GDC_ADDR,xxxx) と outb(GDC_DATA,xxxx) の間に 余計なIO ポートアクセスがあったらまずい気がするなぁと感じるけど それであってる?
>>722 かなり賛成。ちょうど良い目標ダネ。
ただちょっと分からなかったんだけど
>>722 の 5 はマルチタスクを
想定しているの? オレはシングルタスクで call とか jmp 使えば
いいと思うんだけど。
あとバイナリを展開ってどの程度のこと考えてる?
オレは実行イメージそのままで良いと思ってる。(固定アドレスに置くんだから)
あと、
>>722 では触れられてないけど、VRAMとか IOポートにアクセスするのは
step 1
ライブラリっぽいものを書いてそれをプログラムにスタティックリンクさせる。
step 2
システムコールとして実装
という段階を踏んだ方が良さそう。
で確認なんだけど step 2では、ソフトウェア割り込み使えばいいんだっけ?
そして割り込みを発生させる関数をスタティックリンクすればOK?
>>735 システムコールの呼び出しにはコールゲートかトラップゲートを使うかと。
きょう始めてよむ486が届いた 7月11日に発送してもらったんだけど、はじめて読む486の12刷発行が 7月11日だった。(わら はじめて読む8086の方がまだだ、本来こっちの方が先に届いてほしいんだが。
そんなに売れてるのか… > はじめて読む 折れもリア厨のころに買って読んで、サンプル必死に打ってた気がする。 8086の方は英語がOKなら、上でガイシュツのInterrupt Listとかで十分間に合う。はず。
>>738 どうも
僕は英語駄目なんで(英検三級がやっととれたレベル)、日本国内で日本語を使用した
86系アセンブラの解説ページで勉強しようと思うのですが、、、
始めて読む8086の注文はキャンセルしました
超亀レスですごめんなさい。
>>653 NASMだけです。C言語を使うほどでもありませんし。
>>654 あとsuppl.zipが要るかも。ソースの\supplに説明があるはず。
オールアセンブラ Σヽ(´i i`)ノ ぬりがとう
743 :
デフォルトの名無しさん :02/07/12 23:13
C言語から呼び出すときのアセンブラのコードで 破壊していいレジスタはどれ? eax,edx は戻り値に使われるから分かるけど、他のは? ぐぐったら windows での話は出てきたけど、これってコンパイラ依存の 話だからgcc なら別だよな?
そんなもん、gccで関数をasm出力すれば わかるだろうに。
edi
>>741 Thank you.
これから調べてみます
プロテクトモードでjmpするとエラーになってしまう...なんでだー
>>654 ヴぁー、申し訳ない。あれcommand.comの作り方だった‥‥
カーネルはあそこの説明のとおりでよかったです。
しかもスレ沈めまくってさらに申し訳ない(汗
おくれてしまったひでぽんです。 どうしても3rd exception with no resolutionが出てしまいます。 どなたかアドバイスをいただけたら幸いです。 以下エラーになるソースを貼らせていただきます。
RealToProtect: lgdt [gdtr] ; load gdtr cli ; disable interrupt mov eax, cr0 ; real or eax, 1 ; to mov cr0, eax ; protect jmp flush_q1 flush_q1: db 0eah dw set_cs_desc1 + 1000h dw 08h jmp hang set_cs_desc1: mov ax, 10h mov ds, ax mov es, ax mov ax, 18h mov ss, ax mov sp, 0x1000
;------------------------------------------------------------------------------- ; GDT definition ;------------------------------------------------------------------------------- gdtr: dw gdt_end - gdt0 - 1 ; gdt limit dd gdt0 + 1000h * 16 ; start adderess gdt0: ; segment 00 dw 0 ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0 ; segment type db 0 ; segment limitH db 0 ; segment baseH gdt08: ; segment 08(code segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x9a ; Type Code db 0xcf ; segment limitH db 0 ; segment baseH
gdt10: ; segment 10(data segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x92 ; Type Data db 0xcf ; segment limitH db 0 ; segment baseH gdt18: ; segment 18(stack segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x96 ; Type Stack db 0xcf ; segment limitH db 0 ; segment baseH gdt_end: ; end of gdt hang: jmp hang print: mov [edi], al add edi , 2 ret
>>749 gdt08のセグメントベースは10000hにしてみてはどうでしょうか?
違うかな
>>747 は既に解決してますか?まだなら俺にちょっと心当たりがあります。
もしかして、cs を 08h とかそう言うGDTRで設定したセグメントにする前の段階の話じゃないですか?
>>750 と
>>751 の間に抜けてるものはない? コピペミスじゃない?
mov sp,0x1000 のあとに jmp が必要でしょ。
>>753 ありがとうございます。
gdt08: ; segment 08(code segment)
dw 0xffff ; segment limitL
dw 0x00000001 ; segment baseL
db 0 ; segment baseM
db 0x9a ; Type Code
db 0xcf ; segment limitH
db 0 ; segment baseH
としてみましたが、だめでした。
Bochsがエラーを出すときセグメントは↓となっています。
00000195256i[CPU ] | DS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | ES:1000( 0000| 0| 0) 00010000 0000ffff 0 0
00000195256i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | SS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | CS:1000( 0000| 0| 0) 00010000 0000ffff 0 0
>>755 おっしゃるとおりコピペミスです。
jmp hang
があります。
ひげぽんまだ寝るなよ。あとで、アドバイスすっから。
>>754 それが設定した後なんです。
それと753に書いたの間違えました。
dw set_cs_desc1+1000h
は+10000hではないでしょうか?
>>758 ありがとうございます。
お待ちしております。
よろしくです。
>>759 そうですか、じゃあ関係ないかもです。役に立てんでごめんです。
あと、 10000h は dw に入らないんじゃない?
ひげぽんは
>>750 からのコードどこに置いた? 1000h?
あと、エラーのときの IP も書いて欲しい。それがそのコードどこにあたるのかとかも
それから
bochsout.txt の
00010420000i[CPU ] protected mode
00010420000i[CPU ] CS.d_b = 32 bit
00010420000i[CPU ] SS.d_b = 32 bit
↑ここの部分はどうなってた?
まとめると、多分こう言うことだ。 エラーのとき CSが1000hになっているってことは、 コードはリニアアドレスで 10000h に置いたってことだ。 だから、 dw set_cs_desc1 + 1000h ここは、 dw set_cs_desc1 + 10000h にしなければ行けない。(リニアアドレスを書かなければ行けないから) でもそれだと dw に入らない。 ↓ 結論もっと低いアドレスに置くべき。
おいっ!寝たのかよ!!レスしろよ。 あと32ビットモードになったら bits 32 にしないとだめだよ。
ちっ、寝ちまったか。 ------------ bits 16 L1: jmp L1 bits 32 jmp L1 ------------ じゃ、起きたら、このコードをアセンブルしてそれをdumpで見て それが何を意味するのかよーく考えろよ。 じゃな。
>>761 >ひげぽんは
>>750 からのコードどこに置いた? 1000h?
1000hです。
>696のreadのところで読み込んでます。
>あと、エラーのときの IP も書いて欲しい。それがそのコードどこにあたるのかとかも
00000195256i[CPU ] | EIP=0000001a (00000015)
となっています。
bochsout.txtは↓となってしました。
00000195256i[SYS ] Last time is 1026574623
00000195256i[CPU ] protected mode
00000195256i[CPU ] CS.d_b = 16 bit
00000195256i[CPU ] SS.d_b = 16 bit
>>762 dw set_cs_desc1 + 10000h
としてみて、アセンブルすると
通ってしまうのですが、Okなのでしょうか。
>763 764 入れ違いです。すいません。
調べるてみると
label:
jmp label
はだめで
jmp label
label:
はエラーなしでした。
>>765 もし1000hなら
dd gdt0+1000h*16
の*16hがいらないのではないでしょうか?
770 :
デフォルトの名無しさん :02/07/14 00:46
>>768 CPUが32bit モードになっているのにbits 32を書いてないので、
コードが32bit用に成っていないのでは?
>>764 は試してみた?
771 :
デフォルトの名無しさん :02/07/14 00:48
>>765 CS が 1000h になっているのに実行イメージが1000hに置かれてるって
なんか勘違いしてませんか?
>>770 [bits 32]
flush_q1:
としてみました。
>>771 read:
mov ax, 1000h
mov es, ax ; es:bx is
mov bx, 0 ; data buffer
mov ah, 02h ; read sectors into memory
mov al, 5 ; number of sectors to read
mov ch, 0 ; low eight bits of cylinder number
mov cl, 2 ; sector number
mov dh, 0 ; head number
mov dl, 0 ; drive number
int 13h ; read!
jc read
jmp 1000h:0000 ; jump to the secondboot
とすると、1000hに読み込まれた実行イメージにジャンプするという
認識だったのですが、もしかして出発点から間違ってます?
>>769 さん。
上記
>>772 の1000hの部分を0100hにしてかつ、
[bits 32]
flush_q1:
db 0eah
dw set_cs_desc1 + 100h * 16
dw 08h
jmp hang
および
gdtr:
dw gdt_end - gdt0 - 1 ; gdt limit
dd gdt0 + 100h ; start adderess
としてみましたがだめでした。
>>772 それなら、リニアアドレスでは10000hになるのは分かる?
そして、flush_q1 の後のジャンプの場所指定で書かなければいけないのはリニアアドレス。
(なぜならもうプロテクトモードなんだし、08 のコードセグメントのベースが0に成っているから)
>>773 違う。 gdtr の所の start addressはリニアアドレス。
あと、「上手くいった/だめだった」の二元論ではなくどこでエラーが
起きたのかが重要。ダメなときはどこで止まったのか調べないと。
>>774 なるほど良く分かりました。
ということは、もともとのCS * 16するってことですよね。
でもうまくいかないです。
だいぶ前進したとは思うのですが、
>>776 さんのおっしゃる通りなのでちょっとまとめます。
現在の状況は
0100hに読み込まれたイメージの中でプロテクトモードに移行しようとしているが
以下のようなエラーが出てしまう。
00000195256i[CPU ] protected mode
00000195256i[CPU ] CS.d_b = 16 bit
00000195256i[CPU ] SS.d_b = 16 bit
00000195256i[CPU ] | EAX=60000011 EBX=00000000 ECX=00010002 EDX=00000000
00000195256i[CPU ] | ESP=0000fffe EBP=00000000 ESI=00000025 EDI=0000ffe4
00000195256i[CPU ] | IOPL=0 NV UP DI PL NZ NA PE NC
00000195256i[CPU ] | SEG selector base limit G D
00000195256i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00000195256i[CPU ] | DS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | ES:0100( 0000| 0| 0) 00001000 0000ffff 0 0
00000195256i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | SS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | CS:0100( 0000| 0| 0) 00001000 0000ffff 0 0
00000195256i[CPU ] | EIP=0000003b (0000003b)
移行時に実行していること gdtr: dw gdt_end - gdt0 - 1 ; gdt limit dd gdt0 + 100h * 16 ; start adderess ---- [bits 32] flush_q1: db 0eah dw set_cs_desc1 + 100h * 16 dw 08h jmp hang うーんどこが悪いかが分からない。 もう少しねばってみます。
flush_q1 では実はまだ32bit モードじゃないらしいんだよ。 おれも詳しくは分からないけどプロテクトモードだけど16bit モードってのがあるらしい。 (bochs のソースを見てそう思った) 本当に32bit モードに成るのは CS が 08 に成ってから。 だから、それだとbits32を置く場所がちょっと違う。
>>779 ありがとうございます。
bits 32の場所を変えてみましたが、だめでした。
>>704 (プロテクトモード移行成功)も同じ場所だったので
今回のエラーの直接の原因ではないかもしれません。
>>780 了解。
じゃあ、エラーが起きてる IP=0x003b のところはソースでいうどこにあたる?
>>781 さん
IPってオフセットアドレスですよね?
ソースのどの部分が該当するかを調べるには
どうしたらよいのでしょうか
質問ばかりで申し訳ないです。
>>783 DJGPPにgdb.exeがついてきていましたが
これでよいですか?
使ったことがないのですが、これで出来るなら
明日にでも勉強いたします。
gdbで、いいかどうかはちょっと分からない。 ベクターとかにありそうなMS-DOS用のcomファイルを調べられるの使うのが良い。 あとは、nasm の -l オプションかな。
遅くまでありがとうございます。 実行しながらデバッグするのでしょうか? それだとBochsの機能でなにかあるのかなあ。
もしかしたら bochs にそういう機能があるかもしれないけど俺は分からん。 つうか、今はどこでエラーが起きたのか分かれば良いんだから、 実行しながらデバグなんてしなくて良いよ。 -l は試した? 結局 3b ってどこなのさっ!!
なにも変更してないのに突然エラーなくなりました。わけわからん。 相談に乗っていただいた方どうもありがとうございました。
>>747 おめでと。役に立てなくてゴメン。
またなんかあったら聞いてね。今度こそ役立つアドバイスするカラ
またエラーになった...もう寝よう
おはようございます。 nasm -l でリストを出力しました。 62 00000031 AC <2> lodsb 63 00000032 3C00 <2> cmp al, 0 64 00000034 7409 <2> je %%end 65 00000036 B40E <2> mov ah, 0Eh 66 00000038 B700 <2> mov bh, 0 67 0000003A CD10 <2> int 10h 68 0000003C E9F2FF <2> jmp %%hige 69 <2> %%end: 70 0000003F 58 <2> pop ax 71 <1> 72 <1> reset: 3bはどこにあるのでしょうか。
いろいろ調べてみると プロテクトモード移行直後の jmp flush_q1以降で死んでいるようです。 jmp hangとすると3rd exceptionは発生しませんでした。
今でも死ぬときのIPは 3bなの?
ええ。 3bです。こんな感じです。 00000195256i[CPU ] | EIP=0000003b (0000003b)
[bits 16] RealToProtect: lgdt [gdtr] ; load gdtr cli ; disable interrupt mov eax, cr0 ; real or eax, 1 ; to mov cr0, eax ; protect jmp flush_q1 ;------------------------------------------------------------------------------- ; GDT definition ;------------------------------------------------------------------------------- gdtr: dw gdt_end - gdt0 - 1 ; gdt limit dd gdt0 + 100h * 16 ; start adderess gdt0: ; segment 00 dw 0 ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0 ; segment type db 0 ; segment limitH db 0 ; segment baseH
gdt08: ; segment 08(code segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x9a ; Type Code db 0xcf ; segment limitH db 0 ; segment baseH gdt10: ; segment 10(data segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x92 ; Type Data db 0xcf ; segment limitH db 0 ; segment baseH
gdt18: ; segment 18(stack segment) dw 0 ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x96 ; Type Stack db 0xcf ; segment limitH db 0 ; segment baseH gdt_end: ; end of gdt
[bits 32] flush_q1: db 0eah dw set_cs_desc1 + 100h * 16 dw 08h set_cs_desc1: mov ax, 10h mov ds, ax mov es, ax mov ax, 18h mov ss, ax mov sp, 0x100 jmp hang hang: jmp hang ; ; print: ; ; mov [edi], al ; ; add edi , 2 ; ; ret
>>795 板を汚して申し訳ありません。
現状は上記の通りです。
>>801 さん。
ええその通りです。
BIOS経由で文字列出力する部分です。
nasmでアセンブルするときはひとつにまとめるので
リストもfirst boot, second bootもあわせたものになっています。
>>802 Σ(゚д゚lll)ガーン もっと考えれ。
second boot の先頭を 0 として 3b がどこかを調べなきゃ意味ないだろ。
>>800 うーん、リスティングファイルの方がよかったかも。
で。
>>695 とか見ると、リニアアドレス0x0010000にそのコードをロードしてるみたいだけど。
> gdtr:
> dw gdt_end - gdt0 - 1 ; gdt limit
> dd gdt0 + 100h * 16 ; start adderess
dd 0010000h+gdt0では?
> flush_q1:
> db 0eah
> dw set_cs_desc1 + 100h * 16
> dw 08h
こっちも。
あと、どっかに垢取ってそっちにコード全体を上げた方がいいかも。
もしかしてひげぽんは 1st-boot と 2nd-boot くっつけてアセンブルしない? 別々にアセンブルしてからくっつけた方が良いかも
あと、ベースアドレスが00010000h、リミットが0000FFFFhで16ビットのセレクタを用意して、 そっちで作業した方が楽だと思われ。 ベースアドレスが00000000hのセレクタに切り替えると、オフセット計算が面倒なことになる。
>>806 の詳しい解説
1st-boot は、 2nd-boot の先頭が 1000hにくるように
ディスクをロードする。
だから、2nd-boot の先頭から数えた offset に 1000h を加算すれば
それがちょうど リニアアドレスになる。
しかし、ひげぽんは1st-bootと2nd-boot をくっつけて
アセンブルしているので、offsetがずれてしまう。
nasm -l の出力で
dd gdt0 + 100h * 16 ; start adderess
dw set_cs_desc1 + 100h * 16
この2行がどうアセブルされているか見てみ。
前者が [1B100000] 後者が[4010]なら正しいぞ。
でもそうなっていないはず。
で、今度はばらばらにアセンブルしてみな。
すると上のようになるはずだ。それを確認したら
copy とか dd とかつかって二つをくっつける。
これで上手く行くはず。
>>808 >>696 でes:bxが1000:0000だからリニアアドレスは00010000hだって。
>>806 >>808 まとめてアセンブルしてました。
(1)まとめてアセンブルした場合
133 00000217 [1B120000] <1> dd gdt0 + 100h * 16 ; start adderess
172 0000023C [4012] <1> dw set_cs_desc1 + 100h * 16
(2)secondboot.asm単体アセンブルの場合
22 00000017 [1B100000] dd gdt0 + 100h * 16 ; start adderess
61 0000003C [4010] dw set_cs_desc1 + 100h * 16
>>808 さんのおっしゃる通りになってました。
今から別々にアセンブルを試してみます。
ドマイ。オフセットをWORDに入れなきゃだから。
>>807 みたいな手もあるけど、、、、。
ひげぽんです。 皆さんありがとうございます。 別々アセンブルでも同じIPでエラーが起きてしまいました。 今から外出しなければいけなくなってしまったので 戻り次第アカウントを取得してソースを簡単に公開できるようにします。 ところで copy firstboot.bin + secondboot.bin higeboot.bin をddコマンドでやるにはどうやったら良いんでしょうか? if=で複数ファイルを指定してみたらうまくいかなかった。
>>814 そっか。自信あったんだけどダメだったか。
ソース公開を待つことにするよ。
あれ?やっぱできるじゃん。
俺、ひげぽんの
>>796 - 799 と自作 1st-boot で、上手く行ったよ。
もしかして 1st-boot で、 ds を設定していないとか言うオチですか?
やっと、ソースをほぼ自動的にhtmlとしてアップする仕組みが出来た。 今日は、OS製作以外でちょっとだけプログラムした・・・ 最近は、ftpの出来ないフリースペースが多いですね。 アップロードをスクリプトに出来なくて面倒なので ftpのokなtripodにしました。
>>818 もちろんアセンブラで書いたんですよね?
>>818 > 10 00000000 0F0116[1500] lgdt [gdtr] ; load gdtr
この時のDSレジスタの値は?
firstbootで設定された07C0hを引きずってるように見えるが。
>>821 07C0hを引きずっています。
load gdtrした後に
flush→CSセットとなるのかな。
00000195256i[CPU ] | DS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | ES:0100( 0000| 0| 0) 00001000 0000ffff 0 0
00000195256i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000195256i[CPU ] | SS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0
00000195256i[CPU ] | CS:0100( 0000| 0| 0) 00001000 0000ffff 0 0
00000195256i[CPU ] | EIP=0000003b (0000003b)
じゃ、それが原因。 GDTRに不正な値をロード。 far jump時にCSレジスタに不正な位置を指したセレクタをロードしようとする。 一般保護例外発生。 例外ハンドラに処理を渡そうとする。 IDTRがセットされてないので失敗。 ダブルフォールトの例外ハンドラに処理を渡そうとする。 当然失敗。 トリプルフォールトであぼーん。 こんなシナリオかと。 lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか。
>>814 自己レスです。
>copy firstboot.bin + secondboot.bin higeboot.bin
>をddコマンドでやるにはどうやったら良いんでしょうか?
>if=で複数ファイルを指定してみたらうまくいかなかった。
catでうまくいきました。
catってバイナリファイルも連結できるんですね・・・
>>821 >>823 さん
>GDTRに不正な値をロード。
gdtrにロードするアドレスが不正なのか
それともディスクリプタテーブルにセットされている
セグメント設計が不正なのでしょうか。
>lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか
ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。
>>825 GDTRにロードされる値。
リスティングファイルを見ながらどんなアドレスが生成されるか考えてみよう。
gdtrの指すアドレスは0100:0015。
実効アドレスは00000115h。
lgdt [gdtr]でロードされるのはds:gdtr。
dsレジスタは07C0hだから07C0:0015。
実効アドレスは00007C15h。
> ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。
スマソ、cs:[gdtr]はmasmの書き方だった。
nasmでは[cs:gdtr]。
> gdtrの指すアドレスは0100:0015。 > 実効アドレスは00000115h。 嘘書くなよ、俺。 00001015hが正解。
つーか、実効アドレスの意味間違ってるような。 実効アドレス→リニアアドレスに訂正。
http://ime.nu/oshigepon.tripod.co.jp/ [報告]
結論から言うとnasmでは[cs:gdtr]でばっちりうまくいきました。
>lgdt [gdtr]でロードされるのはds:gdtr。
ということは、secondbootにジャンプしたときに
dsをきちんとセットしていなかったのが問題だったわけですね。
mov ax, cs
mov ds, ax
lgdt [gdtr] ; load gdtr
でもうまくいきました。
アドバイスを下さったたくさんの方々
ありがとうございます。
http://ime.nu/ime.nu/oshigepon.tripod.co.jp/ 今回の反省点[プロテクトモード移行時]
・アセンブラファイルを分割していたことを考慮していなかった。
・リニアアドレスを設定しなければいけないところを考慮できていなかった。
・firstbootからsecondbootにジャンプしたときにdsを設定しなおさかった。
・nasm -lを知らなかった。
・bits 16,bits 32の記述をしていなかった。
いろいろです。
[次の目標] インラインアセンブラを駆使しつつ、Cでソースをかいて 32bitコンパイラでコンパイルする。 出来上がったバイナリを、secondbootで読み込み実行する。
プロテクトモード移行に成功したソースを
http://oshigepon.tripod.co.jp/ に置きました。
プロテクモード万歳!!!
皆さんありがとうございます。
00161809000i[CPU ] protected mode
00161809000i[CPU ] CS.d_b = 32 bit
00161809000i[CPU ] SS.d_b = 32 bit
本当に皆さんのおかげでこのスレッドは、非常に有用な
スレッドになっていると思います。
大変お世話になっております、そしてこれからもよろしくお願いいたします。
私と同様に、OSを本気で作ろうと考えている人たち
一緒にがんばりましょう。
ひげぽんまだいる?もう少し補足がある。
>>835 了解です。
そろそろ仮称でも良いからPJ名(OS名)を決めないと・・・
取り返しがつかなくなる気がする。
higeboot.asmって結構恥ずかしい名前だ。
どなたかかっこいい名前ありませんか?
higepos
>>837 >higepos
ちなみになんて読むの?ひげぷおーえす?
もし万が一、有名になって、ちょっとでも外人に名前が知られるように
なったとしたら、なんて発音するんだって揉めそう(←もめないって?)
ヒゲポソ
まんこ
>>839 あ!半角カタカナにして、2chであることを考慮すると
読めるってことですね。
良い名前随時募集中!!
842 :
デフォルトの名無しさん :02/07/14 20:44
2chOS
2ちゃんどうず
>>842 >2chOS
見た目は非常に良いですね。
にちゃんおーえす?
にこす?
>>843 >2ちゃんどうず
なんか微妙です。
2chdows?
OSASK,nwsosもそれぞれ読み方が良く分からないです。
引き続き募集!
OSASK -> おさすく/おーえすあすく NWSOS -> なうえすおーえす‥‥と呼んでいる しっかし、いい名前っていうと思いつかんなぁ
GATES FREE
>>845 >OSASK -> おさすく/おーえすあすく
>NWSOS -> なうえすおーえす‥‥と呼んでいる
なるほど。
おさすくかあー
>しっかし、いい名前っていうと思いつかんなぁ
そうですよね。
linuxって人の名前からとった割には、
かっこいい名前ですよね。
>>846 >GATES FREE
ストレートですね。
受けは良いかもしれませんが・・・
これって、門が開いている(だれでもいいよ)
っていう意味にも取れるのかな?
→英語得意な方
OSの特徴がはっきりしないんじゃ 名前の付けようがないだろ。 プロジェクト名ならhigeposでもかまわん。
超ひげぽん
>>848 >OSの特徴がはっきりしないんじゃ
>名前の付けようがないだろ。
>プロジェクト名ならhigeposでもかまわん。
ちょっとこの案に傾いてきた。
でも、ひげ生えてないんだよね。全然・・・
名前変えようかな・・・
よし、かっちょいい名前考えてやるから本名晒せ。
PJ名(仮称):higeposに決定!!! しました。 今後ともよろしくお願いいたします。
ホントに採用されるとは思わなかった (w
>>853 おめでとうございます???
名付け親ですね。
855 :
デフォルトの名無しさん :02/07/14 21:59
ひげぽんプロテクトモード到達 & higeposプロジェクト開始 まとめてage
名前はともかくとして、secondbootのCR0書き換えたあとのジャンプって farジャンプなの?これじゃ問題がないとは言えないような‥‥‥ 万全を期したいなら、farジャンプにするために DB 0x2E JMP なんとか っていう形にしてしまえばいいと思うよ。間違ってたらゴミン
>>856 この部分で実際ジャンプしていると思います。
でも自信なし・・・
flush_q1:
db 0eah
dw set_cs_desc1 + 100h * 16
dw 08h
gccでインラインアセンブラということは、 Intel形式ではないのですね・・・ アセンブラからCでコンパイルした実行イメージを読み込めるようがんばります。 int main() { asm("cli"); return 0; } こんなやつがsecondbootから呼べればよいんだよね。 がんばろう。
ひげぽんがCからアセンブラの関数を呼ぼうとせずに インラインアセンブラにこだわる理由って何?
>>859 別にこだわってないですよ。
>>859 さん
インラインアセンブラ方法と
Cからアセンブラを呼ぶ方法
どちらが方法として一般的ですか?
どちらが容易ですか。
やはりどちらとも経験しておいたほうが良いでしょうか。
>>857 それであってますよ。
[bit16]
flush_q1:
jmp 8:set_cs_desc1 + 1000h
の方がわかりやすいですけど...。
>>861 >この部分で実際ジャンプしていると思います。
>でも自信なし・・・
>flush_q1:
> db 0eah
> dw set_cs_desc1 + 100h * 16
> dw 08h
↑は、はじめての486からのパクリです。
はじめて・・・によると、
「セレクタ地を使ったセグメント間ジャンプ命令をニーモニックでは記述できないので
マシン語命令コードを直接している」
そうです。
セレクタ地→セレクタ値
>>860 どちらが一般的かは知らんが、俺は関数として
アセンブリを呼ぶことを勧める。
まぁ、まずはこれを見ろよ。
http://ghost.math.sci.hokudai.ac.jp/speedmania/speedmania-6.html オールアセンブリでなくC言語を使う理由って何だよ?
「書きやすさ、読みやすさ、保守のしやすさ、バグの入りにくさ。」
じゃないのか?
このページに載ってるのはとてもC言語らしくない醜い物だと思うぞ、俺は。
一方アセンブリで書いた関数をCから呼ぶ場合、アセンブリ部こんな感じ。
;
; void outb(word ioaddr,byte data);
;
; +-----------------------+ sp
; | return addr |
; +-----------------------+ +4
; | ioaddr |
; +-----------------------+ +8
; | data |
; +-----------------------+
outb:
mov edx,[esp+4]
mov eax,[esp+8]
out dx,al
ret
ブラウザで見ると激しくズレるので等幅フォントで見てくれよ。
Cから呼び出すには、上に書いたプロトタイプにしたがって呼び出せば良い。
よほどキレイだろ。
一応、考えられる反論も書いとく:
(1)#define マクロを使えばもっとキレイにできる。
→ バグの入りやすさは変わらんだろ。
(2)関数を呼ぶとオーバーヘッドがかかる。
→なら最初からCなんか使うなよ。
(3)リンクが大変だ。
→割り込みのコールバック関数は iret で戻らなきゃ行けないから、
そこではアセンブリ使わざるを得ないだろ。だから結局
C言語とアセンブリのリンク作業は避けられん。
ちなみにリンク作業に付いて補足しておくとウチのところでは、
gcc -c xxxx.c
nasm -f aout yyyy.asm
ld -oformat binary xxxx.o yyyy.o
で上手く行ったぞ。あと必要に応じて -Ttext、 -Tdata、 -Tbbs、 -e
等をつければOK
>>862 「はじめての486」はMASMを前堤に書いているから
そうなのかもしれん。しかし、NASMなら
>>861 でできるぞ。
>>864 大変貴重なご意見ありがとう。
確かにインラインアセンブラは、アセンブラとCが共存している時点
で見やすくはありませんね。
#define lock() asm("cil")
見たいなのはありですよね?
>>864 さんが
せっかく方法を提示してくれたので
明日挑戦してみます。
>>866 プログラムやるならコード書くときくらいはミスタイプに慎重になれよ。
cliですね。
>>861 プロテクトモードに移行したら速やかにパイプラインの初期化をしなきゃ
ヘタな16bitコードが間に入ると落ちたりする‥‥けど、この場合は
ぜんぜん問題なさそうですね。なんかいらん心配してました(汗
なんかよくわからんけど ひげぽん第一目標クリアしたのかな。 とりあえずおめでとさん〜。 #こんぱいる済みのもアップしてみてほすぃ。
>>871 higeboot.binもアップするようにしました。
Bochsでフロッピーイメージとして設定すると
ブートできますよ。
実際のディスクにddコマンドで書いてもよいけど。
>>864 ちょっと観点がずれてない ?
> Cから呼び出すには、上に書いたプロトタイプにしたがって呼び出せば良い。
と言うのは、当然なんだけど、要は呼び出され側をどう作るかじゃないの ?
フルアセンブラで、
outb:
mov edx,[esp+4]
mov eax,[esp+8]
out dx,al
ret
と書くのと C + インラインアセンブラで
void outp(word ioaddr, byte data)
{
asm("out %%dx,%%al"
:
: "d"(ioaddr), "a"(data));
}
と書くののどちらがいいかの問題だと思う。個人的には、[esp+4] なんかが結構
面倒と思う。特にローカル変数とか持つとね。そう言うところは、コンパイラに
やらせるべきだと思うけど...。
>>873 ああ、言われてみればそんな気がして来た。
俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
インラインアセンブラの使い方が嫌なだけだった。
インラインアセンブラ をごっそり関数で括ってあとは
そっちだけ利用すれば一緒だな。
gasの文法を使わなきゃ行けなかったり、
: "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
でも、それって確かに主観の問題だ。
>>873 ,
>>874 うーん迷いますね。
gasの文法で書かなければいけないのが
インラインアセンブラの微妙なところかもしれないです。
→正直
結局gasでよいなら、もともとnasmなんか使わなければ・・・
迷うので明日の朝起きてから考えよう。
ひげぽんは、結構質問屋だけど 質問する前に、自分である程度試しているみたいだし 学習スピードが速いね。 これって結構すごいと思う。 応援しているのでがんばってね。 もうすぐ多分、俺もついていけなくなる(技術的に)
ここってマジに作ってんの?
他の板でこのスレの宣伝してる奴がいる… 宣伝厨うぜぇ。
このスレ見てると、「おちこぼれ」の気分になれます。
関数をインライン展開したくなったときにフルアセンブラの関数だと厄介だよね。
>>879 この掲示板にいる人がおちこぼれってこと?
882 :
デフォルトの名無しさん :02/07/15 22:53
サンプル
cの配列ってbssセクションにメモリが確保されるの? putchar関数をつくってみたけどちゃんと動かない。
bssは静的配列だけだろ
>>883 初期化してるなら data、 してないなら bss、 ローカル変数ならスタックじゃない?
でも、一度アセンブリ出力したのを見た方が確実かも。
>>885 さんの通りでした。どこに配置されているかはわかったものの
なにが悪いのかよくわかっていないので、これから解決してみます
.ldsが書けない。欝だ死ぬ
888 :
デフォルトの名無しさん :02/07/16 18:54
NOWSMART OS クロス開発環境 DL 可能記念あげ。
だめだどうすればいいのかわかんない...
890 :
デフォルトの名無しさん :02/07/16 19:03
nowsmartって独自の開発環境があるの?
891 :
デフォルトの名無しさん :02/07/16 19:06
>>890 あるよ。
独自開発の「処理系」が。
言語自体は独自じゃなく、MASM 準拠、ANSI C 準拠みたいだけど。
まあ、独自言語よりも凄いかも知れんけど。
>>889 ソースをここにコピペしてくれれば相談に乗れるかも
>>874 > 俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
> インラインアセンブラの使い方が嫌なだけだった。
なら、同意。
> gasの文法を使わなきゃ行けなかったり、
> : "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
> でも、それって確かに主観の問題だ。
こっちも、同意。GNU の文法ってちょっと変と思う。変数属性の二重括弧と
か...。
firstboot real-mode secondbootをディスクを読み込んでjmp secondboot protected-modeへ移行 thridをディスクを読み込んでjmp thirdでは、Cからアセンブラで実装した引数なしの関数をよぼうと思う。 現在プロテクトモードでディスクを読み込むところを実装中・・・
>>891 この人、凄すぎ。Cコンパイラが動くならGNUのソフトウェアは移植できないのかな。
896 :
デフォルトの名無しさん :02/07/17 00:56
>>894 プロテクトモードでディスク読み込みってまだ難くない?
secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
ハッカーあげ
898 :
デフォルトの名無しさん :02/07/17 01:31
JAVA版のLinuxってどこにあるんですか
899 :
デフォルトの名無しさん :02/07/17 01:33
JAVAバイトコードをはく Cコンパイラはありますか
>>892 メモリダンプしてみると初期化した値がどこにもないようでした。
どうやらもっと基本的な部分で間違えているようです。
>>900 gcc -Wa,-a -c xxxx.c
って試してみた?
ゴメン↑じゃあまり参考にならなそう。リンクのときに、 -Map mapfile ってオプションつけてみ。そして、できたmapfile 見ると良いかも。 俺もこれの正しい読み方分からないけど、なんとなくなら分かる。 誰か解説ページ知らない?
ひょっとしたらなにが原因かわかったかもしれません。もうちょっと試してみます。 マップファイルをみるとdjgppがつけたと思われるものが色々ありますが、 これっていらないもののような感じがするんだけど...
間違ってp2pのスレに書いてしまった... 問題は半分解決しました。
>>904 スマン勝手にコピペさせてもらう。
>値がないのは、フロッピーの読み込みをちゃんとしていなかったという
>初等的なミスでした。
>次に問題なのは、実体のあるアドレスとポインタの値が一定値ずれているということ
>なのですが、これはまだどうやったらいいのかわからないままです。
「一定値ずれている」のは、ld のオプションで -Tbbs -Tdata を使えばいい。
906 :
デフォルトの名無しさん :02/07/17 05:32
>>895 恐らく GCC なども移植できるでしょう。
907 :
デフォルトの名無しさん :02/07/17 14:14
おい、お前ら3chねるをみろ!
908 :
デフォルトの名無しさん :02/07/17 16:56
ん?なんだ ニコニコプンしかやってないぞ
3chでニコニコぷんはやってない。と言う罠。 でもウケタYO
掲示板の文字が黒い
912 :
デフォルトの名無しさん :02/07/17 19:13
NHK 総合 : 2ch NHK 教育 : 12ch ですが、何か?
913 :
デフォルトの名無しさん :02/07/17 19:55
総合3ch 教育9ch が普通でしょ?ニコニコプンは教育。てかニコニコプンって今もやってるの?
NHK 総合 : 1ch NHK 教育 : 3ch これが関東標準だぞ。
3chはSunTVが畿内標準デス
私は名古屋です。 地方で違うんですね。知りませんでした。板汚してごめんよ でも900超えたからいいかな?
>>896 >プロテクトモードでディスク読み込みってまだ難くない?
>secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
>じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
昨日、今日とずっと考えてやっとだ取り付いた結論が↑に書いてありました(笑)
さてどこに読み込んで、プロテクトモードに移ったときに
どうすれば実行されるのかでまた悩みます・・・
スレッドが900を超えたのでそろそろ新スレッドを・・・
>>920 読みこむ場所はとりあえずどこでも良いんじゃない?
実行するにはその場所をcallするかjmpする。
とりあえず簡単なCのプログラムを書いて
ld のオプションで -e xxxx -Ttext yyyy -oformat binary
を指定すればOK
>>921 アドバイスありがとう。
いきなりCのプログラムだと、もし出来なかった場合
どこが悪いのか分からなくなるので
firstboot.asm 512byte
secondboot.asm 512byte
test.asm 512byte
としてfirstbootで2セクタ読み込もうとしています。
firstbootでは、es:bx 0x100:0をバッファとして指定してます。
リアルモードでは、上記の理由から
jmp 0x100:0にジャンプしました(secondbootへ)
secondbootでプロテクモード移行を済ませた後に
test.asmにjmpしようと思うのですが、どこにjmpしたら
良いかが、分からなくなりました。
gdtを設定したことを考慮しなければいけないとは思うのですが、、、
>>922 gdt の設定の仕方が前みたい(csのbase=0)だったら
普通にリニアアドレスを書けば良い。つまり、読みこまれたアドレス。
たぶんひげぽんの場合だと 0x1000 に2セクタ目から読むから
0x1000+512 = 0x1200 をcall ( or jmp) かな。
Cが上手く呼べたかどうか調べるには。
char c_prog()
{
return 'A';
}
みたいにして、 eax に'A'がはいってくることを確かめる(アセンブリ部で表示)か、
void c_prog()
{
(*(char *)0xb8000)='A';
}
のようにVRAM直接アクセスでよい。
後者の方がお勧めかな。
ちなみにかっこ付けて
char *vram=0xb8000;
void c_prog()
{
vram[0]='A';
}
とかやると、変数に上手くアクセスできるかとかそういう問題が
からんで来ちゃうから最初はやらない方が良い。でも、↓ならOK
#define vram ((char *)0xb8000)
void c_prog()
{
vram[0]='A';
}
うん。まあ上のどれか試してみて報告しれ。
>>905 どうもありがとうございました。無事動くようになりました!!
躓いた大きな点を参考にならないかと思いますが書いておきます。 ・1トラック当たりのセクタ数は18 ・binary形式だと.dataセクションや.bssセクションを使うときにだめっぽい ・そこでcoff形式にしたところ始めの部分はいらないので ddでそこを飛ばして書きこむ必要がある。 ちなみにgccでつけたオプションはインターフェースに載っていたのも踏まえて -nostdlib -g -Wall -W -O2 -fcall-used-ebx -fno-common\ -fnhibit-size-directive -fomit-frame-pointer -fno-ident -fno-builtin -c でした。
> 925 リンかスクリプト使えって。 ld -T simple.ls xxx.obj -o a.exe objcopy a.exe a.bin -O binary てな感じで。 /* simple linker script */ OUTPUT_FORMAT(pei-i386) SECTIONS { . = 0x1000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
みなさん、エミュレータは何を使われてますか? それとも実機なのでしょうか?
928 :
デフォルトの名無しさん :02/07/18 19:20
>>972 だいたいBochsの人が多い。
ていうか過去ログ嫁
Bochsってコンソールモードじゃ動作しないんでしょ? Plex86は動くみたいだけど。。
930 :
デフォルトの名無しさん :02/07/18 19:59
>ひげぽん氏 トリップ付けといたら?
VMwareじゃだめなん?
933 :
デフォルトの名無しさん :02/07/18 22:23
フロッピーからコードを0x0000に置くとなぜか止まってしまうんですがこれってなんででつか?
0:0には16bitの割り込みベクタがあるから、かな?
>>923 ありがとう。
third.asmにjmpして実行するのには成功したので
以下のようなCのソースを
書いてみました。
大体こんな感じ
int main() {
hige();
}
char hige() {
return 'A';
}
gcc -c -Wall main.c -o main.o
みたいな感じでコンパイルしました。
cat firstboot.bin secondboot.bin main.o >higeboot.bin
としてみたところ、
bochs異常終了・・・撃沈。
ただいま原因究明中。
>930
必要と感じたら付けますよ。
938 :
デフォルトの名無しさん :02/07/18 22:54
だれか次スレ作れーーー
リンクが必要なことに気づいてきました。
cygwin の gcc で main って関数名を使うと初期化ルーチンへの ジャンプコードが埋め込まれるので注意が必要です。
>>940 cygwinではなく、DJGPPを使っているんですけど
まずいですかね?
リンクってオブジェクトファイルがひとつしかない場合も必要なんでしょうか?
cygwinだろうがDJGPPだろうが、 mainに引数を渡したりランタイムの初期化処理が入るからダメ。 プログラムエントリをmainに出来るならそれもOK たとえば、VCのリンカだったら -entry:mainCRTStartupみたいな感じで指定できる。
>>942 >cygwinだろうがDJGPPだろうが、
>mainに引数を渡したりランタイムの初期化処理が入るからダメ。
>プログラムエントリをmainに出来るならそれもOK
gccの場合↓のオプションのことでしょうか?
-ffreestanding
produce code that is meant to be run without an OS (ie:kernel code)
950の人が次スレたてればいいと思われ。。。
>>937 ひげぽん それ main は要らない。
>>923 は別に主要部分だけ書いたんじゃなくて
あれで全て。
>>945 深読みしすぎました。
${CC} -c -ffreestanding -Wall ??.c -o ../bin/third.bin
でコンパイルしてcatすればいいはずなのに・・・
bochs異常終了
いったい何をやらかしているのだろう。
他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。
リスティングしてコード読んでみれば?
>>946 ソースうpれ。Makefileも忠実にな。
binaryでリンクした方が良い気がするけどなぁ。 *.oのヘッダとか自分で解析するの面倒だし。
>>946 > 他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。
オブジェクトファイルのヘッダがついてるだろ…
951 :
デフォルトの名無しさん :02/07/19 17:02
nasm で、セグメント・オーバライト・プレフィックスってどう指定すりゃいいん でしょうか ? 具体的には、lodsb に CS セグメントオーバーライトしたいんで す。 cs:loadsb とか、 cs: loadsb とかやってみたけど、エラーになっちゃう。 db 2eh loadsb とやると、ちゃんと動くから命令としてはサポートしてると思うんだけど....。
>>951 間違えた loadsb → lodsb だった。(一番上は、合ってんのに暑さでボケ
てたみたい。)
>>953 サンクス。でも、これは思いつかないなぁ...。
>>954 アセンブラスレで聞いたほうが良かったかな ? こっちなら、nasm 使ってる人も
多いかと思ったもので...。(ひげぽん Boot をちょっと改造して遊んでたので、
まんざら関係ないわけじゃないということで許してちょ。)
うんこ
961 :
デフォルトの名無しさん :02/08/25 16:41
OSのソースを見たいのですが何処で見れるでしょうか
963 :
デフォルトの名無しさん :02/09/09 21:09
あげ
965 :
デフォルトの名無しさん :02/09/10 23:11
966 :
デフォルトの名無しさん :02/10/24 05:21
てsyと
967 :
デフォルトの名無しさん :02/11/02 22:26
d
0:0には16bitの割り込みベクタがあるから、かな?
969 :
デフォルトの名無しさん :02/12/08 02:23
うめ、よろし?
こっちも...捧げつつ埋め! 感謝を捧げつつ....てか!?
ひげぽんこっちには来ないかな?捧げ埋め
sa sage ume
ume
埋め立て
埋め、ただしまったりと
part3がDAT落ちしましたね。残念。 埋め(・x・)
一日一人限定ですか >ひげぽん
うめ!(一日一梅)
981 :
デフォルトの名無しさん :02/12/22 18:39
あげ
梅肉!!
梅毒!!
梅田!!
Women
淋病!!
イブ埋め!
梅とくか。
でもしようかな
あと10
9
ソロソロ8
7?
(@@)
5?!
4か!とりてーな
1000番!
100000000!
2000ぬ
撮ったぞー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。