OSをつくろうpart2
レス数が1000を超えています。これ以上書き込みはできません。
0001ひげぽん
NGNGスレッドになればと思います。
では私の疑問から
(1)OSを作る場合、CPU周りに本当に近いところはアセンブリで
書かないと無理なのでしょうか。
私が、ソースを眺めたことのあるlinuxや、OSASKは、アセンブリと
Cで書かれてます。
(2)昔JavaBasedOSのソースを見たことがありますが、
結局はCで書かれている所が多かったです。
リアルタイム処理が苦手なJavaでOSを作るのは無理なんでしょうか。
Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。
0002デフォルトの名無しさん
NGNG00032
NGNG・・・・2getシトケバヨカタ・・・
0004デフォルトの名無しさん
NGNGがんばれよ。
00052
NGNG||
Λ||Λ
( / ⌒ヽ
| | |
∪ 亅|
| | |
∪∪
0006manko_chinko
NGNG0007デフォルトの名無しさん
NGNGけどアセンブリで書かなきゃいけないところってそんなに多くないよね。
0008デフォルトの名無しさん
NGNGIO関係でタイミングがシビアなドライバだけ。
0009ひげぽん
NGNGありがとう。
>>6
そうですね。途方も無いですね。
しかも、洗練されたコードが数万行・・・
それよりも、デバイスドライバーがきついかも。
>>7
そうなんですよ。
一部アセンブリ(パフォーマンスが重要なところ。。。)
ですよね。
0010デフォルトの名無しさん
NGNGint main(){
for(;;)
getChar();
}
0011ひげぽん
NGNGアセンブリって、CPU毎に違うんですよね?
何か良い参考書をご存知ありませんか?
特にOS作成にかかわる部分で・・・
0012デフォルトの名無しさん
NGNGインテルのマニュアル
0013デフォルトの名無しさん
NGNG0014ひげぽん
NGNGalmost javaでOSは無理っすかね?
優秀なnativeコンパイラがあれば出来るのでしょうか。
JavaのほうがCよりも得意です・・・
0015デフォルトの名無しさん
NGNGの書いたのが最後だ、、、。
0016デフォルトの名無しさん
NGNGhttp://www.intel.co.jp/jp/developer/design/litcentr/index.htm
0018デフォルトの名無しさん
NGNGよく言う機械語ってCPUが解釈できる言語(?)というかデータと教わったけど、
OSによってバイナリコードって違うじゃん。
ってことは、OSがexeファイルとかを機械語に翻訳してるの?
0019ひげぽん
NGNGthanks!!
しかも日本語じゃん。
なんかわくわくしてきた。早速読ましてもらうよ。
これだけでこのスレッド立てた意味があったよ。
0020デフォルトの名無しさん
NGNGそれ俺も気になってた。
0021ひげぽん
NGNG>>18
.exeファイルそのものが実行イメージだと思う。
メモリーにロードされてそのまま実行されるんじゃないのかな。
002218
NGNG恥を忍んでさらに聞く。
じゃあ、exeファイルもx86系のCPUで動いてるほかのOSのバイナリ
コードと(ヘッダとかそういうの除いて)同じなわけ?
0023デフォルトの名無しさん
NGNG配置レイアウトとか、DynamicLinkするテーブルとか。
実行される機械語としては、OS毎に違いは(あんまし)ない。
002418
NGNGそうなんだ、、知らなかった、、。ありがおつ
0025デフォルトの名無しさん
NGNG0026ひげぽん
NGNGOSによって異なっているハードウェアへの制御のコードの部分もあるから
まったく一緒で互換性があるとはいえないじゃないかなあ。
うーん自信なしです。→誰か識者さん助けて。
0027デフォルトの名無しさん
NGNGCOBOL
0028デフォルトの名無しさん
NGNG003018
NGNGそれは聞いた事ある。
基本はC/C++で、MFC使って書いてるらしい。
このMFCも外部に出してないMS秘蔵のMFCがあるらしい。
ま、OSでも上層部分の話だろうけど。
0031デフォルトの名無しさん
NGNG003218
NGNG0033デフォルトの名無しさん
NGNG0034ひげぽん
NGNGマイクロカーネルなんですかね?
0035ひげぽん
NGNGINTELってコンパイラ出してましたよね。
あれってどういう開発者が使うんでしょうか?_
デバドラ関係?
0036デフォルトの名無しさん
NGNGいや………当初、それがウリだったんですが。
0037ひげぽん
NGNGC++なら、ある程度はオブジェクト指向でかけるので
C ONLYよりはいいかも。
でも秘蔵のMFCってやだなあ。
0038ひげぽん
NGNGやっぱりそうなんですか。
最近なんかの本に書いてあったのを見た記憶があります。
ある程度は成功してるってことですよね。
0039デフォルトの名無しさん
NGNGC++で独自OS(高性能)を書いて見たいですね
0040ひげぽん
NGNGマイクロカーネルは、カーネルを細かいモジュールに分けて
複雑さを取り除こうという概念ですよね。
きちんと役割分担をもたせる。
でもそれって、モジュール間の関連が複雑になるんですよね。
モジュール数が増えれば増えるほど・・・
0041ひげぽん
NGNGおいらもっす。
ていうか、ここで同志を見つけたり
自分のモチベーションを上げたいですね。
0042ひげぽん
NGNG既存OSをベースにするならunix系かなと思うんですが、
必ずしもunixの設計が理想的とはいえないと本で読んだことがあるし
分散化とか考えたら頭がパンクします。
0043デフォルトの名無しさん
NGNGモジュール感の関連を疎遠な物にするためのマイクロカーネルだが。
複雑なのはモノリシック
0044ひげぽん
NGNGおお。モノリシックとは何ですか。。
勉強になります。
0045ひげぽん
NGNG[OSASK]
ttp://www.imasy.org/~kawai/osask/index.html
ほかにもあったら紹介してほしいな。
0046デフォルトの名無しさん
NGNG0047デフォルトの名無しさん
NGNGthnx!今はvmwareがあるから便利だね。
0048デフォルトの名無しさん
NGNG0049ひげぽん
NGNG>>46
明日会社で見て見ます・・・
0050ひげぽん
NGNGvmware上でOSの実験とかって出来るんですかね。
ブートとか。
vmwareつかったこと無いです。
0051デフォルトの名無しさん
NGNGそれらを安全確実なものにするための
ハードウェア的なメモリ管理機構の活用が当たり前だけど、
それとは違ったアプローチでもちゃんとした環境が作れる。
その例が、SmalltalkやJavaVM。
こちらからのアプローチで勉強するのも悪くない。
OSというのとは違うけれど、色々と参考になると思うよ。
もし一般的なOSと同じ構成のそれを作りたいのなら、
アスキーから出ている「はじめて読む486」がいい入門になる。
他にも、ピアソンから出ている「オペレーティングシステム 第2版」が
OSの教科書の古典として有名。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-0213-1.html
http://www.pearsoned.co.jp/washo/operate/wa_ope03-j.html
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNGググってもそれっぽいのが引っかからないが。
0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNG直リンくれ。
0056デフォルトの名無しさん
NGNG0057ひげぽん
NGNGありがとう。
初めて読む486本屋で探してみます。-
0058ひげぽん
NGNGお話をぜひ聞かせてください。
0059デフォルトの名無しさん
NGNG0060ひげぽん
NGNGまじっすか???
むしろ図書館で探すか。
0061ひげぽん
NGNGやはり、ある程度はアセンブリが必須なんですかね。
vmware誰か使ったことあるっすか???
0062デフォルトの名無しさん
NGNGおいおい。うそつくなよ(藁
0063ひげぽん
NGNGhttp://ha3.seikyou.ne.jp/home/Joyit/asm/regs.html
0064デフォルトの名無しさん
NGNG0065デフォルトの名無しさん
NGNG昔あった98テクニカルデータブックとか
IBM PC-ATハードウェアバイブルとか
この手のに相当する資料って今はどっから入手するものなの?
0066デフォルトの名無しさん
NGNG0067ひげぽん
NGNGそうですね。本当にごく少数の人しか今は使わないですよね。
アセンブラで書く部分はコード的には量は少ないけど
きっと重要なところなんですよね。
0068デフォルトの名無しさん
NGNGドライバ屋なんかが参考にする書籍って売りに出てないのかなぁ。
0069ひげぽん
NGNG見つけたらぜひ紹介してください。
68さんもOSを作ることに興味があるんですか・
0070ひげぽん
NGNGちょっと今から読んでみます。
0071デフォルトの名無しさん
NGNG興味はあるけど時間はない(藁
テクニカルデータブックなら手元にあるから
古い98を買って何か作りたいなーなんて、たまに思うくらい。
0072デフォルトの名無しさん
NGNGスーパーテクニック、テクニカルデータブック、GDCテクニカルブック、プログラマーズバイブル
あたりが転がってる。
ほしけりゃ捨てメアド書いておいてくれ。
0073ひげぽん
NGNGなるほど、確かに時間は無いですな。
会社でこっそりやろうかな。
うちも9821があまってる。すごい重いノートだよ。
0074デフォルトの名無しさん
NGNG0075ひげぽん
NGNGC,C++,java,perl, ruby をかじりつつ
今はSEやってます。SEって言ってもほとんどPGですが、
うーん何を作ってきたかといわれると困る
仕事では、CでCGI書いたり、シェル書いたり・・・
javaだとftpクライアントもどきとか・・・
オセロとかも作ったなあ。
0076デフォルトの名無しさん
NGNG98は意外とオンラインで資料が手に入ったりするからパスかな。
それほど凝った入れ込み方は今更しないだろうし。
ATコンパチの方が欲しいけど、ないんだよなぁ。
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNGへぇ、大したもんだね。
でも魅力的じゃないし、エンドユーザー向けでもない。
組み込みOSに近い感じ。
でもそれだったらQNX(http://www.qnx.co.jp)とかあるし。
0079ひげぽん
NGNGthanks!!
0080ひげぽん
NGNG「はじめて読む486」は見つかりませんでした。
週末に大きい本屋に行ってきます。
識者の方に質問なのですが、
OSを作るうえで、アセンブラでしか書けない部分というのは、
以下の2つの観点からはどのような感じなのでしょうか。
・OS全体に占めるコードの量の割合
・OS全体の機能の中で占める、重要さ
0081デフォルトの名無しさん
NGNG百〜千行程度。
ドライバとかはそれこそデバイスによって様々なので、定量化できない。
0082ひげぽん
NGNGなるほど。
ブートローダーの部分ですが、これって一から書くのでしょうか。
ある程度は、既存のものを参考にすればよいのでしょうか?
ブート後の処理も良く分かってないなあ。
どなたか参考URLを教えてください。
0083デフォルトの名無しさん
NGNG識者じゃないが、
一般的に言って、ハードウェアを直接弄る部分は
アセンブラで書かないといけない。これには他の手段はない。
ハードを制御できなければ使い道がないから最重要部分であるのは間違いない。
ただ、その分量はどういう構成にするかによって随分と変わってくる。
これも大雑把な例示をすれば、
アプリケーション→ドライバ→OS→ハードウェア
という風に、ドライバの代わりにOSが
ハードウェアへの直接アクセスを常に代行するのなら
OSにハードウェアの基本操作ライブラリを入れればいいので量は減る。
しかしオーバーヘッドが入るので速度は遅くなる。
アプリケーション→ドライバ→ハードウェア
こんな具合にドライバが直接ハードウェアを操作するのなら
オーバーヘッドは減るが、コードが分散するので量も増える。
また、このような形だと全体制御、エラー処理などの問題も出てくる。
どちらがいいかは状況による。
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNGハードウェアもioサービス等を通して高級言語からいじるべき。
008677
NGNGしかし、日本では珍しく、DOS 系と相性がよい OS だし、
最近のマスコミによる、日本のソフト技術者のレベル軽視
に対する良い反例になってるんじゃないかな。
0087ひげぽん
NGNG>>85
なるほど。
ところで既存の代表的なOSは
アプリケーション→ドライバ→OS→ハードウェア
アプリケーション→ドライバ→ハードウェア
のどちらを採用しているのでしょうか。
OSを作ろうとした場合、
もちろん最初の設計が一番大事だとは思うのですが、
まずは、動くものを作りたいというのが人情じゃないですか。
その際の第一の壁がブート部分かと・・・・
でもやると決めたらやるしかないですよね。
マシンをお釈迦にしたくないのでvmware上で実験できれば良いのですが
どうなんでしょう。
0088デフォルトの名無しさん
NGNG誰か感想きぼんぬ。
0089デフォルトの名無しさん
NGNG0090ひげぽん
NGNGではOS製作者は、OS,IOサービス,ドライバーを
実装すればよいのでしょうか。
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNG> アプリケーション→ドライバ→OS→ハードウェア
> アプリケーション→ドライバ→ハードウェア
> のどちらを採用しているのでしょうか。
アプリケーション → OS → ドライバ → ハードウェア
だと思うが。
> その際の第一の壁がブート部分かと・・・・
今出てるインターフェース誌を買って読むべし。結構詳しく載っている。
0093デフォルトの名無しさん
NGNGコンパイラは普通の奴。ヘッダファイル/ライブラリが違う。
0094ひげぽん
NGNGあ、それ私も知りたい。
まずは環境構築ですよね。
0095デフォルトの名無しさん
NGNG自分のOSに合ったバイナリイメージを作らないといけない。
それから、通常は提供されている標準C/C++ライブラリは使用できない。
>アプリケーション → OS → ドライバ → ハードウェア
この形式だと、機能追加=OS(カーネル)の再構築だったりするから、
サービスを挟むべき。
それから、ドライバもユーザーモードドライバはOSやIOサービスを経由してハードをいじる
カーネルモードドライバだけが直接ハードウェアをさわれるようにするべき。
0096デフォルトの名無しさん
NGNG「Lion's Commentary on UNIX」アスキー
x86なら>51の言ってたタネンバウム先生の
「オペレーティングシステム」
どちらもコンパクトなコードが載ってるので即役立つはず。
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNG0100デフォルトの名無しさん
NGNG0101ひげぽん
NGNGうう。レベルが低いのは認めますが、
ここは出発点ということで徐々にレベルアップします。
少なくともやる気はある。
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
NGNGスレ違い & マルチウザイ。
0104デフォルトの名無しさん
NGNG99%ネタスレです。
0105ひげぽん
NGNGもし本当に15才ならぜひ、将来良いOSを作ってください。
うーん若いですね
0106デフォルトの名無しさん
NGNG暇人
0107デフォルトの名無しさん
NGNG>>106 の言う通り、 >>99=>>104 はかまって君だから、無視しとけば
いいよ。
0108デフォルトの名無しさん
NGNGオマエモナ。ヒッキー
0109デフォルトの名無しさん
NGNGアホがageるから荒らされる
0110ひげぽん
NGNGさっき本屋で立ち読みしてきました。
OSを作ろうとするといろいろな事を考えなければいけないこと
があると痛感しました。
アセンブラの環境はnasmにしようかと思うのですが、
他にお勧めのものありますか。
0111デフォルトの名無しさん
NGNGまぁ、漏れはTASM5.0とかでも良いと思うが
0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG> スレのレベルが高ければ誰も荒らしたりしないよ
関係ない。どんなレベルのスレでも荒らされる時は荒らされる。
とにかく、「荒らし」には無視しかない。匿名掲示板の宿命だよ。
0114デフォルトの名無しさん
NGNG自分のことだろ
プログラムすら出来ないんでしょ。
0115デフォルトの名無しさん
NGNGですか?必死だな(ワラ
0116ひげぽん
NGNGありがとう。
さあて、nasmのドキュメントを読むか(英語)
0117デフォルトの名無しさん
NGNGインラインアセンブラでnasm使用できないでしょ?
0118デフォルトの名無しさん
NGNGなぜ荒らされるのかを認識しようとしないのは、思考停止してるだけ。
だから荒らされるんだよ。
0119デフォルトの名無しさん
NGNG0120ひげぽん
NGNG実は開発環境をlinuxと、WindowsXP proどちらにしようか迷っております。
linuxマシンはスペックが低いのでOS実験機(オシャカになってもいい)
そうすると、gasは無理かもしれないです。
でもかなりの利点があるならメインマシンをlinux&XP のデュアルブートにしようかな。
0121デフォルトの名無しさん
NGNG0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNGハードの資料と時間と根気が最大の問題。
0124ひげぽん
NGNG>>123
すいません、話についていけてません。
gccって、unix系用のコンパイラじゃないんですか?
もちろんここではcygwinは考えないとしての場合ですが。
0125デフォルトの名無しさん
NGNG実用レベルのコンパイラが簡単に書けるわけねーだろ!
ゴルァ!
0126デフォルトの名無しさん
NGNGOSを作るためにみんなでお勉強スレッド
http://pc.2ch.net/test/read.cgi/os/1020424840/
これが参考になりそうだ
0127デフォルトの名無しさん
NGNGてめーの実業務用の実用コンパイラなら幾つも書いてきてますが何か?
0128デフォルトの名無しさん
NGNG0129デフォルトの名無しさん
NGNG自慢するなよ。(w
0130デフォルトの名無しさん
NGNGハイハイ、わかったわかった。一生そう言っててくれ。
0131デフォルトの名無しさん
NGNGこんなもん自慢になるかっつーの。
そんなことよりハードの資料。
BIOS叩くにしてもそこそこのもんが必要だろ?
0133ひげぽん
NGNG使える!!!
今の私には最高のスレッド
0134デフォルトの名無しさん
NGNG別にUNIX用ってわけじゃないが。
つーか、こんなレベルでOS書けるんかいな?
0135デフォルトの名無しさん
NGNG0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNGOnani-System なら書けるかも
0138デフォルトの名無しさん
NGNG> 文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
「実用レベル」と言う言葉が見えないのか ? それとも、一般人と定義が違うの
か ? いずれにせよ、スレ違いだからどっか逝ってくれ。
0139デフォルトの名無しさん
NGNG待て待て。喧嘩を売ったのは125。俺は「お前はバカか」と言っただけ。
実用レベル云々は色々と反論したくもあるがここでやるつもりはねぇよ。
0140ひげぽん
NGNGさすがに死ぬまではやらないかと(冗談を真に受けてる)
0141デフォルトの名無しさん
NGNG今の知識だと、着手してからがとても大変だと思うよ。
昔は、アセンブラの初歩として「はじめて読む8086」をよく薦められた。
もしどこかで手に入るのなら読んでみるといいかも。
0142デフォルトの名無しさん
NGNGオレモテルヨ!
はかにも「初めて読むアセンブラ」もZ80を理解するのによかたよ
0143ひげぽん
NGNG確かにハードウェアの専門知識は皆無です。
PC自作したり、RS232CにLEDつないで遊んだ知識は一切役立たず・・・
週末は本探しからはじめます。
0144デフォルトの名無しさん
NGNG>>123 付近の話の流れで、唐突に「コンパイラなんぞ自分で書けばいい。」と
言う発言はいかがなものかと。突っ込まれてもしょうがないと思うぞ。
0145デフォルトの名無しさん
NGNGいやBASICでOSだっつやつもいるが…
こんなんではブートしてもプロテクトモードにはいるときにBIOS叩きで氏ぬのがオチ
0146デフォルトの名無しさん
NGNGこれから勉強すれば良いんじゃん。
何を言ってるんだか・・・
0147145
NGNG0148ひげぽん
NGNGOSを作りたいと思う。
→アセンブラが必要と分かる
→アセンブラ勉強する
→CPU等ハードウェアの知識が必要と分かる
→勉強する
→ちょっと作ってみる
→失敗!!
でもその過程が楽しい(少なくとも私は)のでよし!!!!
0149デフォルトの名無しさん
NGNGあー、それは済まなかった。申し訳ない。
0150125
NGNG0151デフォルトの名無しさん
NGNGそれのライブラリを作るほうが大変という罠。
0152デフォルトの名無しさん
NGNG0153デフォルトの名無しさん
NGNGそれを思うとやっぱりgccしか選択しないなと思う。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNGvxdのヘッダだけとかじゃねーの?
初期化(ブートローダ)
仮想メモリ
割り込みハンドラ
ロック機構
くらいじゃねーの?
0156デフォルトの名無しさん
NGNGアセンブラで書かなくてもいいよな。
本当にアセンブラで書かなくてはいけないのは、むしろBIOSだな。
0157デフォルトの名無しさん
NGNGglibcを使わなければいい(どうせ使えない)
0158デフォルトの名無しさん
NGNGそうなんだ。それはいいこときた。
0159デフォルトの名無しさん
NGNG最初に作るのはローダーといいたいところだけど、もっと簡単に
ハードディスクからブートして画面にメッセージでもだすプログラム作るといいよ。
そのあと、割り込みとメモリ管理をするといいです。
それもいきなりハードディスクを使ったページングとかはせず、
単純に仮想アドレスを実アドレスにマップするのを作ってみるといいです。
そうこうしているうちに、手探りの作り方ってのが分かってくるから、
そしたら、OSの理論本でも見て設計するといいです。
最初はCを使おうとか考えたらダメですよ、オールアセンブラです。
やり方がわかってきたら、全部アセンブラで書くのが面倒になってきますから
そしたら C で書いてみるといいです。
実のところここまでできれば後はたいしたことは無いです、思いのまま設計するよろしいです。
0160デフォルトの名無しさん
NGNGHDDはパラメータ周りとか結構めんどくさいんで、
実際に画面が出て動くまでをフロッピーでやることを勧めたいんですが。
0161デフォルトの名無しさん
NGNG後86特有のあの変なモードとかセグメントとかも先になれてから
メモリ管理がいいかも知れません。
しかし、86ッテヤダネェ
0162デフォルトの名無しさん
NGNG仮想マシンの線で言った方が楽やと思うで。
最近はなんやJavaや.NETやゆーて流行ってるみたいやし。
0163デフォルトの名無しさん
NGNGドシロートはすっこんでろ
0164デフォルトの名無しさん
NGNGハードウェアは単純で、カーネルソースも公開されているし、CPUは
RISC物なので、x86のセグメントみたいな嫌らしさもない。
0165デフォルトの名無しさん
NGNGんでもエプソンのチップってイヤになるほどマイナーじゃない?
WonderWitchをさわった方がx86系だし良いんじゃないかな。
0166デフォルトの名無しさん
NGNGそらOSは作ったことはないけどやな。
たとえばJavaVMやったら
任意アドレス指定が可能なオペレーションは排除されとったと記憶しとる。
各種の変数は事前に囲い込まれた範囲内でしかアクセスでけへんし
オブジェクト境界を超えるアクセスは全部VM上でチェックが入る。
あれやったら、仮想メモリ管理、ちゅうか、アドレス空間の隔離はせんでも
安全に動くもんが実装できるんとちゃうんか?
ページングの話はまた別な。
これも習作のOSとして大目に見るんやったら
仮想メモリ管理なしで類似品が作れると思うで。
どっか間違うてるか?
0167デフォルトの名無しさん
NGNG本質的にVMはOSが発行するメッセージ、割り当てたメモリ,I/Oに対して
アクセスするのでそれ単体では何もでん。
JAVAチップもしかり。
0168デフォルトの名無しさん
NGNGVMがCPUそのもんやと思てると?そこまでアホなこと言うかいな。
JavaVMみたいに、あらゆるアクセスが検査対象となる構造やったら、
実行時に動的にアクセスを制限するようなことをせんでも、
JITなりを通す段階で安全な処理に落とし込めるやろっちゅう話やがな。
x86のプロテクトモードやGDTやらLDTやらゲートやら面倒くさそうやからな。
そんなん弄るぐらいやったら実行バイナリを仮想コードで統一しつつ
裏ではJITなんかで調整して基本的な命令しか使わんような
単純な構造にした方がええんちゃうか言うてんねん。
これやったらI/O命令と割り込みぐらいでどうにかなるはずや。
それともこういうことはできへんのんか?
0169デフォルトの名無しさん
NGNG>>1が作りたい物を作るのが一番なんだから、
横から口を挟むのはどうかと。
0170デフォルトの名無しさん
NGNG手始めにWonderWitchはいいかも、簡単に手に入って
しかも86系アセンブラになれるのにももってこいですね。
あれって確か発売元バンダイでしたっけ?
0171デフォルトの名無しさん
NGNGこっちの方が楽ちゃうかぁ、思うてな。
参考程度に聞いたって。>1
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNGえっひょっとしてワンダーウィッチ・・・・もう売ってない?
0174デフォルトの名無しさん
NGNGx86のアセンブラに慣れるには、確かにいいかもしれない。
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNG壁は286,386だけでしょ、後は大体みんないっしょ
0177デフォルトの名無しさん
NGNGはまず標準入出力関数を作ってモニタプログラムを
書かなければいけないだろう。
それから記憶装置からブートだな。
そして最後にタスク、メモリ管理と。
0178デフォルトの名無しさん
NGNG0179ひげぽん
NGNG>>160
まずは、フロッピーからブートというのはちょっと考えてました。
ブートに関しては、ここ↓
http://www.tkcity.net/~nobusan/boot/boot.html
で勉強しています。
>>178
買いましたよ。今読んでおります。
ところで環境構築なんですが
Cのライブラリ等は何を使えばよいのでしょうか。
linux,windowsどちらでも良いので教えてください。
0180デフォルトの名無しさん
NGNG安全なのは自分で作ることだな。
0181デフォルトの名無しさん
NGNG> Cのライブラリ等は何を使えばよいのでしょうか。
Interface 7月号買ってんだったら P.55 から読んでみたらどうよ。
0182ひげぽん
NGNGgnuということですか?
0183デフォルトの名無しさん
NGNGぉぃぉぃ
0184181
NGNGP.55 に書いてある Chapter1 のタイトルをここに書いてみろよ。
あんた以外は、俺が何を言いたいかわかるはずだ。
(で、どうすればいいかは Interface を見ればわかる。Linux の環境が
あるんなら、まずは書いてある通りやってみればいい。知ってる人には
ちょっと冗長だけど、今までこの手のプログラムを書いたことない人には
なかなかいい記事だと思うよ。)
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187181
NGNG0188ひげぽん
NGNG0189デフォルトの名無しさん
NGNGおまえが決めることだろ。
あれだけのペースで書き込んでいたのに、
書き込みがぷっつり途絶えたと言うことは、
逃げたと解釈するしか無かったからな。
もし本人ならトリップつけろ
0190ひげぽん
NGNGを参考にして
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
を読もうかと思っています。
>>188
は、私ではありません。
インターフェース誌まだ読んでいる途中です。
ところで上誌P55から「標準Cライブラリを使わないプログラミング」
がありますが、
ライブラリを使わない場合、自分でシステムコール系を
アセンブリ言語で書かなければいけないのですが、
>>151
の言っているようにこの部分を独自のライブラリとして
Cへのインターフェースを作成しなければいけないのでしょうか。
上記のライブラリは開発環境として誰かが書いたものに
+α自分で必要なものを書くのでしょうか。
それとも
全部自作??
0191ひげぽん
NGNG0192デフォルトの名無しさん
NGNG普通1からOSを作るなら全部自作
既存の物を持ってきても良いとは思うが、まぁ、基礎だと思って作るのがいいんじゃないか。
一般に提供されているCライブラリはほぼ使えないと思った方が良い。
だからFreeBSDとかLinuxあたりから抜いてくるしか無い・・・かな。
勿論ライセンス問題もあるんだけど。
>Cへのインターフェースを作成しなければいけないのでしょうか
いけないわけじゃないけど、Cのインターフェイスで作らないと
結局全部アセンブラで書く羽目になるし、どうだろうね。
0193デフォルトの名無しさん
NGNG0194ひげぽん
NGNGなるほど。
システムコール系(全てではありませんが)は
アセンブラで書かなければいけないのですね。
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
買って読んでいます。
まだ最初の数十ページですが、すでに買ってよかったと思っています。
0195ひげぽん
NGNGbochsインストールしようかと思っています。
インターフェース誌紹介してくれた人ありがとう!!
0196デフォルトの名無しさん
NGNG0197ひげぽん
NGNGまったく同じ仕組みでつくろうとは思いませんが、
プロセス間通信とか、パイプの実装とか・・・
勉強になりますね。
0198デフォルトの名無しさん
NGNG0199ひげぽん
NGNG0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNGその日、2ちゃんねるの漢たちが立ち上がった・・・。
最高のOSを作るべく。
できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか
0203デフォルトの名無しさん
NGNG0204デフォルトの名無しさん
NGNGNEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。
0205デフォルトの名無しさん
NGNG趣味でそこまでできません。
0206155
NGNGgrubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか
「メモリの特定アドレスにkernel imageをロードする機能」
と
「そっから動くカーネル」
は別もんだ。
0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNGダメだろ。そう言うところは、自分で OS を1から作ってるわけじゃないからね。
悪く言うと既存の OS を自社のマシンにポーティングしてるだけだよ。
そんなことするぐらいなら、英語の勉強して Linux とか FreeBSD とかのコミュ
ニティに参加した方がいいよ。
>>206
だからなに ?
0209ネギトロ
NGNGだけど、そこがないと話になんないよな。
PC/AT互換機のROM-BIOSの機能とか、どこかで調べられないか?
俺もちーと興味ある。
んで、このスレッドには興味持ったのでコテハンで行きます。
0210デフォルトの名無しさん
NGNG>>206 は >>155 の発言で ブートローダをOSの一部のように書いたから
それを訂正したってだけだろ。
労力を他の部分に傾けるためにブートローダは既存のものを使うのも良し。
勉強もかねてブートローダからつくるもの良し。
0212ひげぽん
NGNGちょっとにぎわってきたのでうれしいです。
まだ先の話ですが、多少速度に目をつぶっても
CPU依存の部分は出来るだけ少なくしたいかなあと思っているんですが
どうでしょうか。
ちょっと昨日夢で見たのです(夢ですよ)
システムコール系はアセンブラで書き、インターフェース部分をCで書きます。
そして、JINI経由でjavaから呼び出す。
あーめんどくさいなこれは・・・・
でもなんかばかげてて楽しい。
言語はCでは無くC++で書こうかなあ。
そのほうがいろいろ素直にかけそう。
0213デフォルトの名無しさん
NGNG×JINI
○JNI
Jini を使ったOSというのもそれはそれで面白いけど。
0214デフォルトの名無しさん
NGNG0216ひげぽん
NGNGネギトロ氏よろしく。
多少でも興味のある方書き込みしてくれるとうれしいっす。
セマフォ勉強中・・・
0217デフォルトの名無しさん
NGNGヒントくださーい
0218デフォルトの名無しさん
NGNG意味不明。
システムコール系って何だ?
低レベルサービスをアセンブラで書いて、
そのインターフェイスをC互換にすると言うこと?
0219デフォルトの名無しさん
NGNG俺も良くわからんけど、システムコール呼び出しをアセンブラで書いて、
C用のインターフェースを作るってことじゃないの ? プロセッサの動作
モードをユーザーモードから切り替えるには割込みしかないから、システ
ムコールは (インラインでいいけど) アセンブラ使わざる得ないだろう
ね。(ちなみに、OSの受け口もアセンブラで書く必要がある。)
よく考えたら、システムコール呼び出しって変だね。System Call Call
だもんなァ...。
0220デフォルトの名無しさん
NGNG0221ひげぽん
NGNGシステムコールをアセンブリ言語で実装し、
Cから呼び出すことが出来る用にインターフェースを用意するという
つもりで書いたんだけど。
日本語が変だったかな。変ですね。スマソ
インラインアセンブラとか・・・
インターフェースに書いてあるまんまだったりして・・・・
0222ひげぽん
NGNG反省・・・
0223219
NGNG> システムコールをアセンブリ言語で実装し、
システムコールの実装って、どこまでを指してます ?
OSって、ユーザープログラムからみるとシステムコール集合体みたいな
もんだから、こう書くとフルアセンブラで書いたOSのように取られるか
もしれないですよ。(そう言う意味で、>>219 では「OSの受け口も」と
言う表現にしてます。(まあ、まだまだあいまいですけどね。))
0224ひげぽん
NGNGえっと。
まだ一行もソースを書いてないで言っているので
あくまでも計画ですが、
基本的には、アセンブリ言語でしかかけない部分のみ
アセンブリ言語で書く予定です。
結局システムコールの一部をアセンブリ言語で書かざるを得なくて
Cから呼び出せるようにしたいということを言いたかった。
言ってること変わってますね→私
0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNGそんなことより1よ。
BTRON作ってくれ。
超漢字買う金がない。
0228デフォルトの名無しさん
NGNG0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG無理に決まってんだろ!(w
CGのためのOSを作りたいですね」といってました。
「CGのためのOS?」。当時、OSのことについて何もわからなかった
自分はサパーリ理解せずに読み飛ばしていたのですが、今OSのことを
そこそこ理解した状態では、「CGのためのOS」の仕様がどのような
ものになるのかものすごく気になるのです。
ココのスレはOSの内部についても詳しい方がいるようなので、もし
「CGのためのOS」を考えるならどういう仕様になるのか教えてください。
0233デフォルトの名無しさん
NGNG複数枚のGPU搭載ビデオカードを刺しておけば、
それぞれのカードに演算要求を出し、結果を1つに集約する。
0234ネギトロ
NGNGC言語で書いた関数でも、コンパイルされたあとのバイナリでは機械語の並びになります。
んでもって、アセンブリ言語でいうところのJMPとかCALL命令を使って呼び出すわけですけど
x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
前者はJMP,CALL等の命令で可能ですが、
後者の関数呼び出しを実現するには、割り込みを発生させる、コールゲートを呼び出す
# 他にありましたっけ?
などの方法を用いなければなりません。
例えばLinuxではintXXを使ったソフトウェア割り込みを使っています。
そして、システムコール関数もC言語の中から呼び出すwrite()やsocket()といった
ものの実体は、引数をレジスタに積んでソフトウェア割り込みを発生させるだけのシロモノです。
ということで、OSをコーディングする時に言語を何にするかというのは実はあまり大きな問題ではなく、
その言語で提供されているパラダイムの中で、それがコンパイル後にどのような形になるかが問題です。
で、C言語の場合、同一のプロセス空間(同じセグメント)の関数をコールする、という形しか考えられていないので、
システムコール呼び出しのように、異なるパラダイムの部分は(インライン)アセンブラで書いているわけです。
文章の雰囲気からして、>>1は高校生っぽいので、
http://www.amazon.co.jp/exec/obidos/ASIN/4274073815/ref=sr_aps_d_1_1/249-2751067-2413142
「図解32ビットマイクロコンピュータ80386の使い方」W.B.スルヤント著
をオススメしておきます。私が高校生の頃に読んでた本だし、難易度的にも丁度いいんじゃない?
0235デフォルトの名無しさん
NGNG1は23だが、、、
まぁSEといってたから高校生ではないな。
0236ひげぽん
NGNGおっと。
文章はまだ若いということで勘弁してもらえないっすかね。
0238ひげぽん
NGNG詳しい解説ありがとうございます。
質問です。
ご紹介の本を読めば、分かるのでしょうけど
今ちょっといろいろな本を消化中なもので・・・・
>x86の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
>異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
同じセグメント、異なるセグメントとは何でしょうか?
0239デフォルトの名無しさん
NGNG「はじめて読む486」を参照。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGセレクタの方が適切だろ。
0242デフォルトの名無しさん
NGNGときどきお話に出てくるブートローダ(MBRのことですよね?)やブートセクタ(パーティションの先頭?)を
直接見たり、書き換えるにはnasmとかmasmのツールでできるのでしょうか?
>>159さんのブートの話はとても魅力的です。どの辺の資料を読めばできるようになるか
教えていただけないでしょうか?「はじめて読む486」でしょうか?nasmなどのマニュアルでしょうか?
よろしくお願いします。
0243デフォルトの名無しさん
NGNGブートローダーは保存されるプログラム
0245デフォルトの名無しさん
NGNGじぶん で けんさく した ほうが あたまに はいる よ 。
かころぐ を しらべて かんれんせい が ありそうな
きーわーど を みつけて ごらん 。
If you understand , use "google" and go to the mad house. Hyahaha
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNGNT/2000ならリソースキットかインストールCDのdskprobe.exeを使ってごらん。
>>243
くだらん。
>>245
知らないなら知らないと言えよ。(w
0249デフォルトの名無しさん
NGNG最初の2行だけにしとけばよかったのにな。
>>248
246へのレスは245へのレスか?
どこが変なのか教えてたも
0250ウマさんシカさん ◆vBaka42s
NGNGrawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?
0251デフォルトの名無しさん
NGNGがんばってください。
でも、日本語が少し変です。
0252ひげぽん
NGNG242さんよろしく。
一緒に学んで行きましょう。
ちょうどブートのお話が出てきているので便乗質問です。
以下の(1)(2)(3)の認識はあっていますか?
(1)フロッピーディスクからブートする場合、
ディスクの最初のセクタにあるコードが実行される。
(2)(1)で実行されたコードがさらに、フロッピーディスク上の
他のコードを起動することで
OS本体を呼び出すことが出来る
(3)(1)(2)が正しいと仮定して、
あるCPUを載せた、PCがあるとする。
そのPC上でスタティックコンパイルすることにより作成された
バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
上記バイナリイメージをフロッピーディスク上に配置し、
(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
間違いや、認識違いを指摘していただけるとありがたいです。
0253デフォルトの名無しさん
NGNGunderstandの時点でうそ英語
馬鹿丸出しだね。
0254デフォルトの名無しさん
NGNG0255デフォルトの名無しさん
NGNGunderstoodにするの?
教えてくれ。
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG0258デフォルトの名無しさん
NGNG電波だから気にしない方が良い。
水彩画家が『将来、アーティスティックなビルを建ててみたい』と言っているような物だから、
>>1
第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
0259デフォルトの名無しさん
NGNGminix,linuxを解析したほうが近道だろ
今のレベルでは素人がいきなりオリンピックに参加するようなもの
0260デフォルトの名無しさん
NGNGいや、学問に王道なし。
minixとかはOSとはなんぞやComputerとはなんぞや、Architectureとはなんぞや
がわかってからで遅くはない。
むしろ、わかってからならば早く理解できる。
まぁ、>>1はOADGとかも知らないだろうし、OSを組むのは1年早い。
0261デフォルトの名無しさん
NGNGそういうのを勉強しながら学ぶのにMinix本は最適なんだけどねー
0262デフォルトの名無しさん
NGNGおまえらじいさんか?
どうせ自分じゃ何にもできねーんだろ。
うざいから、「検索しろ」だの「もっと勉強してから」だの言うなよ。
0263デフォルトの名無しさん
NGNG楽しいからプログラミングする
まさに本来の姿
0265デフォルトの名無しさん
NGNGOSの勉強すらままならんだろ。
0266デフォルトの名無しさん
NGNG0267264
NGNG>2種取れる程度の知識もないと、OSの勉強すらままならんだろ。
これは同意。
でも >>258 は「受けろ」と言ってるから。
基本情報処理技術者試験を受験する必要がどこにあるのかと。
0268デフォルトの名無しさん
NGNG粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
0269デフォルトの名無しさん
NGNG年幾つよ?
0270デフォルトの名無しさん
NGNG粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
^^^^
0271デフォルトの名無しさん
NGNGマーはみんな粘着
0272ひげぽん
NGNGえーと。大学のときに受けて取得しました(汗)
今は名前が変わったんですよね。
なんだか、すごい自分が馬鹿な質問ばかりするからなんだろうけど
誤解が・・・
>>260
>>261
今現在、↓の本を読んで勉強中です。
minixのソースも多少読んでいます。
「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
0273ひげぽん
NGNGx86系のアセンブラ入門には、
NASM と gas(as)どちらが適しているでしょうか。
またアセンブラに関して
ASKAを使用したことのある人いますでしょうか。
ASKAを使用する上でのメリット、デメリットを教えてください。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNGgasのニモニックは少なくともx86環境に置いては一般的じゃないから
0278ひげぽん
NGNGなるほど。
そろそろフロッピーブート&アセンブラHELLO WORLD
に取り組もうとしてたところなので助かります。
貴重なアドバイスありがとう。
0279デフォルトの名無しさん
NGNG芸津のようにお金持ちになれるの?
自己満足?、要はオナニーソフト?
OS作った先の未来にはナニが待ってるの?
お家に帰ってきたら足の臭いお父さん達が、頭を禿に
しながらせっせと築き上げてきたOSがそんな簡単に
出来上がるものなんの?
0280デフォルトの名無しさん
NGNGなんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪
しかし、この人はしてしまったのです(^^;ワラ
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪
ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ
0281デフォルトの名無しさん
NGNG>>280や他も馬鹿っぽいよ(^^;ワラ
特に>>280は海馬にカビが生えてる。キモ
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNGコピペにマジレスはさすがにかっこ悪いと思うよ
0284デフォルトの名無しさん
NGNGでもその作る人にとっては、その作る上での技術を実際に体で
覚えられて経験上いいのではないでしょうか?
また、「そりゃオナニーソフトだろう!」といわれたって、
「自分が気持良い」ソフトが一番うまく書けるということはないですか?
それで他のみんなも気持良ければもっと良いでしょう。
0285デフォルトの名無しさん
NGNGほんとかよ。
てっきり俺はJava専門プログラマかと思ったよ。
>>264
上の理由により。
OSを作るならノイマン型コンピュータの基礎くらい知っていて欲しいのでね。
Java環境だけじゃなくて。
minixを参考にするのに良い点はx86用OSを作るときの例としてだと思う。
minixがOSだと思うと、x86以外は取っつきにくくなっちゃうか、
後で後悔すると思うな。
あれはOSだがOSはあれではない。
もっと広い視点と腰を据えた覚悟と長期計画が必要だと思うな。マジでやるんなら。
趣味でやるら、まず、コード書いてNETに上げてみな。まずはそれからだと思う。
0286デフォルトの名無しさん
NGNGお前は何様なんだ?
0287デフォルトの名無しさん
NGNG自信満々みたいだけど何が言いたいのか分からん。
表現力不足なのか分かってないのか。
いまのままじゃオナニー演説。
0288デフォルトの名無しさん
NGNG作品でオナニーすべきだな。
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNG0291デフォルトの名無しさん
NGNGハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
x86限定のOSなんて作るくらいなら、WindowsかFreeUNIXで十分だ。
0292デフォルトの名無しさん
NGNGきっと作る事に意味があるんだよ。
ゲームだって、しょぼくても作るとたのしいじゃん
0293デフォルトの名無しさん
NGNGそれがJavaや.NET。 などといってみるテスト。
0294デフォルトの名無しさん
NGNGたぶん、それは違う
0295デフォルトの名無しさん
NGNGつまり、x86、Alpha、68、PowerPC、Sparc、
SH-3/4、ARM、V30 でも動くようにしろと。
0296デフォルトの名無しさん
NGNGそのうち、すげーへなちょこでいいから公開してや。
個人的にはDOSがいいなぁ。一枚ね。
くっだらねぇのでいいからゲームとかつけちゃってさ。
オセロとか、もうこの際数字あてゲームでもいいや。
シェルもあるんだかないんだか、suujigameとexitしか受け付けない
みたいなね。
もう起動してから5分位であきちゃうのよ。
でもなんかね、
お、ひげぽんのOSちゃんと動くじゃん、みたいなね。
極端な話、そんなんでもいいと思うのよね、俺。
OSなんてとても作れそうにない俺にはきっとうらやまスィーのよね。
0297デフォルトの名無しさん
NGNG(1)-(3) PC/AT,PC-98xx,X68kに関して言えば、yes.
0298デフォルトの名無しさん
NGNGそれはOSなのかと小一時間問いたい。
小学校に直起動のゲームがあったけどどっちかといえばそれに似てるな。
0299デフォルトの名無しさん
NGNGうーむ。それもそうだな・・。
まぁひげぽんさんの話ぶりだと
理想みたいなものはあるんだろうからして
そこまで極端ではないだろうけどね・・
0300デフォルトの名無しさん
NGNGおれはユーティリティ作る方が燃えるけどな。
システムを完全に、俺好みの方法でコントロール下においてやるぜグハハハハ。
って感じで。
0301デフォルトの名無しさん
NGNGJavaは実行環境。
.netはMS独自仕様プロトコル。戦略的にはRFC無視の方向で逝きたいんだろうな。
0302デフォルトの名無しさん
NGNGI/O直叩き、デバドラ作成は楽しいよ
最近ディスク周りとかがマイブーム
USBはターゲットもホストも簡単すぎてつまんない
0303デフォルトの名無しさん
NGNGすげー。いろいろ教えて欲しいよ。
あのさぁ、PCMCIAのドライバとかも作れる?
0304デフォルトの名無しさん
NGNGどこのスレにも蛆のようにわいてくるんだから。
0305デフォルトの名無しさん
NGNGそんなあなたに1394
0306デフォルトの名無しさん
NGNGというかそのあたりを学ぶ過程で必ず
PCMCIAは難しくないというのを知るし。
1394は手元に資料が何も無いんでパス。
つーか流行ると思わなかったから何も勉強してないし・・・
0307デフォルトの名無しさん
NGNGc++の勉強してんのにハードの勉強させんなよ(笑)
俺もOSつくりてー
でもまずはc++(笑)
23か、若いなぁ...俺今18だけど23でそれできるかなぁ...
頑張ってくださいsageながら見守ります
0308デフォルトの名無しさん
NGNGデバイスドライバの作り方の説明って、要約すると
「init と open と close 作りなさい」って感じじゃん?それはまあ分かるんよ。
でも、実際に目の前にPCカードが一枚あってそのドライバがネットには
いくら探しても無くて、自分で作るより他に手は無いってなったときに、
具体的にどうやってその init やら open やらを作ればいいの?
当然メーカーのウェブページに細かい仕様が載ってるわけでもなし、
どのIOポート(でいいのかな?)にどんなデータ送るとどんな風に反応するか
分からなくて、、、。
そういう情報はどっから手に入れる?
0309デフォルトの名無しさん
NGNGすべてチップから想像するって感じ。
まず、とりあえずダメ元でメーカに電話。
平行してgoogleで全言語で検索。(日本語には情報はまず無い)
さらに似たようなチップを使ってるデバイスの
Linux(*BSD)のソースを見る。で、使えそうなら丸パクリ。
月刊インターフェイスのバックナンバーは捨てずにとっとく。
0310デフォルトの名無しさん
NGNG作りがバカみたいに単純(だから弊害も多いけど)。
NIC関連のソースはひじょーに勉強になったね。
0311デフォルトの名無しさん
NGNGOSの華はやっぱりスケジューリングとメモリ管理だよね。
ファイルシステムも面白いけど、2の次だよね。
0312デフォルトの名無しさん
NGNGそっか。やっぱドライバ作る奴ぁすげーな。俺にはとても出来そうにない。
0313デフォルトの名無しさん
NGNG0314ひげぽん
NGNG> ディスクの最初のセクタにあるコードが実行される。
>(2)(1)で実行されたコードがさらに、フロッピーディスク上の
> 他のコードを起動することで
>OS本体を呼び出すことが出来る
>(3)(1)(2)が正しいと仮定して、
>あるCPUを載せた、PCがあるとする。
>そのPC上でスタティックコンパイルすることにより作成された
>バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
> 上記バイナリイメージをフロッピーディスク上に配置し、
>(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
>>297
ありがとう。
ひげぽんの当面の目標は(3)かな
0315ひげぽん
NGNG>ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
>
>>291
私も同意見です。
ただし、1からこれを実現するのは難しいと思います。
ある程度メジャーなハードウェア環境で動くOSを作ることからはじめて、
あとで他の環境でも動くように移植すればいいと思っています。
もちろん出来るだけハードウェア依存する部分は少なくすることは心がけます。
0316ひげぽん
NGNGありがとう。
296さんもあきらめず。作ってみては?
0317デフォルトの名無しさん
NGNGで、例えばフロッピーからブートして"helloworldプログラム"表示させるのにファイルシステムを
作らなきゃダメなんですか?
0318デフォルトの名無しさん
NGNG0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNG0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNGハードウェアってどの範囲を指してんだ ? プロセッサの種別か ? 使ってるバス
のアーキテクチュアか ? ここら辺を特定しないで...
> ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
なんて言ってる奴は、多分真の厨房だろうな。
そう言う目的のOSと言うものもあるだろうし、ちょっとしたハードウェアの違い
を吸収すると言う目的は理解できるけど、ちゃんとやろうとすると苦労多くして益
なしになるのがオチ。極端な話、スーパーコンピュータから携帯電話まで同じOS
が走ると思う ? (そりゃ極端過ぎるよと言うかも知れんが、J○va なんてそれに
近いことほざいてたんだから。UCSD P-Machine の時代から誰もが考えて、誰も
成功していない課題だよ。) それに多くの場合、そう言うハードウェアの違いを
吸収するのはOSじゃなくてデバイスドライバ。だから、対象ハードウェアを増
やすには基本的に人海戦術しかないよ。はっきり言ってそんなことに労力を使う
のは、無駄だし「ひげぽん」が大金持ちでもない限りむり。普通のPCできちん
と動くOSを作るべし。
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNG実際に対応するかどうかは別問題。
0326デフォルトの名無しさん
NGNG始めにプログラム向けの仕様を決めておいて、それからハードウェアを合わせていくって
手もあるかもよ。
理想的な環境をイメージしておいて、それを実現するためにハードウェアに近い部分
を構築するって感じで。
ファンクションコールで欲しい物をリストして、それをハードウェア仕様に合わせて
実現させればいい。手順も統一してあると嬉しいな。
>>323
まぁ、パフォーマンスは激悪になるだろうね。
これは仕方ないと思う。
だけど、プログラムやOSの移植性は抜群に良くなる。
0327デフォルトの名無しさん
NGNGスーパーコンピュータから携帯電話まで、同じライブラリが使えると嬉しいな。(w
一回コンパイルしとけば依存関係を気にしなくていい。
0328327
NGNGOSとVMを統合して一歩進めた形だな。究極のOS環境。
0329デフォルトの名無しさん
NGNGそんなもん、ハードウェアが一つの規格に統一されれるほうが
利用者(プログラマ)側としては究極だろ。
0330327
NGNG統一されるわけねーだろ。(w
0331デフォルトの名無しさん
NGNGいったいそれをどのような目的のために使うというのだ。
PCにつまれるx86系CPUにとって得意な処理もあれば苦手な処理もある。
あとROM,RAM等のハード資源を無視して強引にOSを作ってもまるで意味が無い。
0332デフォルトの名無しさん
NGNGそれを言ったらOSだって統一されるわけねーし、
実装依存で余計に苦しむ場面も多々出てくるよ。
0333327
NGNG電源容量、ノイズ、媒体特性、製造コスト、こういうのがある限り、ハードウェア
を統一しようというのは無理。
だから、そのために、OSと言う物が存在している。
だけど、今のOSは、特定のCPUに依存しがち。
だから、CPU依存をできるだけ廃したOSがあれば、かなり良いと思う。
パフォーマンスは多少悪くなっても、まぁ、最近のCPU性能ならOld Pentiumクラス
で動かしたWindowsと同等の性能程度で実現可能だろう。
リアルタイム性も持たせれば、クリティカルな処理以外は全く問題なくなる。
クリティカルな処理は、Network経由でCPUサーバが処理するようにするとか、
分散オブジェクトをサポートすればいい。
0334327
NGNGまぁ、どうだろ。
初歩的な関数から作ってみて、徐々に拡張してみては。
0335327
NGNG0336327
NGNGOSは統一されるべき。
だけど、アプリケーションソフトは統一されるべきではない。
基本は統一されるべきだが、応用は自由に発展すべき。
0337デフォルトの名無しさん
NGNGなんで ? OSだって単なるプログラムだよ。「バカッ速いけど、メモリー保護な
んてかったるくってやってられねーよ。」というOSや、ひたすらユーザーイン
ターフェースに凝りまくるOS。「ハードが死んでも、俺は実行を続けるぜ。」
と言うフォールトレランスなOS。いろいろあっていいんじゃないの ?
なんか、OSを特別なプログラムみたいに思ってない ?
0338デフォルトの名無しさん
NGNG環境とか作った方が手っ取り早いね。
0339デフォルトの名無しさん
NGNGカコ(・∀・)イイ!!
0340デフォルトの名無しさん
NGNG明らかに特別なプログラムだろ?
0341デフォルトの名無しさん
NGNG日本語勉強してから物言え在日
0343デフォルトの名無しさん
NGNGそんなことでageんなよ…
ひげぽん氏はどうした?
0344デフォルトの名無しさん
NGNGだとか、基本的なファンクションコールの呼び方がまちまちだとか、プログラマ泣かせ
の状況は、本来OSという存在を作った意図から外れてる。
BIOSと何ら変わらないよ。
この状況で良いんだったら、CPUベンダかチップセットベンダがROM焼きなり、
ハードコーディングして出せば良いんだ。OSなんて要らないね。
と言ってみる。
0345デフォルトの名無しさん
NGNG0346デフォルトの名無しさん
NGNG0347日本語おかしいので、訂正と追加
NGNG基本的なファンクションコールの呼び方がまちまちだとか、処理系のbit数で計算結果
が変わるとか、こういうというプログラマ泣かせの状況は、本来OSという存在を作った
意図から外れてる。
この状況で良いんだったら、BIOSと何ら変わらないよ。CPUベンダかチップセットベンダが
ROM焼きなり、ハードコーディングして出せば良いんだ。OSなんて要らないね。
単に、BIOSより使いやすいBIOSでしかない。
と言ってみる。
0348ひげぽん
NGNGしばしお待ちください。
0349
NGNGその環境でコンパイルすれば使えるって入門書に書いてあったのですが
どうですか?
0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNGコンパイラが存在するのと、
プログラムで使ったライブラリ関数が全く同じ外部仕様で提供されていること。
他にも、ビッグインディアン/リトルインディアンの違いでハマったり、
intのサイズが違ったり、数えればキリがない。
そんなえーかげんなことを書いている本は捨てちゃいなさい。
0352デフォルトの名無しさん
NGNGそうだね。このスレ中途半端な知識の展覧会って感じだな。
どんなOSがお望みなんだい?OSの設計はそれからだろ?
このスレまだ何も生んでないな…
0353デフォルトの名無しさん
NGNGなぜわざわざ一番下から…
0354デフォルトの名無しさん
NGNGまぁ、『入門書』だから。
難しいことは無視して平易に多少間違いも含みつつ書いてあるんだろ。
間違いを知るのも良い勉強になるし。
>>352
とりあえず、『OSの目的』が無いと始まらないんだよな。
UNIXは『ゲームを動かしたいんだ』って動機があったし、
Windowsは『PC/ATで動くMacが欲しかったんだ』って動機がある。
とりあえず『どういうのが欲しいのか』が無いとね。
0355デフォルトの名無しさん
NGNG文字列の扱いぐらいCの標準関数でも十分汎用性があるが。
本来のOSの役目とは共通のCPUで動くアプリケーションが個別に作成し
呼び出していたI/O、メモリブロックの確保(ヒープ)等に対して
共通のインターフェースを提供するというもの。
これがいわゆるシステムコールというやつだ。
あんたが言ってるのは理想論であり、大企業が作っているにもかかわらず
未だに使える次元で実現していないVMと同じ物を作るということである。
結果としてCPUのパフォーマンスに支障をきたすOSではいらない物となる。
少しでもOSのコードを見たことがある人なら知っていると思うが
速度を上げるために内部は関数ポインタの塊である。
0356デフォルトの名無しさん
NGNGJust for fun.
0357デフォルトの名無しさん
NGNG>文字列の扱いぐらいCの標準関数でも十分汎用性があるが。
そうかい?
あ
を一文字出したいんだけど、MS-DOS(英語版)で。
言語レベルでは仕様までは規定してないよ。
システム環境を規定しているのは実質的にOS。
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNG基礎的な事に限って言えば、処理装置と記憶装置等の5大装置があれば良い。
ハードウェアでこれを実現するか、概ねソフトウェアでハードウェアは基礎的な
部分にとどめるかは好きにして良いんだよ。
OSが提供するメモリをCPUのMMUでやろうとすれば、高速だがCPUによって変わる。
OSが独自にMMUを構築すれば、低速だがCPUが変わろうが動作する。
そういうことなんだよ。
0360デフォルトの名無しさん
NGNGでないと、不明瞭なまま話がどんどん広がってめちゃくちゃになってしまうよ
0361デフォルトの名無しさん
NGNGおいおい、それを実現するのはOSじゃないよ。
普通は言語サブセットだったり、他のOS配下にあるモジュールだって。
0362デフォルトの名無しさん
NGNGあのさぁ、おまえらが勝手に持ち上げているだけで、
ひげぽんは「とりあえず」習作としてOSを作って「みたい」というだけだろ
いきなり仕様がどうだって話してもしょうがない。
0363デフォルトの名無しさん
NGNGあんたが言っているのは<stdio.h>。
俺が言ってるのは<string.h>。
printf等は出力が絡むのでOSのwiteを使うことになる。
文字列の連結、評価であれば問題ない。
OSが無くても使える。実際使っている。
あとmath.hもつかえる。
0364242
NGNGがんばってくれ。
>>252に関してだけど。
プログラムがシステムコールを使っていても、(3)のようになるのかな?
システムコールってのはOSへのサービスの要求だよね。
あ、特に返レスは不要だけどね。
0365デフォルトの名無しさん
NGNGおいおい。
OSの定義わかって話してる?
あんたが言ってるのはカーネルだよ。
0366デフォルトの名無しさん
NGNG内部表現と外部表現の違いについて小一時間勉強してこい
0367デフォルトの名無しさん
NGNGOSの話してるの。
別に、C言語の仕様じゃ文字列の扱いについて規定してない。
”あ”が文字コードの何番かであるかも規定してない。
0368デフォルトの名無しさん
NGNG0369デフォルトの名無しさん
NGNGそれは関係ないな。
文字列のテーブルを管理してるのはOS。C言語じゃない。
OSの基礎を小一時間勉強しろよ。(w
0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNGだから、文字列ってなんだよ?
パスカル文字列とか、Cの文字列とか
それこそ、アプリケーション定義による独自の文字列とかがあって、
OSが規定するべき物じゃない。
0373@
NGNG0374372
NGNGこの場合、OSが規定しているのは文字列ではなく、キャラクタセットじゃん。
0375デフォルトの名無しさん
NGNG0376デフォルトの名無しさん
NGNGああ。文字、文字。
0377デフォルトの名無しさん
NGNG0378デフォルトの名無しさん
NGNGキャラクタセット=文字セット
0379デフォルトの名無しさん
NGNGnethackとかそうじゃないっけ?
0381デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNGそんな事ぐらい判っているが。
M$がシフトJISでUNIXはEUCが標準文字コードだろ。
俺が言いたいのはつまりC言語でで'A'とすればそれはどんな処理系でも
文字コードは別にしろAとして扱われるということだ。
そんなことよりOSとして重要な機能は入出力機器への共通の抽象化された
命令やnew,malloc等でのメモリブロックの確保だと思うのが。
別にどうでもいいので俺は上げない。
0384デフォルトの名無しさん
NGNG「どうやって作るの」っていう人が戦ったるみたい。
個人的には、ここで必要なのは「どうやって作るの」の意見が重要そうな気がする・・・
0385デフォルトの名無しさん
NGNGあ? 標準がShift_JISだったUNIXもあるし、最近だとUTF-8つーこともあるが?
インストール時に選択できるとかな。
0386デフォルトの名無しさん
NGNGNE とか PE、MZ、ELF じゃダメっすよね?いわゆる com 形式でいいんでつか?
0387デフォルトの名無しさん
NGNG16bitコンパイラとかで実行ファイルを作り、
exe2binとかでバイナリイメージにして書き込む。
プロテクトモードへの移行はローダーがやってもいいし、お好きにどうぞ。
0388デフォルトの名無しさん
NGNGなんでOSのスレで文字列とかで争ってるんだろう・・・?
ちなみに俺は >>311 に同意。
タスク(プロセス)をどうやって実現しているか、というのは
なかなか面白いと思う。
0389デフォルトの名無しさん
NGNGあと、全くライブラリ使っていなければオブジェクトフェイルのままでもOKでつか?
0390デフォルトの名無しさん
NGNGダメ。
オブジェクトファイルが実行可能イメージである保証はないし。
0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG0393デフォルトの名無しさん
NGNG0394デフォルトの名無しさん
NGNGあれすごく面白かったよね
0395デフォルトの名無しさん
NGNG1.まず16bit実行ファイルを起動
2.16bit実行ファイルが32bit実行ファイルのための環境を整える
3.32bit実行ファイルが起動
4.32bit実行ファイルが32bitOSのための環境を整える
5.32bitOSが起動
?
はっ、これが「ぶーとしーくぇんす」というやつでは・・・
0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNGOh!MZ?だっけ?
0398デフォルトの名無しさん
NGNG> 明らかに特別なプログラムだろ?
素人さんかな ? だったら、黙ってた方がいいよ。
0399デフォルトの名無しさん
NGNGそんなの蒸し返すなよ...
0400デフォルトの名無しさん
NGNGx86の場合、16bitのモードから32bitモードに切り替えるんじゃなかったっけ?
途中で。DOSでもWindowsでも動くようになってるはず。
リアルモードとか仮想86モードとかそういう複雑な構成だった気がする。
元々、x86って、MS製OSを前提にしてる設計だからなぁ。
WINTEL同盟以降、MSの要求を受けてCPU設計してるらしいし。
32bitリアルモードで初期化するにはどうしたら良いんだろ?
0401デフォルトの名無しさん
NGNG0402デフォルトの名無しさん
NGNG0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNGWindowsカーネルは保護されてねーじゃん。どういうことだよ。
0407デフォルトの名無しさん
NGNG0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNG(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
0410デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNGなぜそこでlinuxが出てくるのか小一時間
0415デフォルトの名無しさん
NGNGが何も使えないOS、どちらが良い?
0416デフォルトの名無しさん
NGNGFreeBSDなら98日という記録をマークすますた。
0417デフォルトの名無しさん
NGNG不正な処理で49日持たないわなな
0418暴走すますた
NGNGハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
・・・
0419デフォルトの名無しさん
NGNG49日があるのはWindows95だけだっけ?
NT系は大丈夫だっけ?
どちらにしろ9x系はだめだね。
NT系がいいよ。2000ならハードもかなり使えるし。
0420デフォルトの名無しさん
NGNG0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNGカーネル保護されてねーOSが49日持つかよ。
どうせ、PRO串とかDNSとかWINSとかファイルサーバとか限定用途なんだろ?
これくらい一台のPentium PCで出来るはずの事だぞ。
「おい!サーバが、サーバが盗まれたぞ!」
「一台にまとめたんです。何でもできるんですよ。」
0423デフォルトの名無しさん
NGNG49日の意味知らないだろ。
0425デフォルトの名無しさん
NGNG0426422
NGNGつー事かい?
0427デフォルトの名無しさん
NGNG0428デフォルトの名無しさん
NGNGパッチ当てても49日も動かさないけど(w
0429ひげぽん
NGNG第5章セグメントまで読み終わりました。
とりあえずこれを読めと薦めてくれた人の気持ちが分かりました。
x86系CPUで動くOSを作るうえで必要な基礎知識が書いてありました。
例)
プロテクトモードとリアルモード
レジスタとは?
セグメントとは?
MMUによるアドレス変換と仮想記憶
ただしアセンブリ言語のことは、あまり書かれていないので
これを読んでHello World は書けない・・・
さあ頑張ってHelloWorld 書くぞ。
0430デフォルトの名無しさん
NGNG> カーネル保護されてねーOSが49日持つかよ。
(゚д゚)ハァ?
0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGアセンブラでHello Worldを書こうと思ったら
BIOSの呼び出しかVRAMへの直接書込が必要になる。
これにはアセンブラの知識だけじゃなくて、
ハードウェア(のアーキテクチャ)に固有のBIOSなどの知識が必要。
アセンブラの知識だけならこのスレの最初の方で出ていた
インテルの純正マニュアル(pdf)と各種入門サイトで一通りカバーできる。
BIOSなどについてはFreeDOSのソースを見るといいかも。
0433ひげぽん
NGNGOS: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:
実行も成功!
どなたかアセンブリ言語の入門に
最適なサイトを紹介していただけませんか?
0434デフォルトの名無しさん
NGNGhttp://www.d1.dion.ne.jp/~ecb/assembler/assembler00.html
http://www.geocities.co.jp/SiliconValley/9979/asmhead.html
0435ひげぽん
NGNG入れ違いになっちゃいましたね。
BIOS呼び出しとVRAMへの直接書き込みどちらが、
入門者向きでしょうか?
また、メジャーなOSはどちらを選択しているのでしょうか?
0436デフォルトの名無しさん
NGNGOSを作るなら当然前者ではありえない。
ただ、前者を使ったモジュールもあるべき。
最初は前者で書いて、あとから後者を追加すればいい。
0437俺様のブックマーク
NGNGhttp://hp.vector.co.jp/authors/VA003720/lpproj/int10h/int10h.htm
http://ha3.seikyou.ne.jp/home/Joyit/asm/x86arc.html
http://www.geocities.co.jp/SiliconValley-PaloAlto/5989/programming.html
0439ひげぽん
NGNGBIOS版「Hello, World」プログラムの作成という記事
がありました。
フロッピーからブートしてHello, Worldと
出力してみようという内容です。
これだ!と思ったものの。全部GNUツールでやってる・・・
初心者のひげぽんには、これを読み替えて
NASM on Windwosで実践する力がまだありません・・・
もっと勉強しないと。
0440デフォルトの名無しさん
NGNGくだらん質問する暇があったらまず本を読め
100冊読んでから出直せ。
ネタにしてもつまらん。
0441デフォルトの名無しさん
NGNG後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
0442デフォルトの名無しさん
NGNGそんな駄目レスを5年間続けながら
無駄に人生を送るよりは良いんじゃない?
本を読めって?
それはお前だろ
0443デフォルトの名無しさん
NGNG弱い者いじめなんて、男のすることじゃないです。
0444ひげぽん
NGNGご迷惑をおかけいたします。
>FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば
>後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
>そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
現在の状況は、基本となる雛形も無い状態なので
良い意味でマネできる素材があればと思っています。
Webで探しているのですが今のところなかなか良いのが
見つからないです。
勉強の過程を同じような志の人たちにフィードバックできたら
と考えています。
0446タ僕 ◆njaj0FGY
NGNGそれならSunriseOSがオススメ。
ソースがべらぼうに読みやすい。
0447デフォルトの名無しさん
NGNGソース読め馬鹿
0448ひげぽん
NGNG↓
■アセンブラ
http://www.csl.sony.co.jp/person/fnami/asm.htm
http://finito-web.com/silphire/linux/linuxasm.htm
http://isweb31.infoseek.co.jp/computer/maccyo/assembler/assembly.html
http://www.geocities.co.jp/SiliconValley-PaloAlto/5989/programming.html
http://ha3.seikyou.ne.jp/home/Joyit/asm/x86arc.html
http://www.d1.dion.ne.jp/~ecb/assembler/assembler00.html
■ブート
http://www.tkcity.net/~nobusan/boot/boot.html
■minix
http://plaza4.mbn.or.jp/~annchan/minix/main.html
■その他
http://hp.vector.co.jp/authors/VA003720/lpproj/int10h/int10h.htm
http://ime.nu/www.intel.co.jp/jp/developer/design/litcentr/index.htm
■参考書
オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
はじめて読む486
著:蒲池 輝尚
アスキー出版局
0449デフォルトの名無しさん
NGNGは無視していきましょう。
0450デフォルトの名無しさん
NGNGは無視していきましょう。
0451デフォルトの名無しさん
NGNGはきっと寂しいんだよ。
みんな相手してあげて。
0452457(!=450)
NGNGうざいんですけど。
何で検索しないの?
質問の方が答えるの早いから?
なめとるよ。
0453デフォルトの名無しさん
NGNGひげぽんが結構教えて君なのは確かだな。
が、指摘された参考図書に実際に取り組んでいるし
テストコードも書いたりしているから前向きではある。
もうちょっとなま暖かい目で見守ってやっていい。
0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNG0456デフォルトの名無しさん
NGNG教えて君ていうか自作自演君では...
0457デフォルトの名無しさん
NGNGよく見ると質問もWebで検索して見つかる種類ではない場合が多い
と思うんだけど。
>>252
とかそんな感じじゃん。
勉強した上で出てきた疑問質問なら良いと思うよ。
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNG知ってる事しか質問してないように見える.
0460ひげぽん
NGNG以後以下のことに気をつけます。
・今でも十分調べてから、質問をしていますが
WEBで調べて分かるものは、自分で調べます。
・自分で調べたものについても、出来る限り
ここに書き込むようにします。
どうぞよろしくお願いいたします。
0461デフォルトの名無しさん
NGNGあまり気にしなくていいと思ワレ
気にせず、いいOSをツクテクレ
0462デフォルトの名無しさん
NGNGウザイと思ったら、来ないでね。言いたいのは、ただそれだけ。
0463ひげぽん
NGNG446さん。
遅くなりましたが、ありがとうございます。
実際にSunriseOS http://www.geocities.com/sunriseos/ を
フロッピーからブートしてみました。
アセンブラもNASM用に書かれているので大変参考になります。
しばらくはこのソースを研究いたします。
0464デフォルトの名無しさん
NGNGココはOSを作ろうとする人のための質問スレなんだから何でも聞いて良いんじゃない?
オープンに何でも話そうよ。
0465デフォルトの名無しさん
NGNG0466デフォルトの名無しさん
NGNGひげぽんは気軽に出てくるように。
0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNGBIOS叩いてもできるけど結局同じこと。
0470デフォルトの名無しさん
NGNG↑これひげぽん?
0471デフォルトの名無しさん
NGNG0472デフォルトの名無しさん
NGNGPCのBIOSはプロテクトモードから呼び出せないし再入可能でもない。
リアルモードで動くシングルタスクのOS以外からは使い物にならんよ。
0473デフォルトの名無しさん
NGNG目から鱗が落ちますた。
0474デフォルトの名無しさん
NGNGちょっとまて。
そうかといって本格的にOS作り始めたとき山のようにドライバ書かなくちゃならなくなるんじゃ?
BIOS叩いてやれば少なくともドライバがないから画面真っ黒とかいうことにはならんと思うが。
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGたうぜん
0477デフォルトの名無しさん
NGNG0478ひげぽん
NGNGとりあえず自分なりにコメントを付加してみました。
15%も理解していないですが・・・
これから理解を深めます
osimg.asm ブート部分
0479ひげぽん
NGNG; --------------------------------------------------------
; 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から始まる事を示す
0480ひげぽん
NGNGstart:
;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 ;■呼び出し元に戻る
0481ひげぽん
NGNG; -------------------------------------------------------
; 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
0482デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1025441630/116
0483ひげぽん
NGNG0484デフォルトの名無しさん
NGNGおかえりーー
0485ひげぽん
NGNG良いリファレンス、ひげぽんの間違い指摘、アドバイス等ありましたら
ぜひ書き込みください。
まずはこの部分から。
>;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
勉強が足らないですね。
0486ひげぽん
NGNGもう英語でもいいから、いいところ無いかなあ。
0487デフォルトの名無しさん
NGNGそれだけだろ?
0488デフォルトの名無しさん
NGNGはじめて読む486の最後の方の命令セット一覧見てご覧よ。
セグメントレジスタに即値を mov できないでそ。
0489ひげぽん
NGNGありがとう
axを介しているのはなぜでしょうか?
cli
mov ss, 0x9000
mov sp, 0
sti
で良い様に見えるのですが何か理由があるのでしょうか。
0491デフォルトの名無しさん
NGNG0492デフォルトの名無しさん
NGNGi++ ; // iに1足す。
みたいなコメントは、かな〜り逝ってよしです。
0493デフォルトの名無しさん
NGNGレジスタの名前は決まっちゃってるんだし、コメントがあっても邪魔じゃないだろ
0494デフォルトの名無しさん
NGNGmov ax,0x9000
mov ss,ax
の様に1つの動作を2〜3の命令の組み合わせで表す事があるから
mov ax,0x9000 ; ssに0x9000を
mov ss,ax ; 入れる
みたいに、その動作単位でコメントを入れると良いかも。
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNGss:spが9000:0000なのでスタックは9000:ffffから使われる。
つまり640KBのケツ。
0497デフォルトの名無しさん
NGNG0498ひげぽん
NGNG>
>mov [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする
作者のコメントを見るとブートドライブの情報を記憶とあるが
dlには、ブートドライブ情報が元から入っているのでしょうか?
>;load the kernel
>
>call load ;■コードラベルloadを実行
ここはOK
以後loadラベルに進みます。
0499ひげぽん
NGNG>
>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が失敗している間はずっとループする???
0500デフォルトの名無しさん
NGNG>これ以降どこかでつかっていないように見えるのですが。。。
int13hでつかってるんだろ。
0501デフォルトの名無しさん
NGNG天才。まじで。
0502ひげぽん
NGNGありがとう。
これをヒントにいまint 13hを調べております
0503ひげぽん
NGNGINT (16進数) 説明
10 ビデオサービス
11 実装されているハードウェアリスト取得
12 メモリサイズ取得
13 低レベルディスクサービス
14 シリアルポートサービス
15 (予約:さまざまな用途に使われる)
16 キーボードサービス
17 プリンタサービス
18 ROM BASIC 起動
19 リブート
1A システムタイム取得
1B CTRL - BREAK ハンドラ
1C システムチックカウントタイマー
1D システムデータ (ビデオパラメータテーブル)
1E システムデータ (ディスクパラメータ)
1F システムデータ (8 x 8 グラフィックフォント)
0504500
NGNGhttp://www.cse.iitd.ernet.in/~csu98123/old/home/learn/os/nasmBoot.html
くらいはすぐに見つかるだろ。
0506ひげぽん
NGNGありがとうございます。
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のときにラベルへジャンプ
0507デフォルトの名無しさん
NGNG(・∀・)っ コレドーゾ http://www.ctyme.com/intr/int-13.htm
0508デフォルトの名無しさん
NGNGされててDL出来るようになってるとこが見つかると思う。
0509デフォルトの名無しさん
NGNGひげぽんさんじゃないけど、ありがとう。
このスレは勉強になります。
0510デフォルトの名無しさん
NGNG念のため。
http://www.ascii.co.jp/books/support/apc/4-7561-0213-1.html
0511デフォルトの名無しさん
NGNGローダくらいはできたか
0512ひげぽん
NGNGありがとう。
はじめて読む486一応読み終わりました。(かなり斜め読み)
仕事から帰ってから1,2時間しか時間が無いので
進みは遅いですがよろしくお願いいたします。
ソースレイアウトがくずれるのが、見づらいのですが、
半角空白を&nbsp;で置き換えるしかないのでしょうか?
0513ひげぽん
NGNGコメントを書き換えました。
; --------------------------------------------------------
; 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から始まる事を示す
0514ひげぽん
NGNG;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を実行
0515ひげぽん
NGNG;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
0516ひげぽん
NGNG;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
0517ひげぽん
NGNG(1)外部割込み禁止
(2)スタックのセットアップ
(3)外部割り込み可能にする
(4)ブートドライブ情報保存
(5)ディスクをリセットする
(6)ディスクを読んでメモリにセットする
(7)読み込んだプログラムへジャンプする???
でしょうか。
0518ひげぽん
NGNGもう一息です、がんばります。
0519ひげぽん
NGNGload:ラベル部分でディスクをリセットしています(int 13h,0)
なぜdsの値をいったんスタックに退避しているのでしょうか?
ご紹介いただいた
http://www.ctyme.com/intr/rb-0605.htm
を見る限りでは、dsの値が書き換わることはなさそうなのですが。
0520デフォルトの名無しさん
NGNGひげぽんあんたはすごいよ。
まじで。
0521デフォルトの名無しさん
NGNG> 半角空白を&nbsp;で置き換えるしかないのでしょうか?
全角スペースで置き換える方が簡単だと思います。
0522ひげぽん
NGNGちょうど追加分があるのでやってみます
times 512-($-$$)-2 db 0 ;■nasmにファイルサイズが512byteであることを教える
dw 0AA55h ;■ブートストラップの最後の2byteは0AA55hがセットされていなければならない
0523デフォルトの名無しさん
NGNG参考になればどうぞ。
>最後のブートシグニチャは必ずマジックナンバーと呼ばれる0xAA55という値が
>入っています。この値が入っていないとマスターブートレコード自体が
>無効なものとして扱われ、BIOSによってはブートストラップローダが
>実行されませんし、パーティションテーブルも読み込まれません。
>つまりこのマスターブートレコードが正当なものであることを保証する署名(シグニチャ)です。
0524デフォルトの名無しさん
NGNG0525デフォルトの名無しさん
NGNG× >>823
0526デフォルトの名無しさん
NGNGえ?どういうこと
0527デフォルトの名無しさん
NGNGお前、すぐ上の >>522 ぐらいみろよ。
> dw 0AA55h ;■ブートストラップの最後の2byteは0AA55hがセットされ
> ていなければならない
バカ丸出しだぞ。
0529デフォルトの名無しさん
NGNG疑問に答えられるやつがいなくなってきたね。
オレモナー
0530デフォルトの名無しさん
NGNGMS-DOSみたいなのを作ればいいんじゃないかな。
なんか、話が発展しすぎてるけど。GUIとかJAVAは当分先だろう。
個人的には、GPLなLinuxよりもBSDをベースにして欲しい。
フロッピー1枚に収まるBSDとか探して、ソース見てみれば?
CUIで低機能でも、個人が作ったOSならば是非とも触ってみたい。
0531530
NGNGこんなにレスあったんか。
鬱だ・・・氏んできます。
0532デフォルトの名無しさん
NGNGみんな、性格がよく(煽りに乗らず、くだらんレスにもお礼を言う)、
勤勉で(会社から帰っての1、2時間を勉強にあてている)、
頭のいい(短期間でかなりの進歩を見せている)、
そんなひげぽんなんかに負けるな。
性格がゆがんでて、怠惰で、頭の悪い2チャンネラの底力を見せてみろ。
0533デフォルトの名無しさん
NGNGたんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
0534デフォルトの名無しさん
NGNG頭が悪いのはあなただけです。
0535デフォルトの名無しさん
NGNGss:sp を設定したら、またすぐ割り込み許可してるじゃん。
でも、まだ、割り込みベクタを初期化してるわけでもないし、
割り込みが発生したときに実行されるべきルーチンもロードされてないわけじゃん。
そんな状況で割り込み許可なんてしちゃって良いの?
そんなとき割り込みが発生したらどうなるの?
あと >>515 でひげぽんは retf の説明を「呼び出し元に戻る」と書いているけど
本当はそうじゃないのは分かってるよね? いや念のため確認したかっただけっす。
0536デフォルトの名無しさん
NGNGあれ?リアルモードの割り込みベクタは、0:0〜0:1000までに存在してて
ベクタ初期化はBIOSがやってくれてて、ルーチンも、UMAのどっかに
BIOS ROMとして用意されていたはず。
#でないとint13hとか、int 09hとかで大問題になるはず……
0537デフォルトの名無しさん
NGNG0538まぁ、どうでも良いけど
NGNGおれは、だから仕様をと、、、
0539デフォルトの名無しさん
NGNGブートローダに制御が渡る前にBIOSが設定してる。
0540デフォルトの名無しさん
NGNG0541ひげぽん
NGNG>(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと
>たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
その通りです、まずは取っ掛かりですね。ブートローダーがきちんと作れれば
一応先に進めるんで・・・
まずは動く物を作りたいっす。
>>535 >>536 >>537 >>539
私の思いつかない疑問と、その回答ありがとうございます。
BIOSってさまさまですね。
割り込みルーチンが無かったら確かにえらいことですよね。
>>540
間違いでした。すいません。
0542ひげぽん
NGNG正 BIOSさまさまですね
0543デフォルトの名無しさん
NGNG>>535の最後の質問への回答きぼん。
0544ひげぽん
NGNG失礼しました。
あまり考えずに進んだところに罠が・・・
確かに呼び出し元に戻るっていうのはどう考えてもおかしいですね。
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のルーチンを呼び出すのです。
引用ここまで
良く分からないです。
0545ひげぽん
NGNG0546デフォルトの名無しさん
NGNGretだから呼び出し元に戻るという考えは捨てよ
0547ひげぽん
NGNG>;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はどのレジスタ(スタック)を参照してそのアドレスに飛ぶのでしょうか?
それ以外のレジスタは、とんだ先で実行されるコードで参照されるためのものでしょうか?
質問ばかりで申し訳ないですが、お願いいたします。
今日は仕事はお休みのため、勉強するチャンスです。
0548デフォルトの名無しさん
NGNGアドレスを取り出してそこにジャンプする命令
0549デフォルトの名無しさん
NGNGなんでこのページは第7章しかないの?
はじめから見てみたい。
目次の場所教えて。
0550デフォルトの名無しさん
NGNG0551ひげぽん
NGNGアセンブラのソースって、どういうインデントが良いのかなあ。
コメントは、日本語英語どっちがいいんだろう。
PJ名(仮称)はどうしよう。
0552デフォルトの名無しさん
NGNG本気なら英語のほうが良い。
でも2chでは日本語のほうが良いかも。
PJ名は、2chとかどうよ?
0553デフォルトの名無しさん
NGNG根拠は?
0554デフォルトの名無しさん
NGNG英語圏のやつらでなくても、日本語よりはましかと・・・
0555デフォルトの名無しさん
NGNG今のところひげぽんは本気っぽいからね。
プログラム板の猛者も、立ち上がるかもしれん。
PJ名(仮称) higeponOSでいいんじゃない?
0556デフォルトの名無しさん
NGNGクズOSじゃガイジンは見向きもしないし、
良いOSになりそうだったらそれは日本人の手柄でありたいと思うがどうよ?
0557デフォルトの名無しさん
NGNG日本人以外のやつにとって敷居が低くなる
英語のデメリット
日本人にとって読みにくい。
いんちき英語コメントになる可能性がある。
日本語のメリット
日本人にとって非常に読みやすい。
日本語のデメリット
日本語はマイナー言語である。
0558デフォルトの名無しさん
NGNG0559デフォルトの名無しさん
NGNG少しでも貢献したいんだよ。
純粋に。
0560ひげぽん
NGNGコメントは、どうしましょう。
一応良いOSを作るつもりなので、
英語のほうが良いのでしょうか?
0561デフォルトの名無しさん
NGNG死ぬほど無謀だな
0562デフォルトの名無しさん
NGNG2ch発信のOSをつくれり。
0563デフォルトの名無しさん
NGNGttp://sourceforge.jp/
容量無制限かつcgi可のHPスペースとか、MLとかが無料で利用できるし、
何よりも新規プロジェクトに飢えてるから、本家よりも軽快だし。
0564デフォルトの名無しさん
NGNG単にブートローダーの話がつまらないだけだと思われ。
アプリケーションプログラマには関係ないし。
0565デフォルトの名無しさん
NGNG0566デフォルトの名無しさん
NGNG0567ひげぽん
NGNGコメントは英語で行くことにしました。
いんちき英語にならぬよう祈るのみです。
>>555
引き続き名前募集です。
>>563
それは良いかもしれませんね。
骨格部分が出来て公開できる段階になったら
sourceforgeにいくかも!!
0568デフォルトの名無しさん
NGNGこんな感じ?こっちは組み込みOSだけど。
0569デフォルトの名無しさん
NGNG0570ひげぽん
NGNG見てみました。
なんだか見ているだけでやる気が出てきます(笑)
やはり複数人で開発すると楽しそうですね。
0571デフォルトの名無しさん
NGNGHOSって、パトレイバーか?(w
0572デフォルトの名無しさん
NGNG作者がファンだから、あやかってるらしい。
0574デフォルトの名無しさん
NGNG俺はあんたを愛してしまいそうだ。
0575デフォルトの名無しさん
NGNGなかなか、参考になるぞ。
っと言おうと思ったが、>>573 の方が詳しい罠
0576デフォルトの名無しさん
NGNGおーい。あんまり変なスペース入れなよ。俺様の大事なスレなんだから。(w
ウニクスマガジンの特集って白崎博生さんのだよね。
5月から読んでるけど、俺、これが楽しみでしょうがない。
(俺はウイン屋だから、こういう雑誌見たことなかった。)
ページ数を3倍増くらいしてがむばってほしい。>>白崎さん
って、2チャンなんか見てないかな。
0577ひげぽん
NGNG貴重な情報サンクス!
ブート部はgasで書かれているようですが、
参考になります。
昨晩は、bochs(x86エミュレータ)を入れていろいろ実験していました。
かなり便利ですね。
アセンブル→ブートテストのサイクルが同じマシン上ですぐ出来る!
0578デフォルトの名無しさん
NGNGttp://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 でも動いた。
参考になるかな。
0579ひげぽん
NGNGありがとう。
nasmで書かれたbootソースというだけでも
大変助かります。
Bochs等お詳しそうですね。
今後もアドバイス頂けるとうれしいです。
0580578
NGNG0582ひげぽん
NGNG; 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
0583ひげぽん
NGNG>>582のソースをnasmでコンパイルして
フロッピーディスクにddコマンドなどでコピー
ブートすると"2ch"の文字が!!
全然たいしたものではないのですが、やっぱりうれしいですね。
0584ひげぽん
NGNG↓のようにしたのですが
"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
0585デフォルトの名無しさん
NGNG'Hello!' の後ろに、00h がないからじゃないの ? アセンブラは、C みた
いに "ABC" で 00h は付加してくれないよ。
Intel 系のアセンブラは良くわかんないけど...
msg db 'Hello!', 00h
とか書けばいいのでは ?
0586デフォルトの名無しさん
NGNGmsg db 'Hello!' を
msg db 'Hello!$'
cmp al, 0 を
cmp al ,'$' にしてみては?
0587586
NGNG0588ひげぽん
NGNG; 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
0589ひげぽん
NGNGthanks!!
これで結構すっきりかけたと思います。
0590585
NGNGなんか懐かしい。そう言えば、Intel 系って文字列のターミネータが何故
か '$' だったよね。Motorola 派 (流派かよ!!) としては、結構不思議
でした。
>>589
ひげんぽん一歩前進、おめでとう。俺がついていけるのは、このあたりま
でだけど、がむばってね。
0591ひげぽん
NGNG本当にありがとう。
おかげさまで、ちょっとだけ前に進みました。
次の目標は、
フロッピーの最初の512byte以降のプログラムを読み込めるように
することです。
0592デフォルトの名無しさん
NGNG文字列のターミネータが$なのはMS-DOSのシステムコールの仕様。
このスレ見てたらなんか作りたくなってきた…(w
0594デフォルトの名無しさん
NGNG有言実行すばらしい。
0595デフォルトの名無しさん
NGNG漏れもOSとまではいかないでもハードウェアとアセンブラの勉強を
兼ねてOSもどきを作ろうとか思ってたけどまだ、何もはじめてない…
水戸黄門の歌みたいだ…♪後から来たのに追い越され〜
鬱…
0596590
NGNGちょっと惜しい。CP/M からだよ。固定文字列なら、いいんだけどカーソル位置
指定なんかで動的に文字列生成する時に、たまたま '$' が生成されてはまった
事あり。
と言うように、優れていない仕様でもとにかく具体的に動くものがあるとなんか
萌える。そう言う意味で、>>588 みたいにソースを適時出すのはいいことだと
思う。ひげぽんがむば。
0598592
NGNGhttp://bochs.sourceforge.net/techdata.html
0599ひげぽん
NGNG>[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に設定しているのですが、
これは絶対必要な処理なのでしょうか?
0600デフォルトの名無しさん
NGNG0601デフォルトの名無しさん
NGNGvcのリンカ設定で言うなら、/merge:.data=.textってことサ
0602ひげぽん
NGNG>>600
jmp 07C0した時点で、セグメントアドレスが決まるのか?
もともとセグメントアドレスは、07COだったのでしょうか?
>>601
なるほど。
コードとデータが同一セグメントであることを指定しない場合、
どういう扱いになるのでしょうか?
該当部分をコメントアウトすると、実行しても文字列が
表示されませんでした。
0603デフォルトの名無しさん
NGNGプログラムの先頭に来た時点 (=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参
照のこと)
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNGjmp 0x07c0よりも
org 0x7c00としたほうがds,esにcsをセットしなくてよくてお徳なんじゃないですか?
0606デフォルトの名無しさん
NGNGraw binaryの実行イメージだから、セグメントの設定は行ってくれない。
0607デフォルトの名無しさん
NGNGdsの設定をはずしてみたら正しく動いたのですが、これはなにか別なところで問題が
あることが考えられるのでしょうか?
0608ひげぽん
NGNG603さんの解説とインターフェース誌を総合すると
jmp 0x07C0:startの替わりに
jmp startとした場合には、コードセグメントは0のままである。
その場合は、セグメント0のオフセットアドレス0x7C00のところへ
ブートプログラムがロードされてしまう。
するとセグメント0がブートプログラムによって分断されてしまうので
よろしくないということですよね。
ところがjmp 0x7C0:startとすると
ブートプログラムは、セグメント0x7C0の先頭の場所へロードされる。
↑
ここが分かりません。
BIOSはブートプログラム512byteを物理メモリのあるアドレスに読み込み,
CPUはそのアドレスへジャンプし、実行すると思うのですが
なぜセグメント0x7C0を指定するセグメントの先頭にブートプログラムが
ロードされているかが分からないです。
0609デフォルトの名無しさん
NGNGfar jmpではCSの値も変更できるから、07c0:0000にロードされると見ることが出来るわけ。
07c0:0000 と 0000:7c00は物理的には同じアドレスを指してるってコトをよぉく理解しよう。
0611609
NGNG物理アドレス = segment * 16 + offset
つまり、同じアドレスを示すsegとoffの組み合わせが何通りもあるという事。
利点としては、「64k以下のプログラムなら何処にでもロードできる」と理解しておくのがいいかも。
以上の話は「リアルモード」でしか通用しないので注意。
プロテクトモードでどーなるのかは、プロテクトモードに入れる段階になったら考えればよし。
0612ひげぽん
NGNG1セグメントのサイズは必ず64KBであり、物理メモリを64KBずつに
区分けしたものがセグメントだと思っていたので混乱していました。
結局ブートプログラムは、
リニアアドレス = 0x7C00に
ロードされているのですね。
そこでセグメントレジスタを07C0にセットするとセグメントの先頭ということもあり
非常に都合が良いと。
ブートプログラムが開始されてjmpした以降は、
07C0のセグメントの中でのお話になるという事ですね。
はじめて読む486の125ページにCSレジスタの役割が書いてありました・・・
↑
日本語が変ですが、609さんのおかげで分かってきました。
0613609
NGNG0614ひげぽん
NGNGちょっと欲を出してマクロまで使ってみました。
ディスクリセットまで実現!!
;-------------------------------------------------------------------------------
; 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
0615ひげぽん
NGNG; 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
0616ひげぽん
NGNGディスクリセットまでこぎつけました。
次は、ディスクの513byte以降を、或るセグメントに読み込み
そのセグメントにjmpすれば、そのコードが実行される!!
ということを実現しようと思っています。
この読み込まれるプログラムをアセンブラオンリーでなく
Cオンリーまたは、C with インラインアセンブラで書きたいのですが、
どのような環境を整えればよいのでしょうか?
ひげぽんの環境は、
Windows XP Pro
NASM
C++のコンパイラは、
cygwin のgccと、VC++6.0 standardです。
0617デフォルトの名無しさん
NGNG>>605 に関連して
org 0x7c00
mov ax,cs
mov ds,ax
mov es,ax
なら jmp 07c0h:start をしなくても ok って事?
あと、
jmp offset
は相対アドレスのジャンプで、
jmp segment:offset
は絶対アドレスのジャンブって事ですか?
0618デフォルトの名無しさん
NGNGそれは取り敢えずリアルモードのまま?
0619デフォルトの名無しさん
NGNGまだプロテクトモードに入ってないから、
32bitコンパイラは使えないよ。
16bitコンパイラでバイナリを生成した後にexe2bin汁。
MSのexe2binは.com形式のためにorg100扱いで実行ファイルを生成した鴨
0620デフォルトの名無しさん
NGNGyep
0621609
NGNG>なら jmp 07c0h:start をしなくても ok って事?
OKかもしれないけど…
…よく分かりません…
jmp offsetってのはIPにoffsetを代入。
jmp segment:offsetってのはIPにoffset、CSにsegmentを代入です。
0622ひげぽん
NGNG>>619
何も考えていませんでした。
とりあえずプロテクトモードに入ったと仮定しての
お話でお願いします。
(プロテクトモードへの移行は一応はじめての486に記述があるので
いけそうだと踏んでいます。)
アセンブラとCのつなぎの部分とかが全然分かっていない状態です。
どういう環境で、どういう手順を踏んだら良いかすら分かっていないです。
0623デフォルトの名無しさん
NGNGメモリ上にロードしてエントリポイントのアドレスへjmpするだけだから。
#場合によっては環境の設定をしてから。
0624ひげぽん
NGNG→どのライブラリ、関数が使用可能かということが分からない
コンパイラでコンパイル
→どのコンパイラ(もしくは特別なコンパイルオプション)をつかえば
良いかが分からない。
コンパイル済みのバイナリをそのままディスクに書き込めばよいのか?
もう分からないこと尽くしです、
どなたか、取っ掛かりだけでも教えてもらえないでしょうか?
0625デフォルトの名無しさん
NGNG自分で調べられないなら全部作る必要がある。
まぁ、string.hくらいは使えるかもね
2 世に出ている16bitのコンパイラで、OS固有のヘッダ領域を除去可能なツールが使える物。
2 ディスクに書き込んでも良いし、ファイルシステムに保存しても良いけど、
後者の場合は自前で読み込むか、FSサブシステムをロードしておく必要がある。
0626デフォルトの名無しさん
NGNGそこから実行するのが吉かと。
0627609
NGNG一旦リアルモード -> プロテクトモードにいく16BitプログラムをCで作って
exe2bin(exeヘッダを取り除く)して、それをディスクのブートセクタ以降に配置
とかの方がいいかも。
確かexe2binしたプログラムのエントリポイントは普通0だった気がするから、
セグメントの先頭に配置してやれば動くはず。
0628デフォルトの名無しさん
NGNGMS-DOSの.com形式は256バイトのPSP領域を勝手にOSが用意するから、
ORG 100hのバイナリが生成されたと思うけど?
0629デフォルトの名無しさん
NGNG0630609
NGNGexdebのマニュアルからコピペ。
;"""""""""""""""""""""""""""""""""""""""
; .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 ;リロケーション情報
ここの値が幾つかによるわけだ..
0631ひげぽん
NGNGありがとうございます。
プロテクトモード移行後であれば32bitコンパイラが
使えるということですね。
ブートプログラム内または、ブートセクタ以降でプロテクトモードに移行
すればよいのですね。
お勧めな環境とかってありますか?
こういうのってどこで調べればよいのでしょうか。
キーワードが悪いのか全然だめです。
0632まだ分からない奴
NGNG609さん
>>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 に入り切らない場合は
絶対アドレスジャンプの命令に置き換わっていた気がしますが、、
0633609
NGNGザッツライトです(汗
私の言っていることが不正確でした。
jmpがどのジャンプかはアセンブラがかってに判断してくれるみたいですね…
普通にアセンブラで書くときは即値かオフセットなのかは全然気にしてなかったもんで..
MASMとかTASMはかってに絶対アドレス命令に置き換えてくれます。
(知ったかぶり口調は自制するです…スマソ
0634デフォルトの名無しさん
NGNGひげぽんがしらぬまにまた成長している・・・
0635592
NGNGshortは8bit相対ジャンプ
nearは16bit相対ジャンプ
farは32bit(seg:off)絶対ジャンプ。
リアルモードでプリフィックスなしではこうなるはず。
0636デフォルトの名無しさん
NGNG0637ひげぽん
NGNGhttp://www.osdev.org/developers/guide01/
ただし、gccとnasmの組み合わせが多いですね。
Windows環境でいけるのが、みつからない・・・
0638デフォルトの名無しさん
NGNG幼女声で答えてくれたり気紛れな態度を取ってくれる萌えOSなんだろうな?
0639デフォルトの名無しさん
NGNGひげぽんが喋ります
0640デフォルトの名無しさん
NGNGそれは萌え(w
それ以前に喋らすためにはサウンドドライバ書かなきゃいかんだろ
昔のソフトみたいにBEEPで喋らすのもありだが(藁
0641FreeDOS教徒
NGNG0643デフォルトの名無しさん
NGNGいくらひげぽんOSがいいものになっても、それを自分でコンパイルするには、
VCとか他の有料アプリを購入しなければ行けないとなればオレ的に萎え〜です。
gccとnasmは萌え〜。
0644デフォルトの名無しさん
NGNG使い方がいまいち分かんない。
0645デフォルトの名無しさん
NGNG0646デフォルトの名無しさん
NGNGMingW32は発音できないから、ミングウィンか、ミングイン、の方が言いやすいなぁ。(ぼそ)
みんぐwは尻切れっぽい感じが・・・。(ぼそぼそ)
0647645
NGNGおせーて、おせーて、おせーてよ。
0648デフォルトの名無しさん
NGNGなんかこのスレさ。
ひげぽんを中心とするエリート軍団と、俺みたいなオッチー軍団に別れちゃったな。
あーあ。オッチーにも愛の手(やさしい説明)を。
0649デフォルトの名無しさん
NGNGとひげぽんを見てふと思ひ
0650デフォルトの名無しさん
NGNGしかもよく読めば単発質問な。
0651デフォルトの名無しさん
NGNG誤解だな。正確には
「ム板で単発質問でスレ建てるコテハンに優秀な奴はいない」だ
ここの1は単発質問をしていないので上記の条件には当てはまらない。
0652デフォルトの名無しさん
NGNGどこが分からない?
0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNG>>641
FreeDOSカーネルのコンパイルはこのページの説明でできるの?
http://home.interlink.or.jp/~s-nakani/freedos/build.html
0655デフォルトの名無しさん
NGNGWindows上で動くGCC
GCCはGNU Compiler Collectionの略(になったらしい。前はGNU C Compiler)
Windows上で動くフリーのコンパイラって事らしい。ちなみにGPL。
0656655
NGNGMinGW: Minimalist GNU For Windows
詳細こちら(英語)
http://www.mingw.org/
tar.gzはいまダウンロード中だけど、どうすれば良いんだ?
ソースっぽいし。
UNIXでコンパイルしてもWindows上で動くのかな?
exe形式になるの?
SJIS通るのかな?
PATH通せばいいだけ?
0657デフォルトの名無しさん
NGNGそれから、gcc3.1系をばらで落とした方が良いかも知れない
0658デフォルトの名無しさん
NGNGUNIXでコンパイルすればUNIXでWin32のコードを吐くクロスコンパイラになる。
>>657
別に通らないってことはないだろ。
ただ、特にSJIS対応してないから
// ソ
とか
// 表
とか2バイト目に '\' が入ってると楽しいことになるだけで。
0659デフォルトの名無しさん
NGNGそういうのは通らないというのだ
0660デフォルトの名無しさん
NGNGLatest MinGW-1.0 Snapshot
を解凍して、DOSプロンプトから実行したら動いたよ。
0661デフォルトの名無しさん
NGNG3.1落とせって
0662デフォルトの名無しさん
NGNGhttp://sourceforge.net/projects/mingw/
・・・なんか良くわかんないな。
いっぱいファイルあるけど。
っしかし、なんで、日本語なんだ?
クライアントコードページでも参照してるのかな?
CVSもどういう事なんだか良くわかんないし、死にそう。
CVS超わかんねーよ。ヽ( `Д)ノウワァァァァン
ソースフォージどうなってんだよ。ヽ( `Д)ノウワァァァァン
0663デフォルトの名無しさん
NGNGint13h 使うのと違って画面の左上に"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
----------------
んじゃ、ひげたんこれからもガムバテネ。
0664デフォルトの名無しさん
NGNGhttpリクエストのAccept-Languageヘッダ見てるだけだと思うが。
0665デフォルトの名無しさん
NGNGhttp://prdownloads.sourceforge.net/mingw/gcc-3_1-core-20020516-1.tar.gz?download
http://prdownloads.sourceforge.net/mingw/make-3.79.1-20010722.tar.gz?download
http://prdownloads.sourceforge.net/mingw/gdb-5.1.1-1-mingw.tar.gz?download
http://prdownloads.sourceforge.net/mingw/mingw-runtime-2.0.tar.gz?download
http://prdownloads.sourceforge.net/mingw/w32api-1.5.tar.gz?download
これだけ落とせ。
Ada/Pascalも欲しければどうぞ
0666デフォルトの名無しさん
NGNG最新版は1.0.8。
386、586、686、って分かれてるな。最適化済みの実行ファイルって事か。
なんかexeっぽいけど何だ?インストールプログラムかな?
バラバラにダウンロードして組み込んでも良いの?
バージョンでおかしくなったりしないのかな?
適当にまとめられてる奴無いのかな。
0667666
NGNGどうもありがとう。
>Ada/Pascalも欲しければどうぞ
ああ。なるほど。
言語ごとにバラバラしてるわけね。
で、GCCはそれをコントロールしてるって事か。
0668デフォルトの名無しさん
NGNG0669ひげぽん
NGNG今日は仕事の合間に駄目もとでcygwin gccを試していたがだめでした。
それで
http://www.delorie.com/djgpp/
を見つけました。
これもWin上で動くgccらしいです。
でもなんとなく皆さんが紹介してくださった
Mingwのほうがよさげなのでそちらにしようかと思っております。
なんだかそろそろgnu makeをきちんと勉強したほうが良い気が
してきました。必要そうだし。
0670666
NGNGbinutilsって何?何かのユーティリティなのかな?
DOS窓だとmanとか無いし、htmlドキュメントをブラウザで開くのかな?
これらの混在環境って良いのか?
バージョンで混乱したりしないのかな?
0671ひげぽん
NGNG>VRAM直接アクセスで画面表示出来たよん。
それはすごい!!
ありがとう。
今日はちょっと試す時間が無いので
明日試してみます。
>>665
取りまとめありがとう。
利用させてもらいます。
ちなみにNASM&BochsはWin版を使ってます。
0672666
NGNGああ。良いんだ良いんだ。
release note.txt読めば良かったんだね。
頭混乱してた。恥ずかしいからsage
0673ひげぽん
NGNG前言撤回Mingwやめました。
DJGPPにしました。
明日はVRAM叩きをまねして、
あとはmakeの勉強。
プロテクトモードへの移行もやらないと
でもなんだか前より増してやる気が出てきた!
会社でこそっとやろう。。。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGTOWNS用にHigh-Cなんてのを持ってたなぁ....
今はどこかへ行ってしまったが。
0676デフォルトの名無しさん
NGNG0677ひげぽん
NGNG以下のようなオプションが使えるので
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)
0678デフォルトの名無しさん
NGNGオレ gcc の標準の ld を使おうかと思っているけど
-oformat output-format を何にしたら良いか分からなくて止まってる。
ぐぐっても良く分からないよ〜。
0679ひげぽん
NGNG試してはいませんが、
OS developer's siteでは、
ld -Ttext 0x100000 --oformat binary -o
ld -o xxx -Ttext 0x0 -e main xxxx.o
のようなものを使っていた。
0680デフォルトの名無しさん
NGNG(・∀・)ソレダ!!
0681デフォルトの名無しさん
NGNGwindows では分からないけど 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バイトはオールアセンブリで書いて
その中でフロッピーをメモリに読みこんでプロテクトモードにして
それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい。
0682ひげぽん
NGNG681さん、同じところで悩んでいますよね。
>だから、やっぱり最初の512バイトはオールアセンブリで書いて
>その中でフロッピーをメモリに読みこんでプロテクトモードにして
>それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい
プロテクトモードへの移行の前には、
GDTの設定、ITDRの設定などを行わなければいけないんでよね。
その辺のことは、本に書いてあるのですが。
ブートコードからCでコンパイルした
(bootディスク上にある)実行イメージを呼び出す方法が分からない・・・
(1)実行イメージのサイズがきちんと分かっている場合
ディスクを必要セクタ分読み込めばよいのでしょうか?
int 13hを使う感じで・・・
(2)アセンブラで出来たブートイメージと、
Cで書いて出来た実行イメージを
ひとつのイメージにまとめて
diskに対して ddコマンド等で書き込んでやればよいのでしょうか?
今日は一日中悩みました。
いろいろ実験したのですが、
Cで実行イメージを作成しようにも、そいつが読み込まれて
動作したかを確認する方法がないっす。
int main() {
}
と空のmainを書けばライブラリに依存しないのでOKかと思ったのだが
動作確認が出来ない(涙)
0683デフォルトの名無しさん
NGNGで、『はじめて読む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コールってことになるかな。
0684デフォルトの名無しさん
NGNGで、『はじめて読む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コールってことになるかな。
0685684
NGNG0686デフォルトの名無しさん
NGNGスタートアップルーチンの存在は知らないんだな。
0687デフォルトの名無しさん
NGNGstep1
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 部分だけ
書き換えれば良くなるでしょ?
0688デフォルトの名無しさん
NGNGつまり、普通にコンパイルしたんではスタートアップルーチンがあるから
上手く行かないって言いたい?
0689デフォルトの名無しさん
NGNG0690デフォルトの名無しさん
NGNG0691デフォルトの名無しさん
NGNGオブジェクトファイルやライブラリを、大抵のリンカが暗黙の内にリンクしているだけで、
それを回避するオプションが付いているはず
0692ひげぽん
NGNGありがとう。
>step1.5
>1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon"
を書いてみました。
0693ひげぽん
NGNG;-------------------------------------------------------------------------------
; 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
0694ひげぽん
NGNG; 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'
0695ひげぽん
NGNG; 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
0696ひげぽん
NGNGmov 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
0697ひげぽん
NGNG; 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
0698ひげぽん
NGNG0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNGんですがなにが原因なんでしょう?誰か助けてー
0701デフォルトの名無しさん
NGNG---
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回目の割り込みは発生しちゃだめって事らしいヨ
0702デフォルトの名無しさん
NGNGそれ俺もなった。で試行錯誤の結果やっと上手くいった。
それ貼るからちょっと待ってて。
0703デフォルトの名無しさん
NGNG基本的には、『はじめて(略』に従ったけど、一部変えてある
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
; -------------------- 大きすぎて一度に書き込めないので一度ここで切る。
0704デフォルトの名無しさん
NGNG3rd 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
0705703=704
NGNG0706デフォルトの名無しさん
NGNGどうもありがとうございました。これから格闘してみます。
ここまではなんとかなりましたが、ここからが厳しいところですね。
頑張りたいと思います
0708デフォルトの名無しさん
NGNGお前ら全員で2ch OS作ってください。
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNG0711デフォルトの名無しさん
NGNG0712デフォルトの名無しさん
NGNG0713デフォルトの名無しさん
NGNG0714デフォルトの名無しさん
NGNG> movesp,0x1000 ; ここが 0 だとなぜかエラー
0だとスタックに積んだとたんに逝っちゃうよ。
0715デフォルトの名無しさん
NGNGこんにちはプロテクトモード
0716デフォルトの名無しさん
NGNGttp://poli.cs.vsb.cz/misc/rbint/ix/index.html
0717デフォルトの名無しさん
NGNG>>507-508
確か、ベクターにwinhelp版があったはず。
0718デフォルトの名無しさん
NGNGPE形式のカーネルのロードは面倒そうだ…。
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNG0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNGいきなりは無理では。
まず、
1. とりあえず何もしなくていいから、OSを終了するシステムコール(Halt)
2. 1文字ずつコンソールに出力するシステムコール(Input)
3. キーボードから1文字ずつ入力を受け取るシステムコール(Output、後回しで
いいかも)
4. ディスクのセクタを直接指定して読み書きするシステムコール(Read, Write)
5. 特権モードのままでいいし、特定の物理メモリ上でいいし、一つしか実行で
きず、呼び出したタスクに戻ってこなくていいから、ディスクから読み込んだ
バイナリを展開し、実行するシステムコール(Exec)
6. とりあえず何もしなくていいから、タスクを終了するシステムコール(Exit)
を実装し、
ブートローダ
↓
カーネル
↓
文字を表示し、入力を受け取り、特定のセクタの内容を読み込み表示し、特定の
セクタに適当なデータを書込み、終了する、Cで書かれたプログラム
という感じで動作するものを作ってみるのはどうだろう。
そのあとで、ユーザモードで動作し、複数展開可能で、呼び出したタスクに戻って
くるExecを実装し、ユーザモードで動く簡単なコマンドラインシェルを実装する、
というのはどう?
0723722
NGNGあ、かぶった。
>>722をちょい訂正。
> 2. 1文字ずつコンソールに出力するシステムコール(Input)
> 3. キーボードから1文字ずつ入力を受け取るシステムコール(Output)
名前が逆じゃん、出力がOutputで入力がInputね。
0724デフォルトの名無しさん
NGNGシステムコールの設計は慎重にやってくれよp
0725デフォルトの名無しさん
NGNGなんで?
0726722
NGNG別に>>722のシステムコールを最後までそのまま使えって意味じゃないよ。
あくまで暫定的なもの。ファイルシステムがなければ、openやread、write、
close等のファイルに関するシステムコールなんて作れないでしょ?ファイル
システムやメモリマネージャが出来たら、そのときシステムコールを作り
直せばいい。
0727デフォルトの名無しさん
NGNGまだ設計に入る段階じゃないと思われ。
勿論、先に設計が来る方が良いけど、未経験なんだから良いんじゃないの?
0728724
NGNG0729ひげぽん
NGNG0730718
NGNGhttp://sources.redhat.com/newlib/
0731718
NGNGUniform Driver Interface
http://www.projectudi.org/
0732718
NGNGFreeBSDのelf(5)。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=elf&dir=jpman-4.6.0%2Fman§=0
UNIX USERの掲載記事一覧。
ELF仕様書へのリンクや"Linkers and Loaders"のオンライン公開本等がある。
http://www.skyfree.org/jpn/unixuser/
0733デフォルトの名無しさん
NGNG読んでる。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 ポートアクセスがあったらまずい気がするなぁと感じるけど
それであってる?
0734718
NGNG素直にPEにしておくか。
>>733
(1)
http://www.oadg.or.jp/tosho/index.htm#techref
(2)
vsync割り込みハンドラでグラフィックコントローラを叩く可能性を考えてるのかと。
0735デフォルトの名無しさん
NGNGかなり賛成。ちょうど良い目標ダネ。
ただちょっと分からなかったんだけど >>722 の 5 はマルチタスクを
想定しているの? オレはシングルタスクで call とか jmp 使えば
いいと思うんだけど。
あとバイナリを展開ってどの程度のこと考えてる?
オレは実行イメージそのままで良いと思ってる。(固定アドレスに置くんだから)
あと、 >>722 では触れられてないけど、VRAMとか IOポートにアクセスするのは
step 1
ライブラリっぽいものを書いてそれをプログラムにスタティックリンクさせる。
step 2
システムコールとして実装
という段階を踏んだ方が良さそう。
で確認なんだけど step 2では、ソフトウェア割り込み使えばいいんだっけ?
そして割り込みを発生させる関数をスタティックリンクすればOK?
0736デフォルトの名無しさん
NGNGシステムコールの呼び出しにはコールゲートかトラップゲートを使うかと。
0737riarutyuubou
NGNG7月11日に発送してもらったんだけど、はじめて読む486の12刷発行が
7月11日だった。(わら
はじめて読む8086の方がまだだ、本来こっちの方が先に届いてほしいんだが。
0738デフォルトの名無しさん
NGNG折れもリア厨のころに買って読んで、サンプル必死に打ってた気がする。
8086の方は英語がOKなら、上でガイシュツのInterrupt Listとかで十分間に合う。はず。
0739manko_chinko==737 ◆c2rpKRNM
NGNGどうも
僕は英語駄目なんで(英検三級がやっととれたレベル)、日本国内で日本語を使用した
86系アセンブラの解説ページで勉強しようと思うのですが、、、
0740manko_chinko==737 ◆c2rpKRNM
NGNG0741FreeDOS教徒
NGNG>>653
NASMだけです。C言語を使うほどでもありませんし。
>>654
あとsuppl.zipが要るかも。ソースの\supplに説明があるはず。
0742653
NGNG0743デフォルトの名無しさん
NGNG破壊していいレジスタはどれ?
eax,edx は戻り値に使われるから分かるけど、他のは?
ぐぐったら windows での話は出てきたけど、これってコンパイラ依存の
話だからgcc なら別だよな?
0744デフォルトの名無しさん
NGNGわかるだろうに。
0745デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNG0748FreeDOS教徒
NGNGヴぁー、申し訳ない。あれcommand.comの作り方だった‥‥
カーネルはあそこの説明のとおりでよかったです。
しかもスレ沈めまくってさらに申し訳ない(汗
0749ひげぽん
NGNGどうしても3rd exception with no resolutionが出てしまいます。
どなたかアドバイスをいただけたら幸いです。
以下エラーになるソースを貼らせていただきます。
0750ひげぽん
NGNGRealToProtect:
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
0751ひげぽん
NGNG; 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
0752ひげぽん
NGNGdw 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
0753デフォルトの名無しさん
NGNGgdt08のセグメントベースは10000hにしてみてはどうでしょうか?
違うかな
0754デフォルトの名無しさん
NGNGは既に解決してますか?まだなら俺にちょっと心当たりがあります。
もしかして、cs を 08h とかそう言うGDTRで設定したセグメントにする前の段階の話じゃないですか?
0755デフォルトの名無しさん
NGNGmov sp,0x1000 のあとに jmp が必要でしょ。
0756ひげぽん
NGNGありがとうございます。
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
0758デフォルトの名無しさん
NGNG0761デフォルトの名無しさん
NGNGそうですか、じゃあ関係ないかもです。役に立てんでごめんです。
あと、 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
↑ここの部分はどうなってた?
0762デフォルトの名無しさん
NGNGエラーのとき CSが1000hになっているってことは、
コードはリニアアドレスで 10000h に置いたってことだ。
だから、
dw set_cs_desc1 + 1000h
ここは、
dw set_cs_desc1 + 10000h
にしなければ行けない。(リニアアドレスを書かなければ行けないから)
でもそれだと dw に入らない。
↓
結論もっと低いアドレスに置くべき。
0763デフォルトの名無しさん
NGNGあと32ビットモードになったら bits 32 にしないとだめだよ。
0764デフォルトの名無しさん
NGNG------------
bits 16
L1: jmp L1
bits 32
jmp L1
------------
じゃ、起きたら、このコードをアセンブルしてそれをdumpで見て
それが何を意味するのかよーく考えろよ。
じゃな。
0765ひげぽん
NGNG>ひげぽんは >>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
0767ひげぽん
NGNG入れ違いです。すいません。
0768747
NGNGlabel:
jmp label
はだめで
jmp label
label:
はエラーなしでした。
>>765
もし1000hなら
dd gdt0+1000h*16
の*16hがいらないのではないでしょうか?
0769デフォルトの名無しさん
NGNG>>765 それなら、>>762 で決まり。
>>766 OKじゃねえよ。できたバイナリ見ろよ。
0771デフォルトの名無しさん
NGNGCS が 1000h になっているのに実行イメージが1000hに置かれてるって
なんか勘違いしてませんか?
0772ひげぽん
NGNG[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に読み込まれた実行イメージにジャンプするという
認識だったのですが、もしかして出発点から間違ってます?
0773ひげぽん
NGNG上記>>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
としてみましたがだめでした。
0774デフォルトの名無しさん
NGNGそれなら、リニアアドレスでは10000hになるのは分かる?
そして、flush_q1 の後のジャンプの場所指定で書かなければいけないのはリニアアドレス。
(なぜならもうプロテクトモードなんだし、08 のコードセグメントのベースが0に成っているから)
0775デフォルトの名無しさん
NGNG違う。 gdtr の所の start addressはリニアアドレス。
あと、「上手くいった/だめだった」の二元論ではなくどこでエラーが
起きたのかが重要。ダメなときはどこで止まったのか調べないと。
0777ひげぽん
NGNG現在の状況は
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)
0778ひげぽん
NGNGgdtr:
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
うーんどこが悪いかが分からない。
もう少しねばってみます。
0779デフォルトの名無しさん
NGNGおれも詳しくは分からないけどプロテクトモードだけど16bit モードってのがあるらしい。
(bochs のソースを見てそう思った)
本当に32bit モードに成るのは CS が 08 に成ってから。
だから、それだとbits32を置く場所がちょっと違う。
0780ひげぽん
NGNGありがとうございます。
bits 32の場所を変えてみましたが、だめでした。
>>704(プロテクトモード移行成功)も同じ場所だったので
今回のエラーの直接の原因ではないかもしれません。
0781デフォルトの名無しさん
NGNGじゃあ、エラーが起きてる IP=0x003b のところはソースでいうどこにあたる?
0783デフォルトの名無しさん
NGNGデバッガある?
0785デフォルトの名無しさん
NGNGベクターとかにありそうなMS-DOS用のcomファイルを調べられるの使うのが良い。
あとは、nasm の -l オプションかな。
0786ひげぽん
NGNG実行しながらデバッグするのでしょうか?
それだとBochsの機能でなにかあるのかなあ。
0787デフォルトの名無しさん
NGNGつうか、今はどこでエラーが起きたのか分かれば良いんだから、
実行しながらデバグなんてしなくて良いよ。
-l は試した? 結局 3b ってどこなのさっ!!
0788747
NGNG相談に乗っていただいた方どうもありがとうございました。
0789デフォルトの名無しさん
NGNGおめでと。役に立てなくてゴメン。
またなんかあったら聞いてね。今度こそ役立つアドバイスするカラ
0790747
NGNG0791ひげぽん
NGNGnasm -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はどこにあるのでしょうか。
0792ひげぽん
NGNGプロテクトモード移行直後の
jmp flush_q1以降で死んでいるようです。
jmp hangとすると3rd exceptionは発生しませんでした。
0793デフォルトの名無しさん
NGNG0794ひげぽん
NGNG3bです。こんな感じです。
00000195256i[CPU ] | EIP=0000003b (0000003b)
0795デフォルトの名無しさん
NGNG現在のコードはどうなってるの?
0796ひげぽん
NGNGRealToProtect:
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
0797ひげぽん
NGNGdw 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
0798ひげぽん
NGNGdw 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
0799ひげぽん
NGNGflush_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
0801デフォルトの名無しさん
NGNG0802ひげぽん
NGNGええその通りです。
BIOS経由で文字列出力する部分です。
nasmでアセンブルするときはひとつにまとめるので
リストもfirst boot, second bootもあわせたものになっています。
0803デフォルトの名無しさん
NGNGΣ(゚д゚lll)ガーン もっと考えれ。
second boot の先頭を 0 として 3b がどこかを調べなきゃ意味ないだろ。
0804795
NGNGうーん、リスティングファイルの方がよかったかも。
で。
>>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
こっちも。
あと、どっかに垢取ってそっちにコード全体を上げた方がいいかも。
0806デフォルトの名無しさん
NGNG1st-boot と 2nd-boot くっつけてアセンブルしない?
別々にアセンブルしてからくっつけた方が良いかも
0807795
NGNGそっちで作業した方が楽だと思われ。
ベースアドレスが00000000hのセレクタに切り替えると、オフセット計算が面倒なことになる。
0808デフォルトの名無しさん
NGNG1st-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 とかつかって二つをくっつける。
これで上手く行くはず。
0810デフォルトの名無しさん
NGNG>>777見れ
0811ひげぽん
NGNGまとめてアセンブルしてました。
(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さんのおっしゃる通りになってました。
今から別々にアセンブルを試してみます。
0813デフォルトの名無しさん
NGNG>>807みたいな手もあるけど、、、、。
0814ひげぽん
NGNG皆さんありがとうございます。
別々アセンブルでも同じIPでエラーが起きてしまいました。
今から外出しなければいけなくなってしまったので
戻り次第アカウントを取得してソースを簡単に公開できるようにします。
ところで
copy firstboot.bin + secondboot.bin higeboot.bin
をddコマンドでやるにはどうやったら良いんでしょうか?
if=で複数ファイルを指定してみたらうまくいかなかった。
0815デフォルトの名無しさん
NGNGそっか。自信あったんだけどダメだったか。
ソース公開を待つことにするよ。
0816デフォルトの名無しさん
NGNG俺、ひげぽんの >>796 - 799 と自作 1st-boot で、上手く行ったよ。
もしかして 1st-boot で、 ds を設定していないとか言うオチですか?
0817ひげぽん
NGNG>>816さん
ありがとうございます。
現状の動かないソースを
http://oshigepon.tripod.co.jp/
におきましたので、ご参照いただければ幸いです。
3bはこちら↓でした。
59 flush_q1:
60 0000003B EA db 0eah
61 0000003C [4010] dw set_cs_desc1 + 100h * 16
0818ひげぽん
NGNG今日は、OS製作以外でちょっとだけプログラムした・・・
最近は、ftpの出来ないフリースペースが多いですね。
アップロードをスクリプトに出来なくて面倒なので
ftpのokなtripodにしました。
0819デフォルトの名無しさん
NGNGもちろんアセンブラで書いたんですよね?
0821デフォルトの名無しさん
NGNG> 10 00000000 0F0116[1500] lgdt [gdtr] ; load gdtr
この時のDSレジスタの値は?
firstbootで設定された07C0hを引きずってるように見えるが。
0822ひげぽん
NGNG07C0hを引きずっています。
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)
0823821
NGNGGDTRに不正な値をロード。
far jump時にCSレジスタに不正な位置を指したセレクタをロードしようとする。
一般保護例外発生。
例外ハンドラに処理を渡そうとする。
IDTRがセットされてないので失敗。
ダブルフォールトの例外ハンドラに処理を渡そうとする。
当然失敗。
トリプルフォールトであぼーん。
こんなシナリオかと。
lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか。
0824ひげぽん
NGNG自己レスです。
>copy firstboot.bin + secondboot.bin higeboot.bin
>をddコマンドでやるにはどうやったら良いんでしょうか?
>if=で複数ファイルを指定してみたらうまくいかなかった。
catでうまくいきました。
catってバイナリファイルも連結できるんですね・・・
0825ひげぽん
NGNG>GDTRに不正な値をロード。
gdtrにロードするアドレスが不正なのか
それともディスクリプタテーブルにセットされている
セグメント設計が不正なのでしょうか。
>lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか
ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。
0826821
NGNGGDTRにロードされる値。
リスティングファイルを見ながらどんなアドレスが生成されるか考えてみよう。
gdtrの指すアドレスは0100:0015。
実効アドレスは00000115h。
lgdt [gdtr]でロードされるのはds:gdtr。
dsレジスタは07C0hだから07C0:0015。
実効アドレスは00007C15h。
> ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。
スマソ、cs:[gdtr]はmasmの書き方だった。
nasmでは[cs:gdtr]。
0827821
NGNG> 実効アドレスは00000115h。
嘘書くなよ、俺。
00001015hが正解。
0828821
NGNG実効アドレス→リニアアドレスに訂正。
0829ひげぽん
NGNG[報告]
結論から言うとnasmでは[cs:gdtr]でばっちりうまくいきました。
>lgdt [gdtr]でロードされるのはds:gdtr。
ということは、secondbootにジャンプしたときに
dsをきちんとセットしていなかったのが問題だったわけですね。
mov ax, cs
mov ds, ax
lgdt [gdtr] ; load gdtr
でもうまくいきました。
アドバイスを下さったたくさんの方々
ありがとうございます。
0830ひげぽん
NGNG今回の反省点[プロテクトモード移行時]
・アセンブラファイルを分割していたことを考慮していなかった。
・リニアアドレスを設定しなければいけないところを考慮できていなかった。
・firstbootからsecondbootにジャンプしたときにdsを設定しなおさかった。
・nasm -lを知らなかった。
・bits 16,bits 32の記述をしていなかった。
いろいろです。
0831ひげぽん
NGNGインラインアセンブラを駆使しつつ、Cでソースをかいて
32bitコンパイラでコンパイルする。
出来上がったバイナリを、secondbootで読み込み実行する。
0832ひげぽん
NGNGhttp://oshigepon.tripod.co.jp/
に置きました。
プロテクモード万歳!!!
皆さんありがとうございます。
00161809000i[CPU ] protected mode
00161809000i[CPU ] CS.d_b = 32 bit
00161809000i[CPU ] SS.d_b = 32 bit
本当に皆さんのおかげでこのスレッドは、非常に有用な
スレッドになっていると思います。
大変お世話になっております、そしてこれからもよろしくお願いいたします。
私と同様に、OSを本気で作ろうと考えている人たち
一緒にがんばりましょう。
0833デフォルトの名無しさん
NGNG0836ひげぽん
NGNG了解です。
そろそろ仮称でも良いからPJ名(OS名)を決めないと・・・
取り返しがつかなくなる気がする。
higeboot.asmって結構恥ずかしい名前だ。
どなたかかっこいい名前ありませんか?
0837デフォルトの名無しさん
NGNG0838ひげぽん
NGNG>higepos
ちなみになんて読むの?ひげぷおーえす?
もし万が一、有名になって、ちょっとでも外人に名前が知られるように
なったとしたら、なんて発音するんだって揉めそう(←もめないって?)
0839デフォルトの名無しさん
NGNG0840=・
NGNG0842デフォルトの名無しさん
NGNG0843デフォルトの名無しさん
NGNG0844ひげぽん
NGNG>2chOS
見た目は非常に良いですね。
にちゃんおーえす?
にこす?
>>843
>2ちゃんどうず
なんか微妙です。
2chdows?
OSASK,nwsosもそれぞれ読み方が良く分からないです。
引き続き募集!
0845FreeDOS教徒
NGNGNWSOS -> なうえすおーえす‥‥と呼んでいる
しっかし、いい名前っていうと思いつかんなぁ
0846デフォルトの名無しさん
NGNG0847ひげぽん
NGNG>OSASK -> おさすく/おーえすあすく
>NWSOS -> なうえすおーえす‥‥と呼んでいる
なるほど。
おさすくかあー
>しっかし、いい名前っていうと思いつかんなぁ
そうですよね。
linuxって人の名前からとった割には、
かっこいい名前ですよね。
>>846
>GATES FREE
ストレートですね。
受けは良いかもしれませんが・・・
これって、門が開いている(だれでもいいよ)
っていう意味にも取れるのかな?
→英語得意な方
0848デフォルトの名無しさん
NGNG名前の付けようがないだろ。
プロジェクト名ならhigeposでもかまわん。
0849デフォルトの名無しさん
NGNG0850ひげぽん
NGNG>OSの特徴がはっきりしないんじゃ
>名前の付けようがないだろ。
>プロジェクト名ならhigeposでもかまわん。
ちょっとこの案に傾いてきた。
でも、ひげ生えてないんだよね。全然・・・
名前変えようかな・・・
0851デフォルトの名無しさん
NGNG0852ひげぽん
NGNGしました。
今後ともよろしくお願いいたします。
0853837
NGNG0855デフォルトの名無しさん
NGNG&
higeposプロジェクト開始
まとめてage
0856FreeDOS教徒
NGNGfarジャンプなの?これじゃ問題がないとは言えないような‥‥‥
万全を期したいなら、farジャンプにするために
DB 0x2E
JMP なんとか
っていう形にしてしまえばいいと思うよ。間違ってたらゴミン
0857ひげぽん
NGNGこの部分で実際ジャンプしていると思います。
でも自信なし・・・
flush_q1:
db 0eah
dw set_cs_desc1 + 100h * 16
dw 08h
0858ひげぽん
NGNGIntel形式ではないのですね・・・
アセンブラからCでコンパイルした実行イメージを読み込めるようがんばります。
int main() {
asm("cli");
return 0;
}
こんなやつがsecondbootから呼べればよいんだよね。
がんばろう。
0859デフォルトの名無しさん
NGNGインラインアセンブラにこだわる理由って何?
0860ひげぽん
NGNG別にこだわってないですよ。
>>859さん
インラインアセンブラ方法と
Cからアセンブラを呼ぶ方法
どちらが方法として一般的ですか?
どちらが容易ですか。
やはりどちらとも経験しておいたほうが良いでしょうか。
0861デフォルトの名無しさん
NGNGそれであってますよ。
[bit16]
flush_q1:
jmp 8:set_cs_desc1 + 1000h
の方がわかりやすいですけど...。
0862ひげぽん
NGNG>この部分で実際ジャンプしていると思います。
>でも自信なし・・・
>flush_q1:
> db 0eah
> dw set_cs_desc1 + 100h * 16
> dw 08h
↑は、はじめての486からのパクリです。
はじめて・・・によると、
「セレクタ地を使ったセグメント間ジャンプ命令をニーモニックでは記述できないので
マシン語命令コードを直接している」
そうです。
0863ひげぽん
NGNG0864デフォルトの名無しさん
NGNGどちらが一般的かは知らんが、俺は関数として
アセンブリを呼ぶことを勧める。
まぁ、まずはこれを見ろよ。
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
0865デフォルトの名無しさん
NGNG「はじめての486」はMASMを前堤に書いているから
そうなのかもしれん。しかし、NASMなら>>861でできるぞ。
0866ひげぽん
NGNG大変貴重なご意見ありがとう。
確かにインラインアセンブラは、アセンブラとCが共存している時点
で見やすくはありませんね。
#define lock() asm("cil")
見たいなのはありですよね?
>>864さんが
せっかく方法を提示してくれたので
明日挑戦してみます。
0867デフォルトの名無しさん
NGNGプログラムやるならコード書くときくらいはミスタイプに慎重になれよ。
0868ひげぽん
NGNG0869FreeDOS教徒
NGNGプロテクトモードに移行したら速やかにパイプラインの初期化をしなきゃ
ヘタな16bitコードが間に入ると落ちたりする‥‥けど、この場合は
ぜんぜん問題なさそうですね。なんかいらん心配してました(汗
0871デフォルトの名無しさん
NGNGひげぽん第一目標クリアしたのかな。
とりあえずおめでとさん〜。
#こんぱいる済みのもアップしてみてほすぃ。
0872ひげぽん
NGNGhigeboot.binもアップするようにしました。
Bochsでフロッピーイメージとして設定すると
ブートできますよ。
実際のディスクにddコマンドで書いてもよいけど。
0873デフォルトの名無しさん
NGNGちょっと観点がずれてない ?
> 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] なんかが結構
面倒と思う。特にローカル変数とか持つとね。そう言うところは、コンパイラに
やらせるべきだと思うけど...。
0874デフォルトの名無しさん
NGNGああ、言われてみればそんな気がして来た。
俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
インラインアセンブラの使い方が嫌なだけだった。
インラインアセンブラ をごっそり関数で括ってあとは
そっちだけ利用すれば一緒だな。
gasの文法を使わなきゃ行けなかったり、
: "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
でも、それって確かに主観の問題だ。
0875ひげぽん
NGNGうーん迷いますね。
gasの文法で書かなければいけないのが
インラインアセンブラの微妙なところかもしれないです。
→正直
結局gasでよいなら、もともとnasmなんか使わなければ・・・
迷うので明日の朝起きてから考えよう。
0876デフォルトの名無しさん
NGNG質問する前に、自分である程度試しているみたいだし
学習スピードが速いね。
これって結構すごいと思う。
応援しているのでがんばってね。
もうすぐ多分、俺もついていけなくなる(技術的に)
0877過去ログ読む気はない!
NGNG0878デフォルトの名無しさん
NGNG宣伝厨うぜぇ。
0879デフォルトの名無しさん
NGNG0881デフォルトの名無しさん
NGNGこの掲示板にいる人がおちこぼれってこと?
0882デフォルトの名無しさん
NGNG0883デフォルトの名無しさん
NGNGputchar関数をつくってみたけどちゃんと動かない。
0884デフォルトの名無しさん
NGNG0885デフォルトの名無しさん
NGNG初期化してるなら data、 してないなら bss、 ローカル変数ならスタックじゃない?
でも、一度アセンブリ出力したのを見た方が確実かも。
0886デフォルトの名無しさん
NGNGなにが悪いのかよくわかっていないので、これから解決してみます
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNG0889886
NGNG0890デフォルトの名無しさん
NGNG0891デフォルトの名無しさん
NGNGあるよ。
独自開発の「処理系」が。
言語自体は独自じゃなく、MASM 準拠、ANSI C 準拠みたいだけど。
まあ、独自言語よりも凄いかも知れんけど。
0892デフォルトの名無しさん
NGNGソースをここにコピペしてくれれば相談に乗れるかも
0893873
NGNG> 俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
> インラインアセンブラの使い方が嫌なだけだった。
なら、同意。
> gasの文法を使わなきゃ行けなかったり、
> : "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
> でも、それって確かに主観の問題だ。
こっちも、同意。GNU の文法ってちょっと変と思う。変数属性の二重括弧と
か...。
0894ひげぽん
NGNGsecondboot protected-modeへ移行 thridをディスクを読み込んでjmp
thirdでは、Cからアセンブラで実装した引数なしの関数をよぼうと思う。
現在プロテクトモードでディスクを読み込むところを実装中・・・
0896デフォルトの名無しさん
NGNGプロテクトモードでディスク読み込みってまだ難くない?
secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNG0899デフォルトの名無しさん
NGNG0901デフォルトの名無しさん
NGNGgcc -Wa,-a -c xxxx.c
って試してみた?
0902デフォルトの名無しさん
NGNG-Map mapfile
ってオプションつけてみ。そして、できたmapfile 見ると良いかも。
俺もこれの正しい読み方分からないけど、なんとなくなら分かる。
誰か解説ページ知らない?
0903889
NGNGマップファイルをみるとdjgppがつけたと思われるものが色々ありますが、
これっていらないもののような感じがするんだけど...
0904903
NGNG問題は半分解決しました。
0905デフォルトの名無しさん
NGNGスマン勝手にコピペさせてもらう。
>値がないのは、フロッピーの読み込みをちゃんとしていなかったという
>初等的なミスでした。
>次に問題なのは、実体のあるアドレスとポインタの値が一定値ずれているということ
>なのですが、これはまだどうやったらいいのかわからないままです。
「一定値ずれている」のは、ld のオプションで -Tbbs -Tdata を使えばいい。
0906デフォルトの名無しさん
NGNG恐らく GCC なども移植できるでしょう。
0907デフォルトの名無しさん
NGNG0908デフォルトの名無しさん
NGNGニコニコプンしかやってないぞ
0909デフォルトの名無しさん
NGNGワラタ
0910デフォルトの名無しさん
NGNGでもウケタYO
0911デフォルトの名無しさん
NGNG0912デフォルトの名無しさん
NGNGNHK 教育 : 12ch
ですが、何か?
0913デフォルトの名無しさん
NGNG教育9ch
が普通でしょ?ニコニコプンは教育。てかニコニコプンって今もやってるの?
0914デフォルトの名無しさん
NGNGNHK 教育 : 3ch
これが関東標準だぞ。
0917デフォルトの名無しさん
NGNG0918913
NGNG地方で違うんですね。知りませんでした。板汚してごめんよ
でも900超えたからいいかな?
0919デフォルトの名無しさん
NGNG>第7回 7/10・7/17
>「OSって何?」
> コンピューターの働きをつかさどるオペレーティング・システム。
>複数のプログラムを交通整理するしくみと、その発展の歴史を紹介する。
ttp://www.nhk.or.jp/denno/nagare/06/top.html
0920ひげぽん
NGNG>プロテクトモードでディスク読み込みってまだ難くない?
>secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
>じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
昨日、今日とずっと考えてやっとだ取り付いた結論が↑に書いてありました(笑)
さてどこに読み込んで、プロテクトモードに移ったときに
どうすれば実行されるのかでまた悩みます・・・
スレッドが900を超えたのでそろそろ新スレッドを・・・
0921デフォルトの名無しさん
NGNG読みこむ場所はとりあえずどこでも良いんじゃない?
実行するにはその場所をcallするかjmpする。
とりあえず簡単なCのプログラムを書いて
ld のオプションで -e xxxx -Ttext yyyy -oformat binary
を指定すればOK
0922ひげぽん
NGNGアドバイスありがとう。
いきなり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を設定したことを考慮しなければいけないとは思うのですが、、、
0923デフォルトの名無しさん
NGNGgdt の設定の仕方が前みたい(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';
}
うん。まあ上のどれか試してみて報告しれ。
0925924
NGNG・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
でした。
0926デフォルトの名無しさん
NGNGリンかスクリプト使えって。
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) }
}
0927デフォルトの名無しさん
NGNGそれとも実機なのでしょうか?
0928デフォルトの名無しさん
NGNGだいたいBochsの人が多い。
ていうか過去ログ嫁
0929デフォルトの名無しさん
NGNGPlex86は動くみたいだけど。。
0930デフォルトの名無しさん
NGNGトリップ付けといたら?
0931デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
0932デフォルトの名無しさん
NGNG0933デフォルトの名無しさん
NGNG0934デフォルトの名無しさん
NGNG0935デフォルトの名無しさん
NGNGいいけど、高いよ。
0936デフォルトの名無しさん
NGNG評価版がタダじゃないの?
0937ひげぽん
NGNGありがとう。
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
必要と感じたら付けますよ。
0938デフォルトの名無しさん
NGNG0939ひげぽん
NGNG0942デフォルトの名無しさん
NGNGmainに引数を渡したりランタイムの初期化処理が入るからダメ。
プログラムエントリをmainに出来るならそれもOK
たとえば、VCのリンカだったら -entry:mainCRTStartupみたいな感じで指定できる。
0943ひげぽん
NGNG>cygwinだろうがDJGPPだろうが、
>mainに引数を渡したりランタイムの初期化処理が入るからダメ。
>プログラムエントリをmainに出来るならそれもOK
gccの場合↓のオプションのことでしょうか?
-ffreestanding
produce code that is meant to be run without an OS (ie:kernel code)
0944デフォルトの名無しさん
NGNG0945デフォルトの名無しさん
NGNGひげぽん それ main は要らない。 >>923 は別に主要部分だけ書いたんじゃなくて
あれで全て。
0946ひげぽん
NGNG深読みしすぎました。
${CC} -c -ffreestanding -Wall ??.c -o ../bin/third.bin
でコンパイルしてcatすればいいはずなのに・・・
bochs異常終了
いったい何をやらかしているのだろう。
他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。
0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNGソースうpれ。Makefileも忠実にな。
0950デフォルトの名無しさん
NGNG> 他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。
オブジェクトファイルのヘッダがついてるだろ…
0951デフォルトの名無しさん
NGNGでしょうか ? 具体的には、lodsb に CS セグメントオーバーライトしたいんで
す。
cs:loadsb
とか、
cs:
loadsb
とかやってみたけど、エラーになっちゃう。
db 2eh
loadsb
とやると、ちゃんと動くから命令としてはサポートしてると思うんだけど....。
0953デフォルトの名無しさん
NGNGcs lodsb
0954デフォルトの名無しさん
NGNG?
0955ひげぽん
NGNGこちらへどうぞ
↓
http://pc3.2ch.net/test/read.cgi/tech/1027080631/
0956951
NGNGサンクス。でも、これは思いつかないなぁ...。
>>954
アセンブラスレで聞いたほうが良かったかな ? こっちなら、nasm 使ってる人も
多いかと思ったもので...。(ひげぽん Boot をちょっと改造して遊んでたので、
まんざら関係ないわけじゃないということで許してちょ。)
0957デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1027080631/
0958次スレ
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1027080631/l50
0959yuji
NGNG0960次スレ案内
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1027080631/l50
0961デフォルトの名無しさん
NGNG0962デフォルトの名無しさん
NGNGhttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos/src/
あと次スレがあるからこっちを上げないでね
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNG是非こっちにきて、言語板の電脳のよくわからない住民に教えてやってくださいな。
http://academy.2ch.net/test/read.cgi/gengo/1028424001/l50
0965デフォルトの名無しさん
NGNG日本語ニーモニックを開発シル
0966デフォルトの名無しさん
NGNG0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNG0971デフォルトの名無しさん
NGNG感謝を捧げつつ....てか!?
0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG0977ひげぽん
NGNG埋め(・x・)
0978デフォルトの名無しさん
NGNG0979デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNG0984FreeDOS教徒
NGNG0985ひげぽん
NGNG0986デフォルトの名無しさん
NGNG0987デフォルトの名無しさん
NGNG0988デフォルトの名無しさん
NGNG09891000とり
NGNG09901000とり
NGNG09911000とり
NGNG09921000とり
NGNG09931000とり
NGNG09941000とり
NGNG09951000とり
NGNG09961000とれ
NGNG09971000とれ
NGNG09981000とれ
NGNG09991000とれ
NGNG10001000とれ@いえい@(・◎・)
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。