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

OSをつくろうpart2

レス数が1000を超えています。これ以上書き込みはできません。
0001ひげぽんNGNG
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

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

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

Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。
0002デフォルトの名無しさんNGNG
もう外出だよ
00032NGNG
Σ(´д`)

・・・・2getシトケバヨカタ・・・
0004デフォルトの名無しさんNGNG
1はちょっと本気っぽいな。
がんばれよ。
00052NGNG
あ、しかもちゃんとpart2ってあるな・・・


     ||
   Λ||Λ
  ( / ⌒ヽ
   | |   |
   ∪ 亅|
    | | |
    ∪∪
0006manko_chinkoNGNG
カーネルだけで何万行ぐらいだろう、、、
0007デフォルトの名無しさんNGNG
linuxとOSASKを並列にするのもどうかと思うが・・・

けどアセンブリで書かなきゃいけないところってそんなに多くないよね。
0008デフォルトの名無しさんNGNG
アセンブリで書かないと逝けないのはブートローダーと、
IO関係でタイミングがシビアなドライバだけ。
0009ひげぽんNGNG
>>4
ありがとう。
>>6
そうですね。途方も無いですね。
しかも、洗練されたコードが数万行・・・
それよりも、デバイスドライバーがきついかも。
>>7
そうなんですよ。
一部アセンブリ(パフォーマンスが重要なところ。。。)
ですよね。
0010デフォルトの名無しさんNGNG
ユニックスのソースコード
int main(){
for(;;)
getChar();
}
0011ひげぽんNGNG
>>8
アセンブリって、CPU毎に違うんですよね?
何か良い参考書をご存知ありませんか?
特にOS作成にかかわる部分で・・・
0012デフォルトの名無しさんNGNG
>>11
インテルのマニュアル
0013デフォルトの名無しさんNGNG
ひげぽんって何歳?
0014ひげぽんNGNG
1>>にも書きましたけど
almost javaでOSは無理っすかね?
優秀なnativeコンパイラがあれば出来るのでしょうか。
JavaのほうがCよりも得意です・・・
0015デフォルトの名無しさんNGNG
アセンブラなんて、大学の時の授業で、Win上で動くZ80エミュレータ用
の書いたのが最後だ、、、。
0016デフォルトの名無しさんNGNG
Intelのマニュアル群だ、開発者どもは見とけ!

http://www.intel.co.jp/jp/developer/design/litcentr/index.htm
0017ひげぽんNGNG
>>11
>インテルのマニュアル
うぅ。
やはりそうきますか。


>>13
24才です。もしや年齢制限あり?
0018デフォルトの名無しさんNGNG
そうそう。前から思ってたんだけど恥かしくて聞けなかったので聞く。

よく言う機械語ってCPUが解釈できる言語(?)というかデータと教わったけど、
OSによってバイナリコードって違うじゃん。
ってことは、OSがexeファイルとかを機械語に翻訳してるの?
0019ひげぽんNGNG
>>16
thanks!!
しかも日本語じゃん。
なんかわくわくしてきた。早速読ましてもらうよ。
これだけでこのスレッド立てた意味があったよ。
0020デフォルトの名無しさんNGNG
>>18
それ俺も気になってた。
0021ひげぽんNGNG
間違ってたら誰か突っ込んでね。
>>18
.exeファイルそのものが実行イメージだと思う。
メモリーにロードされてそのまま実行されるんじゃないのかな。
002218NGNG
>>21
恥を忍んでさらに聞く。

じゃあ、exeファイルもx86系のCPUで動いてるほかのOSのバイナリ
コードと(ヘッダとかそういうの除いて)同じなわけ?
0023デフォルトの名無しさんNGNG
OSによって違うのは、ヘッダとか、データとの
配置レイアウトとか、DynamicLinkするテーブルとか。
実行される機械語としては、OS毎に違いは(あんまし)ない。
002418NGNG
>>23
そうなんだ、、知らなかった、、。ありがおつ
0025デフォルトの名無しさんNGNG
つかぬ事をお聞きしますが、Windowsはどんな言語で組まれているんでしょうか?
0026ひげぽんNGNG
>>22
OSによって異なっているハードウェアへの制御のコードの部分もあるから
まったく一緒で互換性があるとはいえないじゃないかなあ。
うーん自信なしです。→誰か識者さん助けて。
0027デフォルトの名無しさんNGNG
>>25
COBOL
0028デフォルトの名無しさんNGNG
あと、システムコールとか違うだろ
0029ひげぽんNGNG
>>25
昔C++で組まれていると聞いたことがあるがどうなんでしょう。
>>23
THANKS これからもよろしく
003018NGNG
>>25
それは聞いた事ある。
基本はC/C++で、MFC使って書いてるらしい。
このMFCも外部に出してないMS秘蔵のMFCがあるらしい。

ま、OSでも上層部分の話だろうけど。
0031デフォルトの名無しさんNGNG
どんなC/C++コンパイラ使ったんでしょうか
003218NGNG
まあ、どの部分までを"OS"って呼ぶかだよな、、
0033デフォルトの名無しさんNGNG
おほほ領すレの予感
0034ひげぽんNGNG
NTのカーネルのソースは見てみたいね。
マイクロカーネルなんですかね?
0035ひげぽんNGNG
>>31
INTELってコンパイラ出してましたよね。
あれってどういう開発者が使うんでしょうか?_
デバドラ関係?
0036デフォルトの名無しさんNGNG
>>34
いや………当初、それがウリだったんですが。
0037ひげぽんNGNG
>>30
C++なら、ある程度はオブジェクト指向でかけるので
C ONLYよりはいいかも。
でも秘蔵のMFCってやだなあ。
0038ひげぽんNGNG
>>36
やっぱりそうなんですか。
最近なんかの本に書いてあったのを見た記憶があります。

ある程度は成功してるってことですよね。
0039デフォルトの名無しさんNGNG
俺も、UNIX(初期のじゃない)がC書かれたように
C++で独自OS(高性能)を書いて見たいですね
0040ひげぽんNGNG
>>36
マイクロカーネルは、カーネルを細かいモジュールに分けて
複雑さを取り除こうという概念ですよね。
きちんと役割分担をもたせる。

でもそれって、モジュール間の関連が複雑になるんですよね。
モジュール数が増えれば増えるほど・・・
0041ひげぽんNGNG
>>39
おいらもっす。
ていうか、ここで同志を見つけたり
自分のモチベーションを上げたいですね。
0042ひげぽんNGNG
どうなんでしょうか。
既存OSをベースにするならunix系かなと思うんですが、
必ずしもunixの設計が理想的とはいえないと本で読んだことがあるし

分散化とか考えたら頭がパンクします。
0043デフォルトの名無しさんNGNG
>>40
モジュール感の関連を疎遠な物にするためのマイクロカーネルだが。
複雑なのはモノリシック
0044ひげぽんNGNG
>>43
おお。モノリシックとは何ですか。。
勉強になります。
0045ひげぽんNGNG
勝手にリンク
[OSASK]
ttp://www.imasy.org/~kawai/osask/index.html

ほかにもあったら紹介してほしいな。
0046デフォルトの名無しさんNGNG
atheosとかは?
0047デフォルトの名無しさんNGNG
>>45
thnx!今はvmwareがあるから便利だね。
0048デフォルトの名無しさんNGNG
Powers CEベースのOSを作るというのはどうですか?
0049ひげぽんNGNG
スレッドがにぎわってきてうれしいです。
>>46
明日会社で見て見ます・・・
0050ひげぽんNGNG
>>47
vmware上でOSの実験とかって出来るんですかね。
ブートとか。
vmwareつかったこと無いです。
0051デフォルトの名無しさんNGNG
現代的なOSは、メモリ管理やプロセス管理、
それらを安全確実なものにするための
ハードウェア的なメモリ管理機構の活用が当たり前だけど、
それとは違ったアプローチでもちゃんとした環境が作れる。
その例が、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デフォルトの名無しさんNGNG
漏れはPowers CEでOSを勉強した。
0053デフォルトの名無しさんNGNG
Powers CE ってなんだ?
ググってもそれっぽいのが引っかからないが。
0054デフォルトの名無しさんNGNG
patroで検索
0055デフォルトの名無しさんNGNG
さっぱり引っかからん。
直リンくれ。
0056デフォルトの名無しさんNGNG
ここにも粘着君(>>52)が居たか・・・
0057ひげぽんNGNG
>>51
ありがとう。
初めて読む486本屋で探してみます。-
0058ひげぽんNGNG
さてまじめにOSを作ろうとしている(または挫折した人)
お話をぜひ聞かせてください。
0059デフォルトの名無しさんNGNG
絶版
0060ひげぽんNGNG
>>59
まじっすか???
むしろ図書館で探すか。
0061ひげぽんNGNG
atheosちょっと見てみました。
やはり、ある程度はアセンブリが必須なんですかね。
vmware誰か使ったことあるっすか???
0062デフォルトの名無しさんNGNG
>>59
おいおい。うそつくなよ(藁
0063ひげぽんNGNG
x86アーキテクチャ入門講座
http://ha3.seikyou.ne.jp/home/Joyit/asm/regs.html
0064デフォルトの名無しさんNGNG
アセンブラとかの本は需要が無いのか絶版多し。
0065デフォルトの名無しさんNGNG
便乗質問。
昔あった98テクニカルデータブックとか
IBM PC-ATハードウェアバイブルとか
この手のに相当する資料って今はどっから入手するものなの?
0066デフォルトの名無しさんNGNG
持ってる香具師からもらうしかないんじゃないの?
0067ひげぽんNGNG
>>64
そうですね。本当にごく少数の人しか今は使わないですよね。
アセンブラで書く部分はコード的には量は少ないけど
きっと重要なところなんですよね。
0068デフォルトの名無しさんNGNG
>>66
ドライバ屋なんかが参考にする書籍って売りに出てないのかなぁ。
0069ひげぽんNGNG
>>68
見つけたらぜひ紹介してください。
68さんもOSを作ることに興味があるんですか・
0070ひげぽんNGNG
よく見たらアセンブラのスレッドがありますね。
ちょっと今から読んでみます。
0071デフォルトの名無しさんNGNG
>>69
興味はあるけど時間はない(藁
テクニカルデータブックなら手元にあるから
古い98を買って何か作りたいなーなんて、たまに思うくらい。
0072デフォルトの名無しさんNGNG
98関連の資料なら
スーパーテクニック、テクニカルデータブック、GDCテクニカルブック、プログラマーズバイブル
あたりが転がってる。
ほしけりゃ捨てメアド書いておいてくれ。
0073ひげぽんNGNG
>>71
なるほど、確かに時間は無いですな。
会社でこっそりやろうかな。
うちも9821があまってる。すごい重いノートだよ。
0074デフォルトの名無しさんNGNG
ひげぽんぽんは今までどんなもん作ってきた?
0075ひげぽんNGNG
N88ベーシックから始まり
C,C++,java,perl, ruby をかじりつつ
今はSEやってます。SEって言ってもほとんどPGですが、
うーん何を作ってきたかといわれると困る
仕事では、CでCGI書いたり、シェル書いたり・・・

javaだとftpクライアントもどきとか・・・
オセロとかも作ったなあ。
0076デフォルトの名無しさんNGNG
>>72
98は意外とオンラインで資料が手に入ったりするからパスかな。
それほど凝った入れ込み方は今更しないだろうし。
ATコンパチの方が欲しいけど、ないんだよなぁ。
0077デフォルトの名無しさんNGNG
http://homepage2.nifty.com/nowsmart/nwsos.htm
0078デフォルトの名無しさんNGNG
>77
へぇ、大したもんだね。
でも魅力的じゃないし、エンドユーザー向けでもない。
組み込みOSに近い感じ。
でもそれだったらQNX(http://www.qnx.co.jp)とかあるし。
0079ひげぽんNGNG
>>77
thanks!!
0080ひげぽんNGNG
昨日から少しずつアセンブラの勉強の準備を始めました。
「はじめて読む486」は見つかりませんでした。
週末に大きい本屋に行ってきます。

識者の方に質問なのですが、
OSを作るうえで、アセンブラでしか書けない部分というのは、
以下の2つの観点からはどのような感じなのでしょうか。
・OS全体に占めるコードの量の割合
・OS全体の機能の中で占める、重要さ

0081デフォルトの名無しさんNGNG
まず気にする部分はブートローダーだけ。
百〜千行程度。
ドライバとかはそれこそデバイスによって様々なので、定量化できない。
0082ひげぽんNGNG
>>81
なるほど。
ブートローダーの部分ですが、これって一から書くのでしょうか。
ある程度は、既存のものを参考にすればよいのでしょうか?
ブート後の処理も良く分かってないなあ。

どなたか参考URLを教えてください。
0083デフォルトの名無しさんNGNG
>>80
識者じゃないが、
一般的に言って、ハードウェアを直接弄る部分は
アセンブラで書かないといけない。これには他の手段はない。
ハードを制御できなければ使い道がないから最重要部分であるのは間違いない。
ただ、その分量はどういう構成にするかによって随分と変わってくる。
これも大雑把な例示をすれば、

アプリケーション→ドライバ→OS→ハードウェア

という風に、ドライバの代わりにOSが
ハードウェアへの直接アクセスを常に代行するのなら
OSにハードウェアの基本操作ライブラリを入れればいいので量は減る。
しかしオーバーヘッドが入るので速度は遅くなる。

アプリケーション→ドライバ→ハードウェア

こんな具合にドライバが直接ハードウェアを操作するのなら
オーバーヘッドは減るが、コードが分散するので量も増える。
また、このような形だと全体制御、エラー処理などの問題も出てくる。
どちらがいいかは状況による。
0084デフォルトの名無しさんNGNG
ブートローダ、デバドラ、メモリマネージャ、スケジューラ、あたりはアセンブラだな。
0085デフォルトの名無しさんNGNG
マイクロカーネルで作るんでしょ?
ハードウェアもioサービス等を通して高級言語からいじるべき。
008677NGNG
NOWSMART OS は、実際に売れるかどうかは不明。

しかし、日本では珍しく、DOS 系と相性がよい OS だし、
最近のマスコミによる、日本のソフト技術者のレベル軽視
に対する良い反例になってるんじゃないかな。
0087ひげぽんNGNG
>>83
>>85
なるほど。
ところで既存の代表的なOSは
アプリケーション→ドライバ→OS→ハードウェア
アプリケーション→ドライバ→ハードウェア
のどちらを採用しているのでしょうか。

OSを作ろうとした場合、
もちろん最初の設計が一番大事だとは思うのですが、
まずは、動くものを作りたいというのが人情じゃないですか。
その際の第一の壁がブート部分かと・・・・

でもやると決めたらやるしかないですよね。
マシンをお釈迦にしたくないのでvmware上で実験できれば良いのですが
どうなんでしょう。

0088デフォルトの名無しさんNGNG
オライリーの詳説linuxカーネル読んだ人いる?
誰か感想きぼんぬ。
0089デフォルトの名無しさんNGNG
アプリケーション->サービス->ドライバ(->OS->IOサービス)->ハード
0090ひげぽん NGNG
>>89
ではOS製作者は、OS,IOサービス,ドライバーを
実装すればよいのでしょうか。
0091デフォルトの名無しさんNGNG
マジで初心者なんだけど、Cとかで書いた場合、コンパイラはどんなの使うの?
0092デフォルトの名無しさんNGNG
>>87
> アプリケーション→ドライバ→OS→ハードウェア
> アプリケーション→ドライバ→ハードウェア
> のどちらを採用しているのでしょうか。

アプリケーション → OS → ドライバ → ハードウェア

だと思うが。

> その際の第一の壁がブート部分かと・・・・

今出てるインターフェース誌を買って読むべし。結構詳しく載っている。
0093デフォルトの名無しさんNGNG
>>91
コンパイラは普通の奴。ヘッダファイル/ライブラリが違う。
0094ひげぽんNGNG
>>91
あ、それ私も知りたい。
まずは環境構築ですよね。
0095デフォルトの名無しさんNGNG
一番大事なのはリンカ。
自分のOSに合ったバイナリイメージを作らないといけない。
それから、通常は提供されている標準C/C++ライブラリは使用できない。

>アプリケーション → OS → ドライバ → ハードウェア
この形式だと、機能追加=OS(カーネル)の再構築だったりするから、
サービスを挟むべき。

それから、ドライバもユーザーモードドライバはOSやIOサービスを経由してハードをいじる
カーネルモードドライバだけが直接ハードウェアをさわれるようにするべき。
0096デフォルトの名無しさんNGNG
とりあえず立ち読みでもいいから目をとおすべき。

「Lion's Commentary on UNIX」アスキー

x86なら>51の言ってたタネンバウム先生の

「オペレーティングシステム」

どちらもコンパクトなコードが載ってるので即役立つはず。
009792NGNG
>>95
言いたいことはわかるが、ここのレベル考えて書いてる ?
ドライバのダイナミックロードやユーザーモードドライバなんて言うのは
一応OSができてからでもいいと思うぞ。
0098デフォルトの名無しさんNGNG
レベルのことを言うんならJava方式だと思うが。
0099デフォルトの名無しさんNGNG
ここってネタスレ?すげー笑えるんだけど。
0100デフォルトの名無しさんNGNG
DX8SDKどこでダウソ?
0101ひげぽんNGNG
>>98,99
うう。レベルが低いのは認めますが、
ここは出発点ということで徐々にレベルアップします。
少なくともやる気はある。
0102デフォルトの名無しさんNGNG
十五歳の誕生日にオペレーティングシステム 第2版買ってもらうことにしました。
0103デフォルトの名無しさんNGNG
>>100
スレ違い & マルチウザイ。
0104デフォルトの名無しさんNGNG
>>99
99%ネタスレです。
0105ひげぽんNGNG
>>102
もし本当に15才ならぜひ、将来良いOSを作ってください。
うーん若いですね
0106デフォルトの名無しさんNGNG
99=104
暇人
0107デフォルトの名無しさんNGNG
>>101
>>106 の言う通り、 >>99=>>104 はかまって君だから、無視しとけば
いいよ。
0108デフォルトの名無しさんNGNG
>>106
オマエモナ。ヒッキー
0109デフォルトの名無しさんNGNG
スレのレベルが高ければ誰も荒らしたりしないよ
アホがageるから荒らされる
0110ひげぽん NGNG
>>88
さっき本屋で立ち読みしてきました。
OSを作ろうとするといろいろな事を考えなければいけないこと
があると痛感しました。

アセンブラの環境はnasmにしようかと思うのですが、
他にお勧めのものありますか。

0111デフォルトの名無しさんNGNG
いや、nasmがベストかと。
まぁ、漏れはTASM5.0とかでも良いと思うが
0112デフォルトの名無しさんNGNG
ほんと、低級PGってどこにでもいるんだね(笑
0113デフォルトの名無しさんNGNG
>>109
> スレのレベルが高ければ誰も荒らしたりしないよ
関係ない。どんなレベルのスレでも荒らされる時は荒らされる。
とにかく、「荒らし」には無視しかない。匿名掲示板の宿命だよ。
0114デフォルトの名無しさんNGNG
>>112
自分のことだろ
プログラムすら出来ないんでしょ。
0115デフォルトの名無しさんNGNG
>>114 == >>99
ですか?必死だな(ワラ
0116ひげぽん NGNG
>>111
ありがとう。
さあて、nasmのドキュメントを読むか(英語)
0117デフォルトの名無しさんNGNG
コンパイラにgccを採用するならnasmじゃなくてgasにした方が親和性高いかもしれない。
インラインアセンブラでnasm使用できないでしょ?
0118デフォルトの名無しさんNGNG
>>113
なぜ荒らされるのかを認識しようとしないのは、思考停止してるだけ。
だから荒らされるんだよ。
0119デフォルトの名無しさんNGNG
もう荒らしの話は終わりに汁
0120ひげぽんNGNG
>>117
実は開発環境をlinuxと、WindowsXP proどちらにしようか迷っております。
linuxマシンはスペックが低いのでOS実験機(オシャカになってもいい)
そうすると、gasは無理かもしれないです。
でもかなりの利点があるならメインマシンをlinux&XP のデュアルブートにしようかな。
0121デフォルトの名無しさんNGNG
OS板行けばと思ったのは俺だけかな?
0122デフォルトの名無しさんNGNG
開発マシンは関係なくて、採用するコンパイラが問題。
0123デフォルトの名無しさんNGNG
コンパイラなんぞ自分で書けばいい。
ハードの資料と時間と根気が最大の問題。
0124ひげぽんNGNG
>>122
>>123
すいません、話についていけてません。
gccって、unix系用のコンパイラじゃないんですか?
もちろんここではcygwinは考えないとしての場合ですが。
0125デフォルトの名無しさんNGNG
>>123
実用レベルのコンパイラが簡単に書けるわけねーだろ!
ゴルァ!
0126デフォルトの名無しさんNGNG
>>121
OSを作るためにみんなでお勉強スレッド
http://pc.2ch.net/test/read.cgi/os/1020424840/

これが参考になりそうだ
0127デフォルトの名無しさんNGNG
>>125
てめーの実業務用の実用コンパイラなら幾つも書いてきてますが何か?
0128デフォルトの名無しさんNGNG
コンパイラを作るスレになりますた
0129デフォルトの名無しさんNGNG
>>127
自慢するなよ。(w
0130デフォルトの名無しさんNGNG
>>127
ハイハイ、わかったわかった。一生そう言っててくれ。
0131デフォルトの名無しさんNGNG
文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
こんなもん自慢になるかっつーの。
そんなことよりハードの資料。
BIOS叩くにしてもそこそこのもんが必要だろ?
0132125NGNG
>>127
ん?俺はひきこもりだぞモルァ!
0133ひげぽんNGNG
>>126
使える!!!
今の私には最高のスレッド
0134デフォルトの名無しさんNGNG
>>124
別にUNIX用ってわけじゃないが。
つーか、こんなレベルでOS書けるんかいな?
0135デフォルトの名無しさんNGNG
問題はひげぽんが死ぬまでに形になるかだな・・・
0136デフォルトの名無しさんNGNG
(笑
0137デフォルトの名無しさんNGNG
>134
Onani-System なら書けるかも
0138デフォルトの名無しさんNGNG
>>131
> 文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
「実用レベル」と言う言葉が見えないのか ? それとも、一般人と定義が違うの
か ? いずれにせよ、スレ違いだからどっか逝ってくれ。
0139デフォルトの名無しさんNGNG
>>138
待て待て。喧嘩を売ったのは125。俺は「お前はバカか」と言っただけ。
実用レベル云々は色々と反論したくもあるがここでやるつもりはねぇよ。
0140ひげぽんNGNG
一応5年計画です。
さすがに死ぬまではやらないかと(冗談を真に受けてる)
0141デフォルトの名無しさんNGNG
とにかくもっとアセンブラやハードウェアについて勉強した方がいいね。
今の知識だと、着手してからがとても大変だと思うよ。
昔は、アセンブラの初歩として「はじめて読む8086」をよく薦められた。
もしどこかで手に入るのなら読んでみるといいかも。
0142デフォルトの名無しさんNGNG
>>141
オレモテルヨ!
はかにも「初めて読むアセンブラ」もZ80を理解するのによかたよ
0143ひげぽんNGNG
>>141
確かにハードウェアの専門知識は皆無です。
PC自作したり、RS232CにLEDつないで遊んだ知識は一切役立たず・・・
週末は本探しからはじめます。
0144デフォルトの名無しさんNGNG
>>139
>>123 付近の話の流れで、唐突に「コンパイラなんぞ自分で書けばいい。」と
言う発言はいかがなものかと。突っ込まれてもしょうがないと思うぞ。
0145デフォルトの名無しさんNGNG
アセンブラもろくに知らんとOS書くやつがいるんか
いやBASICでOSだっつやつもいるが…
こんなんではブートしてもプロテクトモードにはいるときにBIOS叩きで氏ぬのがオチ
0146デフォルトの名無しさんNGNG
>>145
これから勉強すれば良いんじゃん。
何を言ってるんだか・・・
0147145NGNG
せいぜいがんばれよ
0148ひげぽんNGNG
>>145
OSを作りたいと思う。
→アセンブラが必要と分かる
→アセンブラ勉強する
→CPU等ハードウェアの知識が必要と分かる
→勉強する
→ちょっと作ってみる
→失敗!!
でもその過程が楽しい(少なくとも私は)のでよし!!!!
0149デフォルトの名無しさんNGNG
>>144
あー、それは済まなかった。申し訳ない。
0150125NGNG
(´-`).。oO(ひょっとして俺に責任があるのか?)
0151デフォルトの名無しさんNGNG
コンパイラ云々もたしかに大変だけどそれ以上にc言語で書くなら、
それのライブラリを作るほうが大変という罠。
0152デフォルトの名無しさんNGNG
割り込みとメモリ管理、タスクディスパッチのハザマで死ぬであろう。
0153デフォルトの名無しさんNGNG
>>152
それを思うとやっぱりgccしか選択しないなと思う。
0154デフォルトの名無しさんNGNG
GPLかぁ。。。
0155デフォルトの名無しさんNGNG
いまどきデバイスドライバがアセンブラってのはどんなOSだよ
vxdのヘッダだけとかじゃねーの?

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

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

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


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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>243
くだらん。

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

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

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

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

間違いや、認識違いを指摘していただけるとありがたいです。
0253デフォルトの名無しさんNGNG
>>245
understandの時点でうそ英語
馬鹿丸出しだね。
0254デフォルトの名無しさんNGNG
鈴木アグリー
0255デフォルトの名無しさんNGNG
>>253
understoodにするの?
教えてくれ。
0256デフォルトの名無しさんNGNG
あんでーすてんど
0257デフォルトの名無しさんNGNG
0000 0001 0000
0258デフォルトの名無しさんNGNG
>>232
電波だから気にしない方が良い。


水彩画家が『将来、アーティスティックなビルを建ててみたい』と言っているような物だから、

>>1
第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
0259デフォルトの名無しさんNGNG
一から勉強しながらOS作ろうっていうのがきついな
minix,linuxを解析したほうが近道だろ
今のレベルでは素人がいきなりオリンピックに参加するようなもの
0260デフォルトの名無しさんNGNG
>>259
いや、学問に王道なし。

minixとかはOSとはなんぞやComputerとはなんぞや、Architectureとはなんぞや
がわかってからで遅くはない。
むしろ、わかってからならば早く理解できる。
まぁ、>>1はOADGとかも知らないだろうし、OSを組むのは1年早い。
0261デフォルトの名無しさんNGNG
>>260
そういうのを勉強しながら学ぶのにMinix本は最適なんだけどねー
0262デフォルトの名無しさんNGNG
なあ。なんで、どうでもいいお説教するやつ多いんだ。
おまえらじいさんか?
どうせ自分じゃ何にもできねーんだろ。
うざいから、「検索しろ」だの「もっと勉強してから」だの言うなよ。
0263デフォルトの名無しさんNGNG
作りながら学習するのは楽しいぞ
楽しいからプログラミングする
まさに本来の姿
02641じゃないけどNGNG
>>258
>第2種情報処理技術者試験くらい受けてからOSに挑戦しろ

必要性を示してください。
0265デフォルトの名無しさんNGNG
別に2種持ってないとOSがつくれんわけじゃないが、2種取れる程度の知識もないと、
OSの勉強すらままならんだろ。
0266デフォルトの名無しさんNGNG
あんつーれべるのひくさだ。
0267264NGNG
>>265
>2種取れる程度の知識もないと、OSの勉強すらままならんだろ。

これは同意。

でも >>258 は「受けろ」と言ってるから。
基本情報処理技術者試験を受験する必要がどこにあるのかと。
0268デフォルトの名無しさんNGNG
>>267
粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
0269デフォルトの名無しさんNGNG
>>268
年幾つよ?
0270デフォルトの名無しさんNGNG
>>269
粘着うぜぇ。内容のない会話して何が楽しいんだ厨房
^^^^
0271デフォルトの名無しさんNGNG
>>270
マーはみんな粘着
0272ひげぽんNGNG
>第2種情報処理技術者試験くらい受けてからOSに挑戦しろ
えーと。大学のときに受けて取得しました(汗)
今は名前が変わったんですよね。
なんだか、すごい自分が馬鹿な質問ばかりするからなんだろうけど
誤解が・・・


>>260
>>261
今現在、↓の本を読んで勉強中です。
minixのソースも多少読んでいます。

「オペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
0273ひげぽんNGNG
アセンブラができる人に質問です。
x86系のアセンブラ入門には、
NASM と gas(as)どちらが適しているでしょうか。

またアセンブラに関して
ASKAを使用したことのある人いますでしょうか。
ASKAを使用する上でのメリット、デメリットを教えてください。
0274デフォルトの名無しさんNGNG
ひげぽんって無職?
0275デフォルトの名無しさんNGNG
nasm使っておけって
0276ひげぽんNGNG
>>274
へなちょこSEです。
>>275
出来ればgasを薦めない理由もしくは、NASMを薦める理由
を教えてください。
0277デフォルトの名無しさんNGNG
>>276
gasのニモニックは少なくともx86環境に置いては一般的じゃないから
0278ひげぽんNGNG
>>277
なるほど。
そろそろフロッピーブート&アセンブラHELLO WORLD
に取り組もうとしてたところなので助かります。
貴重なアドバイスありがとう。
0279デフォルトの名無しさんNGNG
OS作れるとどうなるの?
芸津のようにお金持ちになれるの?
自己満足?、要はオナニーソフト?

OS作った先の未来にはナニが待ってるの?

お家に帰ってきたら足の臭いお父さん達が、頭を禿に
しながらせっせと築き上げてきたOSがそんな簡単に
出来上がるものなんの?

0280デフォルトの名無しさんNGNG
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪
なんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪
しかし、この人はしてしまったのです(^^;ワラ
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪
ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ
0281デフォルトの名無しさんNGNG
元々、無駄なスレに無駄なレスをつけて、無駄なレスを返す
>>280や他も馬鹿っぽいよ(^^;ワラ

特に>>280は海馬にカビが生えてる。キモ
0282デフォルトの名無しさんNGNG
こういうときはおとなしくツレタ!、とか書いておけばいいんですよ。
0283デフォルトの名無しさんNGNG
マジレスがかっこ悪いというのには反対だけど
コピペにマジレスはさすがにかっこ悪いと思うよ
0284デフォルトの名無しさんNGNG
>> 279 つくれるからどうというわけでは、ないでしょう。
でもその作る人にとっては、その作る上での技術を実際に体で
覚えられて経験上いいのではないでしょうか?

また、「そりゃオナニーソフトだろう!」といわれたって、
「自分が気持良い」ソフトが一番うまく書けるということはないですか?
それで他のみんなも気持良ければもっと良いでしょう。


0285デフォルトの名無しさんNGNG
>>272
ほんとかよ。
てっきり俺はJava専門プログラマかと思ったよ。

>>264
上の理由により。
OSを作るならノイマン型コンピュータの基礎くらい知っていて欲しいのでね。
Java環境だけじゃなくて。


minixを参考にするのに良い点はx86用OSを作るときの例としてだと思う。
minixがOSだと思うと、x86以外は取っつきにくくなっちゃうか、
後で後悔すると思うな。
あれはOSだがOSはあれではない。
もっと広い視点と腰を据えた覚悟と長期計画が必要だと思うな。マジでやるんなら。
趣味でやるら、まず、コード書いてNETに上げてみな。まずはそれからだと思う。
0286デフォルトの名無しさんNGNG
>>285
お前は何様なんだ?
0287デフォルトの名無しさんNGNG
>>285
自信満々みたいだけど何が言いたいのか分からん。
表現力不足なのか分かってないのか。

いまのままじゃオナニー演説。
0288デフォルトの名無しさんNGNG
プログラマーならカキコでオナニーするんじゃなくて
作品でオナニーすべきだな。
0289デフォルトの名無しさんNGNG
プログラマーならオナニーはしない。
0290デフォルトの名無しさんNGNG
マーはニーしる!
0291デフォルトの名無しさんNGNG
ぶっちゃけ、特定のハードウェアを限定するようなOSなど、真のOSではない。
ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。

x86限定のOSなんて作るくらいなら、WindowsかFreeUNIXで十分だ。
0292デフォルトの名無しさんNGNG
>x86限定のOSなんて作るくらいなら、WindowsかFreeUNIXで十分だ。
きっと作る事に意味があるんだよ。
ゲームだって、しょぼくても作るとたのしいじゃん
0293デフォルトの名無しさんNGNG
>>291
それがJavaや.NET。   などといってみるテスト。
0294デフォルトの名無しさんNGNG
>>293
たぶん、それは違う
0295デフォルトの名無しさんNGNG
>>291
つまり、x86、Alpha、68、PowerPC、Sparc、
SH-3/4、ARM、V30 でも動くようにしろと。
0296デフォルトの名無しさんNGNG
ひげぽんさんがんばってなー
そのうち、すげーへなちょこでいいから公開してや。
個人的にはDOSがいいなぁ。一枚ね。
くっだらねぇのでいいからゲームとかつけちゃってさ。
オセロとか、もうこの際数字あてゲームでもいいや。
シェルもあるんだかないんだか、suujigameとexitしか受け付けない
みたいなね。
もう起動してから5分位であきちゃうのよ。
でもなんかね、
お、ひげぽんのOSちゃんと動くじゃん、みたいなね。
極端な話、そんなんでもいいと思うのよね、俺。
OSなんてとても作れそうにない俺にはきっとうらやまスィーのよね。
0297デフォルトの名無しさんNGNG
>>252

(1)-(3) PC/AT,PC-98xx,X68kに関して言えば、yes.
0298デフォルトの名無しさんNGNG
>>296
それはOSなのかと小一時間問いたい。
小学校に直起動のゲームがあったけどどっちかといえばそれに似てるな。
0299デフォルトの名無しさんNGNG
>>298
うーむ。それもそうだな・・。
まぁひげぽんさんの話ぶりだと
理想みたいなものはあるんだろうからして
そこまで極端ではないだろうけどね・・
0300デフォルトの名無しさんNGNG
>>292
おれはユーティリティ作る方が燃えるけどな。
システムを完全に、俺好みの方法でコントロール下においてやるぜグハハハハ。
って感じで。
0301デフォルトの名無しさんNGNG
>>293
Javaは実行環境。
.netはMS独自仕様プロトコル。戦略的にはRFC無視の方向で逝きたいんだろうな。
0302デフォルトの名無しさんNGNG
おれは足回りを作るのが好き

I/O直叩き、デバドラ作成は楽しいよ
最近ディスク周りとかがマイブーム

USBはターゲットもホストも簡単すぎてつまんない
0303デフォルトの名無しさんNGNG
>>302
すげー。いろいろ教えて欲しいよ。
あのさぁ、PCMCIAのドライバとかも作れる?
0304デフォルトの名無しさんNGNG
まあ煽りはほっときましょう
どこのスレにも蛆のようにわいてくるんだから。
0305デフォルトの名無しさんNGNG
>>302
そんなあなたに1394
0306デフォルトの名無しさんNGNG
PCMCIAはPCIやISAをいじった人なら全然難しくないよ
というかそのあたりを学ぶ過程で必ず
PCMCIAは難しくないというのを知るし。
1394は手元に資料が何も無いんでパス。
つーか流行ると思わなかったから何も勉強してないし・・・
0307デフォルトの名無しさんNGNG
めちゃくちゃおもしれーじゃねーか
c++の勉強してんのにハードの勉強させんなよ(笑)

俺もOSつくりてー
でもまずはc++(笑)
23か、若いなぁ...俺今18だけど23でそれできるかなぁ...
頑張ってくださいsageながら見守ります
0308デフォルトの名無しさんNGNG
>>306
デバイスドライバの作り方の説明って、要約すると
「init と open と close 作りなさい」って感じじゃん?それはまあ分かるんよ。
でも、実際に目の前にPCカードが一枚あってそのドライバがネットには
いくら探しても無くて、自分で作るより他に手は無いってなったときに、
具体的にどうやってその init やら open やらを作ればいいの?
当然メーカーのウェブページに細かい仕様が載ってるわけでもなし、
どのIOポート(でいいのかな?)にどんなデータ送るとどんな風に反応するか
分からなくて、、、。
そういう情報はどっから手に入れる?
0309デフォルトの名無しさんNGNG
基本的にボードメーカは何も知らないフリをするから要注意。
すべてチップから想像するって感じ。
まず、とりあえずダメ元でメーカに電話。
平行してgoogleで全言語で検索。(日本語には情報はまず無い)
さらに似たようなチップを使ってるデバイスの
Linux(*BSD)のソースを見る。で、使えそうなら丸パクリ。
月刊インターフェイスのバックナンバーは捨てずにとっとく。
0310デフォルトの名無しさんNGNG
WinのドライバはよくわからんけどLinuxのドライバは
作りがバカみたいに単純(だから弊害も多いけど)。
NIC関連のソースはひじょーに勉強になったね。
0311デフォルトの名無しさんNGNG
って、OSからかけ離れてるな・・・
OSの華はやっぱりスケジューリングとメモリ管理だよね。
ファイルシステムも面白いけど、2の次だよね。
0312デフォルトの名無しさんNGNG
>>309
そっか。やっぱドライバ作る奴ぁすげーな。俺にはとても出来そうにない。
0313デフォルトの名無しさんNGNG
グラフィックスもだろう
0314ひげぽんNGNG
>(1)フロッピーディスクからブートする場合、
>  ディスクの最初のセクタにあるコードが実行される。
>(2)(1)で実行されたコードがさらに、フロッピーディスク上の
>  他のコードを起動することで
>OS本体を呼び出すことが出来る
>(3)(1)(2)が正しいと仮定して、
>あるCPUを載せた、PCがあるとする。
>そのPC上でスタティックコンパイルすることにより作成された
>バイナリ実行イメージがある。(例えばHELLO WORLDプログラム)
>  上記バイナリイメージをフロッピーディスク上に配置し、
>(1)(2)の手順でそのバイナリイメージを呼び出し実行することが出来る。
>>297
ありがとう。
ひげぽんの当面の目標は(3)かな
0315ひげぽんNGNG
>ぶっちゃけ、特定のハードウェアを限定するようなOSなど、真のOSではない。
>ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
>
>>291
私も同意見です。
ただし、1からこれを実現するのは難しいと思います。
ある程度メジャーなハードウェア環境で動くOSを作ることからはじめて、
あとで他の環境でも動くように移植すればいいと思っています。
もちろん出来るだけハードウェア依存する部分は少なくすることは心がけます。

0316ひげぽんNGNG
>>296
ありがとう。
296さんもあきらめず。作ってみては?
0317デフォルトの名無しさんNGNG
お〜おもしれ〜じゃん。俺も参戦するぜ!
で、例えばフロッピーからブートして"helloworldプログラム"表示させるのにファイルシステムを
作らなきゃダメなんですか?
0318デフォルトの名無しさんNGNG
CSH読み込んでLBA算出すればファイルシステム何ぞイラン。
0319デフォルトの名無しさんNGNG
じゃあみんなで手分けしてやろうぜ。漏れ helloworld担当でいいすか?(汗
0320デフォルトの名無しさんNGNG
javaで書けない部分とはアセンブラオンリーの部分を除いて具体的にどこなのだ。
0321デフォルトの名無しさんNGNG
なぜそんなにJAVA、JAVA言うんだい?
0322デフォルトの名無しさんNGNG
javavm
0323デフォルトの名無しさんNGNG
>>291
ハードウェアってどの範囲を指してんだ ? プロセッサの種別か ? 使ってるバス
のアーキテクチュアか ? ここら辺を特定しないで...
> ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
なんて言ってる奴は、多分真の厨房だろうな。
そう言う目的のOSと言うものもあるだろうし、ちょっとしたハードウェアの違い
を吸収すると言う目的は理解できるけど、ちゃんとやろうとすると苦労多くして益
なしになるのがオチ。極端な話、スーパーコンピュータから携帯電話まで同じOS
が走ると思う ? (そりゃ極端過ぎるよと言うかも知れんが、J○va なんてそれに
近いことほざいてたんだから。UCSD P-Machine の時代から誰もが考えて、誰も
成功していない課題だよ。) それに多くの場合、そう言うハードウェアの違いを
吸収するのはOSじゃなくてデバイスドライバ。だから、対象ハードウェアを増
やすには基本的に人海戦術しかないよ。はっきり言ってそんなことに労力を使う
のは、無駄だし「ひげぽん」が大金持ちでもない限りむり。普通のPCできちん
と動くOSを作るべし。
0324デフォルトの名無しさんNGNG
そうそう、理想論だけで現実的な線での妥協と言う物を知らないのが困る。
0325デフォルトの名無しさんNGNG
x86 AT が基準でイイがあまりべったりだと移植性に乏しくなるってことじゃん。

実際に対応するかどうかは別問題。
0326デフォルトの名無しさんNGNG
>>315
始めにプログラム向けの仕様を決めておいて、それからハードウェアを合わせていくって
手もあるかもよ。
理想的な環境をイメージしておいて、それを実現するためにハードウェアに近い部分
を構築するって感じで。
ファンクションコールで欲しい物をリストして、それをハードウェア仕様に合わせて
実現させればいい。手順も統一してあると嬉しいな。

>>323
まぁ、パフォーマンスは激悪になるだろうね。
これは仕方ないと思う。
だけど、プログラムやOSの移植性は抜群に良くなる。
0327デフォルトの名無しさんNGNG
>>323
スーパーコンピュータから携帯電話まで、同じライブラリが使えると嬉しいな。(w
一回コンパイルしとけば依存関係を気にしなくていい。
0328327NGNG
まぁ、OSと言うよりVMに近いかな。
OSとVMを統合して一歩進めた形だな。究極のOS環境。
0329デフォルトの名無しさんNGNG
>>328
そんなもん、ハードウェアが一つの規格に統一されれるほうが
利用者(プログラマ)側としては究極だろ。
0330327NGNG
>>329
統一されるわけねーだろ。(w
0331デフォルトの名無しさんNGNG
>>327
いったいそれをどのような目的のために使うというのだ。

PCにつまれるx86系CPUにとって得意な処理もあれば苦手な処理もある。
あとROM,RAM等のハード資源を無視して強引にOSを作ってもまるで意味が無い。
0332デフォルトの名無しさんNGNG
>>330
それを言ったらOSだって統一されるわけねーし、
実装依存で余計に苦しむ場面も多々出てくるよ。
0333327NGNG
ハードウェアってのはどうしても、物理世界の壁に直面する。
電源容量、ノイズ、媒体特性、製造コスト、こういうのがある限り、ハードウェア
を統一しようというのは無理。
だから、そのために、OSと言う物が存在している。
だけど、今のOSは、特定のCPUに依存しがち。
だから、CPU依存をできるだけ廃したOSがあれば、かなり良いと思う。
パフォーマンスは多少悪くなっても、まぁ、最近のCPU性能ならOld Pentiumクラス
で動かしたWindowsと同等の性能程度で実現可能だろう。
リアルタイム性も持たせれば、クリティカルな処理以外は全く問題なくなる。
クリティカルな処理は、Network経由でCPUサーバが処理するようにするとか、
分散オブジェクトをサポートすればいい。
0334327NGNG
>>331
まぁ、どうだろ。
初歩的な関数から作ってみて、徐々に拡張してみては。
0335327NGNG
目的は・・・作者次第じゃねーの?
0336327NGNG
>>332
OSは統一されるべき。
だけど、アプリケーションソフトは統一されるべきではない。

基本は統一されるべきだが、応用は自由に発展すべき。
0337デフォルトの名無しさんNGNG
>>336
なんで ? OSだって単なるプログラムだよ。「バカッ速いけど、メモリー保護な
んてかったるくってやってられねーよ。」というOSや、ひたすらユーザーイン
ターフェースに凝りまくるOS。「ハードが死んでも、俺は実行を続けるぜ。」
と言うフォールトレランスなOS。いろいろあっていいんじゃないの ?
なんか、OSを特別なプログラムみたいに思ってない ?
0338デフォルトの名無しさんNGNG
じゃあOSつくるよかライブラリとかクラスライブラリとか
環境とか作った方が手っ取り早いね。
0339デフォルトの名無しさんNGNG
「ハードが死んでも、俺は実行を続けるぜ。」

カコ(・∀・)イイ!!
0340デフォルトの名無しさんNGNG
OSを"単なる"プログラムって言ってのけるあたり厨入ってるな。
明らかに特別なプログラムだろ?
0341デフォルトの名無しさんNGNG
>>340
日本語勉強してから物言え在日
0342デフォルトの名無しさんNGNG
>>340
>>337 の主張は「いろいろあっていいんじゃないの?」って部分なんだが、、
どうでもいい所にちょっかいだしてどうするんだ?
0343デフォルトの名無しさんNGNG
>>341,342
そんなことでageんなよ…
ひげぽん氏はどうした?
0344デフォルトの名無しさんNGNG
まぁ、色々バージョンがあるのは良いんだけど、このOSでは文字列の扱いがまちまち
だとか、基本的なファンクションコールの呼び方がまちまちだとか、プログラマ泣かせ
の状況は、本来OSという存在を作った意図から外れてる。
BIOSと何ら変わらないよ。
この状況で良いんだったら、CPUベンダかチップセットベンダがROM焼きなり、
ハードコーディングして出せば良いんだ。OSなんて要らないね。

と言ってみる。
0345デフォルトの名無しさんNGNG
マイコン用のOSってどうよ?HOSとか
0346デフォルトの名無しさんNGNG
いや、もうTRON最高
0347日本語おかしいので、訂正と追加NGNG
まぁ、色々バージョンがあるのは良いんだけど、文字列の扱いがまちまちだとか、
基本的なファンクションコールの呼び方がまちまちだとか、処理系のbit数で計算結果
が変わるとか、こういうというプログラマ泣かせの状況は、本来OSという存在を作った
意図から外れてる。
この状況で良いんだったら、BIOSと何ら変わらないよ。CPUベンダかチップセットベンダが
ROM焼きなり、ハードコーディングして出せば良いんだ。OSなんて要らないね。
単に、BIOSより使いやすいBIOSでしかない。



と言ってみる。
0348ひげぽんNGNG
初めて読む486でアセンブラを勉強中です。
しばしお待ちください。
0349 NGNG
C言語でかけばそれをどんな環境でも
その環境でコンパイルすれば使えるって入門書に書いてあったのですが
どうですか?
0350デフォルトの名無しさんNGNG
コンパイラがあればな
0351デフォルトの名無しさんNGNG
>>349
コンパイラが存在するのと、
プログラムで使ったライブラリ関数が全く同じ外部仕様で提供されていること。
他にも、ビッグインディアン/リトルインディアンの違いでハマったり、
intのサイズが違ったり、数えればキリがない。

そんなえーかげんなことを書いている本は捨てちゃいなさい。
0352デフォルトの名無しさんNGNG
>>347
そうだね。このスレ中途半端な知識の展覧会って感じだな。
どんなOSがお望みなんだい?OSの設計はそれからだろ?
このスレまだ何も生んでないな…
0353デフォルトの名無しさんNGNG
ライブラリとかもっと上の層で対応した方が楽だし速いし柔軟じゃん。

なぜわざわざ一番下から…
0354デフォルトの名無しさんNGNG
>>351
まぁ、『入門書』だから。
難しいことは無視して平易に多少間違いも含みつつ書いてあるんだろ。
間違いを知るのも良い勉強になるし。


>>352
とりあえず、『OSの目的』が無いと始まらないんだよな。
UNIXは『ゲームを動かしたいんだ』って動機があったし、
Windowsは『PC/ATで動くMacが欲しかったんだ』って動機がある。

とりあえず『どういうのが欲しいのか』が無いとね。
0355デフォルトの名無しさんNGNG
>>344
文字列の扱いぐらいCの標準関数でも十分汎用性があるが。

本来のOSの役目とは共通のCPUで動くアプリケーションが個別に作成し
呼び出していたI/O、メモリブロックの確保(ヒープ)等に対して
共通のインターフェースを提供するというもの。
これがいわゆるシステムコールというやつだ。
あんたが言ってるのは理想論であり、大企業が作っているにもかかわらず
未だに使える次元で実現していないVMと同じ物を作るということである。
結果としてCPUのパフォーマンスに支障をきたすOSではいらない物となる。
少しでもOSのコードを見たことがある人なら知っていると思うが
速度を上げるために内部は関数ポインタの塊である。


0356デフォルトの名無しさんNGNG
>>353
Just for fun.
0357デフォルトの名無しさんNGNG
>>355
>文字列の扱いぐらいCの標準関数でも十分汎用性があるが。
そうかい?

あ
を一文字出したいんだけど、MS-DOS(英語版)で。


言語レベルでは仕様までは規定してないよ。
システム環境を規定しているのは実質的にOS。
0358デフォルトの名無しさんNGNG
あ〜あまた始まった…
0359デフォルトの名無しさんNGNG
ノイマン型のコンピュータの講釈をするのは知識不足でアレだけど、
基礎的な事に限って言えば、処理装置と記憶装置等の5大装置があれば良い。

ハードウェアでこれを実現するか、概ねソフトウェアでハードウェアは基礎的な
部分にとどめるかは好きにして良いんだよ。
OSが提供するメモリをCPUのMMUでやろうとすれば、高速だがCPUによって変わる。
OSが独自にMMUを構築すれば、低速だがCPUが変わろうが動作する。

そういうことなんだよ。
0360デフォルトの名無しさんNGNG
ひげぽん氏よ、もう少し方向性を明確にしたらどうだい?
でないと、不明瞭なまま話がどんどん広がってめちゃくちゃになってしまうよ
0361デフォルトの名無しさんNGNG
>>357
おいおい、それを実現するのはOSじゃないよ。
普通は言語サブセットだったり、他のOS配下にあるモジュールだって。
0362デフォルトの名無しさんNGNG
>>360
あのさぁ、おまえらが勝手に持ち上げているだけで、
ひげぽんは「とりあえず」習作としてOSを作って「みたい」というだけだろ
いきなり仕様がどうだって話してもしょうがない。
0363デフォルトの名無しさんNGNG
>>357
あんたが言っているのは<stdio.h>。
俺が言ってるのは<string.h>。
printf等は出力が絡むのでOSのwiteを使うことになる。
文字列の連結、評価であれば問題ない。
OSが無くても使える。実際使っている。
あとmath.hもつかえる。
0364242NGNG
ひげぽん氏は、いろいろな意味で偉いな。
がんばってくれ。

>>252に関してだけど。
プログラムがシステムコールを使っていても、(3)のようになるのかな?
システムコールってのはOSへのサービスの要求だよね。

あ、特に返レスは不要だけどね。
0365デフォルトの名無しさんNGNG
>>361
おいおい。
OSの定義わかって話してる?

あんたが言ってるのはカーネルだよ。
0366デフォルトの名無しさんNGNG
>>357
内部表現と外部表現の違いについて小一時間勉強してこい
0367デフォルトの名無しさんNGNG
>>363
OSの話してるの。

別に、C言語の仕様じゃ文字列の扱いについて規定してない。
”あ”が文字コードの何番かであるかも規定してない。
0368デフォルトの名無しさんNGNG
OS非標準のコンソールドライバかもしれん(w
0369デフォルトの名無しさんNGNG
>>366
それは関係ないな。
文字列のテーブルを管理してるのはOS。C言語じゃない。

OSの基礎を小一時間勉強しろよ。(w
0370デフォルトの名無しさんNGNG
http://www.reactos.com/
0371デフォルトの名無しさんNGNG
で、1はx86用カーネル組みたいの?
0372デフォルトの名無しさんNGNG
>>369
だから、文字列ってなんだよ?
パスカル文字列とか、Cの文字列とか
それこそ、アプリケーション定義による独自の文字列とかがあって、
OSが規定するべき物じゃない。
0373@NGNG
OSよりもオープンソースのゲームって出来ない?
0374372NGNG
>”あ”が文字コードの何番かであるかも規定してない

この場合、OSが規定しているのは文字列ではなく、キャラクタセットじゃん。
0375デフォルトの名無しさんNGNG
どんな文字でもゴリゴリ描いちまえば俺の勝ち
0376デフォルトの名無しさんNGNG
>>372
ああ。文字、文字。
0377デフォルトの名無しさんNGNG
DOSはキャラクターセットの定義と$で終わる文字列のコンソール出力のファンクションリクエストを提供していますが。
0378デフォルトの名無しさんNGNG
>>734
キャラクタセット=文字セット
0379デフォルトの名無しさんNGNG
>>373
nethackとかそうじゃないっけ?
0380372NGNG
>>378
文字セットでも良いけど、文字セットは文字列じゃないぞ
0381デフォルトの名無しさんNGNG
上の言い争いが全部自作自演だたら(・∀・)ワラエル!!
0382デフォルトの名無しさんNGNG
拘泥
0383デフォルトの名無しさんNGNG
>>367
そんな事ぐらい判っているが。

M$がシフトJISでUNIXはEUCが標準文字コードだろ。
俺が言いたいのはつまりC言語でで'A'とすればそれはどんな処理系でも
文字コードは別にしろAとして扱われるということだ。
そんなことよりOSとして重要な機能は入出力機器への共通の抽象化された
命令やnew,malloc等でのメモリブロックの確保だと思うのが。
別にどうでもいいので俺は上げない。
0384デフォルトの名無しさんNGNG
なんかOSとは「どうあるべき」っていう人と
「どうやって作るの」っていう人が戦ったるみたい。

個人的には、ここで必要なのは「どうやって作るの」の意見が重要そうな気がする・・・
0385デフォルトの名無しさんNGNG
>>383
あ? 標準がShift_JISだったUNIXもあるし、最近だとUTF-8つーこともあるが?
インストール時に選択できるとかな。
0386デフォルトの名無しさんNGNG
>>252 のことを x86 でやろうとしたら、「バイナリ実行イメージ」てのはどうやって作るんでつか?
NE とか PE、MZ、ELF じゃダメっすよね?いわゆる com 形式でいいんでつか?
0387デフォルトの名無しさんNGNG
COM形式で良い。
16bitコンパイラとかで実行ファイルを作り、
exe2binとかでバイナリイメージにして書き込む。
プロテクトモードへの移行はローダーがやってもいいし、お好きにどうぞ。
0388デフォルトの名無しさんNGNG
通りすがりで申し訳ないが、
なんでOSのスレで文字列とかで争ってるんだろう・・・?

ちなみに俺は >>311 に同意。
タスク(プロセス)をどうやって実現しているか、というのは
なかなか面白いと思う。
0389デフォルトの名無しさんNGNG
>>387 thx 今度やってみます。
あと、全くライブラリ使っていなければオブジェクトフェイルのままでもOKでつか?
0390デフォルトの名無しさんNGNG
>>389
ダメ。
オブジェクトファイルが実行可能イメージである保証はないし。
0391デフォルトの名無しさんNGNG
>>390 そうでしたか、、ども。
0392デフォルトの名無しさんNGNG
32bitコンパイラはつかえないんでつか?
0393デフォルトの名無しさんNGNG
使えない
0394デフォルトの名無しさんNGNG
昔、S-OSというOSモドキがあったの覚えてます?

あれすごく面白かったよね
0395デフォルトの名無しさんNGNG
それじゃあ32bitOSはどうやって動いてるんですか?

1.まず16bit実行ファイルを起動
2.16bit実行ファイルが32bit実行ファイルのための環境を整える
3.32bit実行ファイルが起動
4.32bit実行ファイルが32bitOSのための環境を整える
5.32bitOSが起動

?

はっ、これが「ぶーとしーくぇんす」というやつでは・・・
0396デフォルトの名無しさんNGNG
>>395
0397デフォルトの名無しさんNGNG
>>394
Oh!MZ?だっけ?
0398デフォルトの名無しさんNGNG
>>340
> 明らかに特別なプログラムだろ?
素人さんかな ? だったら、黙ってた方がいいよ。
0399デフォルトの名無しさんNGNG
>>398
そんなの蒸し返すなよ...
0400デフォルトの名無しさんNGNG
>>395
x86の場合、16bitのモードから32bitモードに切り替えるんじゃなかったっけ?
途中で。DOSでもWindowsでも動くようになってるはず。
リアルモードとか仮想86モードとかそういう複雑な構成だった気がする。
元々、x86って、MS製OSを前提にしてる設計だからなぁ。
WINTEL同盟以降、MSの要求を受けてCPU設計してるらしいし。


32bitリアルモードで初期化するにはどうしたら良いんだろ?

0401デフォルトの名無しさんNGNG
32bitリアルモードってなに?
0402デフォルトの名無しさんNGNG
(・∀・)シラン
0403デフォルトの名無しさんNGNG
protected: (・∀・)mode!!
0404デフォルトの名無しさんNGNG
何でプロテクトやねん!!
0405デフォルトの名無しさんNGNG
(・∀・)シラン
0406デフォルトの名無しさんNGNG
メモリ保護って事か?

Windowsカーネルは保護されてねーじゃん。どういうことだよ。
0407デフォルトの名無しさんNGNG
(・∀・)シラン
0408デフォルトの名無しさんNGNG
(゚Д゚)ハア?
0409デフォルトの名無しさんNGNG
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
0410デフォルトの名無しさんNGNG
つまり、Windowsはx86を使いこなせてないという事で良いですね。
0411仕様書無しさんNGNG
>>410
セグメントを殆ど使ってないLinuxよりはWindowsの方が386の
機能を活用してるように思うけど、どうなんだろう?
0412デフォルトの名無しさんNGNG
安定しないで数時間で落ちるOSと、安定してて数十日はもつOSと、どっちが良い?
0413デフォルトの名無しさんNGNG
安定してて数百日はもつOS
0414デフォルトの名無しさんNGNG
>>411
なぜそこでlinuxが出てくるのか小一時間
0415デフォルトの名無しさんNGNG
49日毎に確実に落ちるOSと、うまくいけば数百日持つけどハード
が何も使えないOS、どちらが良い?
0416デフォルトの名無しさんNGNG
>>413
FreeBSDなら98日という記録をマークすますた。
0417デフォルトの名無しさんNGNG
>>415
不正な処理で49日持たないわなな
0418暴走すますたNGNG
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
・・・
0419デフォルトの名無しさんNGNG
>>415
49日があるのはWindows95だけだっけ?
NT系は大丈夫だっけ?
どちらにしろ9x系はだめだね。
NT系がいいよ。2000ならハードもかなり使えるし。
0420デフォルトの名無しさんNGNG
DOSはマイクロカーネル
0421デフォルトの名無しさんNGNG
ケンタッキーフライドチキンを食いたくなった。
0422デフォルトの名無しさんNGNG
>>419
カーネル保護されてねーOSが49日持つかよ。
どうせ、PRO串とかDNSとかWINSとかファイルサーバとか限定用途なんだろ?

これくらい一台のPentium PCで出来るはずの事だぞ。
「おい!サーバが、サーバが盗まれたぞ!」
「一台にまとめたんです。何でもできるんですよ。」
0423デフォルトの名無しさんNGNG
>>422
49日の意味知らないだろ。
0424422NGNG
>>423
起動合計時間処理がどうたらとか聞いたなぁ。
興味ないんで突っ込まなかったが。

第一、Windows95系で49日持たせる用途なんてねーし。(w
0425デフォルトの名無しさんNGNG
NT系で十分
0426422NGNG
49day= 1176 hour = 70560 minute = 4233600 second = 4,233,600,000 ms

つー事かい?
0427デフォルトの名無しさんNGNG
人間はOSですか?
0428デフォルトの名無しさんNGNG
win95はパッチがあるよ>49日

パッチ当てても49日も動かさないけど(w
0429ひげぽんNGNG
はじめて読む486
第5章セグメントまで読み終わりました。
とりあえずこれを読めと薦めてくれた人の気持ちが分かりました。
x86系CPUで動くOSを作るうえで必要な基礎知識が書いてありました。

例)
プロテクトモードとリアルモード
レジスタとは?
セグメントとは?
MMUによるアドレス変換と仮想記憶

ただしアセンブリ言語のことは、あまり書かれていないので
これを読んでHello World は書けない・・・

さあ頑張ってHelloWorld 書くぞ。


0430デフォルトの名無しさんNGNG
>>422
> カーネル保護されてねーOSが49日持つかよ。

(゚д゚)ハァ?
0431デフォルトの名無しさんNGNG
初めて読むItanium、蒲池先生書いてくれないかなー
0432デフォルトの名無しさんNGNG
>>429
アセンブラでHello Worldを書こうと思ったら
BIOSの呼び出しかVRAMへの直接書込が必要になる。
これにはアセンブラの知識だけじゃなくて、
ハードウェア(のアーキテクチャ)に固有のBIOSなどの知識が必要。
アセンブラの知識だけならこのスレの最初の方で出ていた
インテルの純正マニュアル(pdf)と各種入門サイトで一通りカバーできる。
BIOSなどについてはFreeDOSのソースを見るといいかも。
0433ひげぽんNGNG
アセンブラ環境をとりあえず整えてみました。
OS:WindowsXP Pro
エディタ:Meadow 1.14
アセンブラ:nasm for win32
リンカ:alink

上記環境下で、webで拾ってきた↓をアセンブル、リンクしました。
segment code

..start:
;各セグメントなどの初期設定
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,stacktop

;文字列の表示
mov dx,hello
mov ah,09h
int 21h

;終了
mov ax,4c00h
int 21h

segment data
hello: db 'Hello World',13,10,'$'

segment stack stack
resb 64
stacktop:

実行も成功!

どなたかアセンブリ言語の入門に
最適なサイトを紹介していただけませんか?
0434デフォルトの名無しさんNGNG
アセンブラの入門サイト。

http://www.d1.dion.ne.jp/~ecb/assembler/assembler00.html
http://www.geocities.co.jp/SiliconValley/9979/asmhead.html
0435ひげぽんNGNG
>>432
入れ違いになっちゃいましたね。
BIOS呼び出しとVRAMへの直接書き込みどちらが、
入門者向きでしょうか?
また、メジャーなOSはどちらを選択しているのでしょうか?
0436デフォルトの名無しさんNGNG
>>435
OSを作るなら当然前者ではありえない。
ただ、前者を使ったモジュールもあるべき。
最初は前者で書いて、あとから後者を追加すればいい。
0437俺様のブックマークNGNG
http://www.capricorn.cse.kyutech.ac.jp/~tate/tako/80x86.html
http://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
0438ひげぽんNGNG
>>434
>>437
ありがとう。

>>436
よく考えればその通りですね。
まずは、BIOS経由で挑戦してみます。
0439ひげぽんNGNG
インターフェース 2002 7号に
BIOS版「Hello, World」プログラムの作成という記事
がありました。
フロッピーからブートしてHello, Worldと
出力してみようという内容です。

これだ!と思ったものの。全部GNUツールでやってる・・・
初心者のひげぽんには、これを読み替えて
NASM on Windwosで実践する力がまだありません・・・
もっと勉強しないと。
0440デフォルトの名無しさんNGNG
ここで5年間問いつづけけながらOS作る気か。
くだらん質問する暇があったらまず本を読め
100冊読んでから出直せ。
ネタにしてもつまらん。
0441デフォルトの名無しさんNGNG
FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば
後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
0442デフォルトの名無しさんNGNG
>>440
そんな駄目レスを5年間続けながら
無駄に人生を送るよりは良いんじゃない?
本を読めって?
それはお前だろ
0443デフォルトの名無しさんNGNG
>>440をいじめないでください。
弱い者いじめなんて、男のすることじゃないです。
0444ひげぽんNGNG
>>441
ご迷惑をおかけいたします。
>FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば
>後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
>そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。
現在の状況は、基本となる雛形も無い状態なので
良い意味でマネできる素材があればと思っています。
Webで探しているのですが今のところなかなか良いのが
見つからないです。

勉強の過程を同じような志の人たちにフィードバックできたら
と考えています。
0445今更だが・・・NGNG
>>25-32
・・・
0446タ僕 ◆njaj0FGY NGNG
>>444
それならSunriseOSがオススメ。
ソースがべらぼうに読みやすい。
0447デフォルトの名無しさんNGNG
>>444
ソース読め馬鹿
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
>>447
は無視していきましょう。
0450デフォルトの名無しさんNGNG
>>1
は無視していきましょう。
0451デフォルトの名無しさんNGNG
447=450
はきっと寂しいんだよ。
みんな相手してあげて。
0452457(!=450)NGNG
つか、まじめにスレ読もうとしたおれから言わせてもらうと、
うざいんですけど。

何で検索しないの?
質問の方が答えるの早いから?

なめとるよ。
0453デフォルトの名無しさんNGNG
>>452
ひげぽんが結構教えて君なのは確かだな。
が、指摘された参考図書に実際に取り組んでいるし
テストコードも書いたりしているから前向きではある。
もうちょっとなま暖かい目で見守ってやっていい。
0454デフォルトの名無しさんNGNG
457??
0455デフォルトの名無しさんNGNG
発言予告だろ、とマジレスの振りをしてみるテスト。
0456デフォルトの名無しさんNGNG
>>453
教えて君ていうか自作自演君では...
0457デフォルトの名無しさんNGNG
ひげぽん結構がんばってるじゃん。
よく見ると質問もWebで検索して見つかる種類ではない場合が多い
と思うんだけど。
>>252
とかそんな感じじゃん。
勉強した上で出てきた疑問質問なら良いと思うよ。


0458デフォルトの名無しさんNGNG
linuxとかのソースとか。
0459デフォルトの名無しさんNGNG
>>457
知ってる事しか質問してないように見える.
0460ひげぽんNGNG
私の質問と、質問の仕方によりご迷惑をおかけいたしております。

以後以下のことに気をつけます。
・今でも十分調べてから、質問をしていますが
WEBで調べて分かるものは、自分で調べます。
・自分で調べたものについても、出来る限り
ここに書き込むようにします。

どうぞよろしくお願いいたします。
0461デフォルトの名無しさんNGNG
>>460
あまり気にしなくていいと思ワレ
気にせず、いいOSをツクテクレ
0462デフォルトの名無しさんNGNG
>>452
ウザイと思ったら、来ないでね。言いたいのは、ただそれだけ。
0463ひげぽんNGNG
>>446
446さん。
遅くなりましたが、ありがとうございます。
実際にSunriseOS http://www.geocities.com/sunriseos/ を
フロッピーからブートしてみました。

アセンブラもNASM用に書かれているので大変参考になります。
しばらくはこのソースを研究いたします。

0464デフォルトの名無しさんNGNG
>>460
ココはOSを作ろうとする人のための質問スレなんだから何でも聞いて良いんじゃない?
オープンに何でも話そうよ。
0465デフォルトの名無しさんNGNG
文字出力するだけでもVGAを叩かなくちゃいけないんですか?
0466デフォルトの名無しさんNGNG
ひげぽんが出てこないと妄想君が議論始めるから
ひげぽんは気軽に出てくるように。
0467デフォルトの名無しさんNGNG
たまに出てきてね
0468デフォルトの名無しさんNGNG
うん、次は4年後だね
0469デフォルトの名無しさんNGNG
>>465
BIOS叩いてもできるけど結局同じこと。
0470デフォルトの名無しさんNGNG
http://ise-city.no-ip.com/~foo/
↑これひげぽん?
0471デフォルトの名無しさんNGNG
>>436 を読むとBIOSを使うのはあまり良くないようだけど何故なの?
0472デフォルトの名無しさんNGNG
>>471
PCのBIOSはプロテクトモードから呼び出せないし再入可能でもない。
リアルモードで動くシングルタスクのOS以外からは使い物にならんよ。
0473デフォルトの名無しさんNGNG
>>472
目から鱗が落ちますた。
0474デフォルトの名無しさんNGNG
>>472
ちょっとまて。
そうかといって本格的にOS作り始めたとき山のようにドライバ書かなくちゃならなくなるんじゃ?
BIOS叩いてやれば少なくともドライバがないから画面真っ黒とかいうことにはならんと思うが。
0475デフォルトの名無しさんNGNG
なにをいまさら
0476デフォルトの名無しさんNGNG
>>474
たうぜん
0477デフォルトの名無しさんNGNG
まいくろかーねるにしようぜ。いい加減。
0478ひげぽんNGNG
SunriseOSのソースを眺めてちょっとずつ勉強しています。
とりあえず自分なりにコメントを付加してみました。
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ひげぽんNGNG


start:
;setup the stack
;we can't allow interrupts while we setup the stack

cli ;disable interrupt ■外部割込みを禁止する
mov ax,0x9000 ;put stack at 0x9000 ■汎用レジスタに0x9000をセットする
mov ss,ax ;ss=9000 ■セグメントレジスタ(スタックセグメント)にaxの値をセットする
mov sp,0 ;sp=0000 ■スタックポインタに0をセットする
sti ;enable interrupt ■外部割込みを可能にする

;remember the bootdrive information

mov [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする

;load the kernel

call load ;■コードラベルloadを実行

;jump to the loaded program

mov ax,0x1000 ;■axに0x1000をセット
mov es,ax ;■esにaxをセット
mov ds,ax ;■dsにaxをセット
push ax ;■スタックaxをpush
mov ax,0 ;■axに0をセット
push ax ;■スタックからaxをpop
retf ;■呼び出し元に戻る
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デフォルトの名無しさんNGNG
大学でOSの作成経験あり↓
http://pc.2ch.net/test/read.cgi/tech/1025441630/116
0483ひげぽんNGNG
ソースのレイアウトがくずれてしまいました.
0484デフォルトの名無しさん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
スタックはss:spになる。
それだけだろ?
0488デフォルトの名無しさんNGNG
>>485
はじめて読む486の最後の方の命令セット一覧見てご覧よ。
セグメントレジスタに即値を mov できないでそ。
0489ひげぽんNGNG
>>487
ありがとう
axを介しているのはなぜでしょうか?
cli
mov ss, 0x9000
mov sp, 0
sti
で良い様に見えるのですが何か理由があるのでしょうか。
0490ひげぽんNGNG
>>488
・・・すいません入れ違いになりました。
ありがとう。
0491デフォルトの名無しさんNGNG
うーん、ひげぴん、がんばってるなぁ
0492デフォルトの名無しさんNGNG
一般的に、
i++ ; // iに1足す。
みたいなコメントは、かな〜り逝ってよしです。
0493デフォルトの名無しさんNGNG
とりあえず、アセンブラ初心者はそれで良いんじゃないの?
レジスタの名前は決まっちゃってるんだし、コメントがあっても邪魔じゃないだろ
0494デフォルトの名無しさんNGNG
アセンブラはそれこそ

mov ax,0x9000
mov ss,ax

の様に1つの動作を2〜3の命令の組み合わせで表す事があるから

mov ax,0x9000 ; ssに0x9000を
mov ss,ax ; 入れる

みたいに、その動作単位でコメントを入れると良いかも。
0495デフォルトの名無しさんNGNG
0x9000 って数には何か意味がある? 単にメモリの後の方って事?
0496デフォルトの名無しさんNGNG
>>495
ss:spが9000:0000なのでスタックは9000:ffffから使われる。
つまり640KBのケツ。
0497デフォルトの名無しさんNGNG
ページ違反で落ちないの?
0498ひげぽんNGNG
>;remember the bootdrive information
>
>mov   [bootdrv],dl  ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする
作者のコメントを見るとブートドライブの情報を記憶とあるが
dlには、ブートドライブ情報が元から入っているのでしょうか?

>;load the kernel
>
>call  load      ;■コードラベルloadを実行
ここはOK

以後loadラベルに進みます。
0499ひげぽんNGNG
>;load kernel from bootdrive
>
>load:
>    ;reset the diskdrives
>
>    push  ds       ;store DS    ■データセグメントの値をスタックへpush
このデータセグメントには何らかの値が入っていて、それを保持するために
スタックにpushしていると思うのですが、いったい何が入っているのでしょうか?


>    mov   ax,0      ;select function ■汎用レジスタaxに0をセット
ここは本当に意味が分からないです、axに0をセットしているものの、
これ以降どこかでつかっていないように見えるのですが。。。


>    mov   dl,[bootdrv]  ;drive to reset ■データレジスタに変数bootdrvの値をセット
>    int   13h       ;reset      ■13hの割り込み処理を行う13h?
13h割り込み処理の定義は、どこかで調べればわかると思うので保留。


>    pop   ds       ;restore DS   ■スタックからpop
>    jc   load      ;failed try again■キャリーフラグ?が1のときにラベルへジャンプ
kernelのloadが失敗している間はずっとループする???

0500デフォルトの名無しさんNGNG
>ここは本当に意味が分からないです、axに0をセットしているものの、
>これ以降どこかでつかっていないように見えるのですが。。。

int13hでつかってるんだろ。
0501デフォルトの名無しさんNGNG
>>500さん、すてき!
天才。まじで。
0502ひげぽんNGNG
>>500 さん
ありがとう。
これをヒントにいまint 13hを調べております
0503ひげぽんNGNG
とりあえずこんなの見つけました。
INT (16進数) 説明
10 ビデオサービス
11 実装されているハードウェアリスト取得
12 メモリサイズ取得
13 低レベルディスクサービス
14 シリアルポートサービス
15 (予約:さまざまな用途に使われる)
16 キーボードサービス
17 プリンタサービス
18 ROM BASIC 起動
19 リブート
1A システムタイム取得
1B CTRL - BREAK ハンドラ
1C システムチックカウントタイマー
1D システムデータ (ビデオパラメータテーブル)
1E システムデータ (ディスクパラメータ)
1F システムデータ (8 x 8 グラフィックフォント)
0504500NGNG
つーかな、
http://www.cse.iitd.ernet.in/~csu98123/old/home/learn/os/nasmBoot.html
くらいはすぐに見つかるだろ。
0505!ひげぽんNGNG
>>504 500さん、あなたは英雄です。
すごすぎます。
0506ひげぽんNGNG
>>504
ありがとうございます。
int,13h,axをキーワードにWebをさまよっていました。

ということでまとめると
load:
    ;reset the diskdrives

    push  ds       ;store DS    ■データセグメントの値をスタックへpush
    mov   ax,0      ;select function ■ディスクを
    mov   dl,[bootdrv]  ;drive to reset ■リセット
    int   13h       ;reset      ■する
    pop   ds       ;restore DS   ■スタックからpop
    jc   load      ;failed try again■キャリーフラグ?が1のときにラベルへジャンプ
0507デフォルトの名無しさんNGNG
ひげぽん応援あげ

(・∀・)っ コレドーゾ http://www.ctyme.com/intr/int-13.htm
0508デフォルトの名無しさんNGNG
あと 「Ralf Brown interrupt」 でぐぐれば↑の内容がアーカイブ化
されててDL出来るようになってるとこが見つかると思う。
0509デフォルトの名無しさんNGNG
>>507 >>508
ひげぽんさんじゃないけど、ありがとう。
このスレは勉強になります。
0510デフォルトの名無しさんNGNG
はじめて読む486のサポートページ
念のため。

http://www.ascii.co.jp/books/support/apc/4-7561-0213-1.html
0511デフォルトの名無しさんNGNG
調子はどうだひげぽん
ローダくらいはできたか
0512ひげぽんNGNG
>>507 >>508 >>510
ありがとう。
はじめて読む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
start:
    ;setup the stack
    ;we can't allow interrupts while we setup the stack

    cli              ;disable interrupt   ■外部割込みを禁止する
    mov    ax,0x9000 ;put stack at 0x9000 ■スタックを
    mov    ss,ax     ;ss=9000             ■9000:0000に
    mov    sp,0      ;sp=0000             ■設定する
    sti              ;enable interrupt    ■外部割込みを可能にする

    ;remember the bootdrive information

    mov    [bootdrv],dl ;■変数boodrvに汎用レジスタ(データレジスタ)dlの値をセットする

    ;load the kernel

    call    load        ;■コードラベルloadを実行
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
>>511
もう一息です、がんばります。

0519ひげぽんNGNG
疑問なのですが、
load:ラベル部分でディスクをリセットしています(int 13h,0)
なぜdsの値をいったんスタックに退避しているのでしょうか?
ご紹介いただいた
http://www.ctyme.com/intr/rb-0605.htm
を見る限りでは、dsの値が書き換わることはなさそうなのですが。


0520デフォルトの名無しさんNGNG
>>512
ひげぽんあんたはすごいよ。
まじで。
0521デフォルトの名無しさんNGNG
>>512
> 半角空白を&nbsp;で置き換えるしかないのでしょうか?
全角スペースで置き換える方が簡単だと思います。
0522ひげぽんNGNG
>>521
ちょうど追加分があるのでやってみます

times 512-($-$$)-2 db 0  ;■nasmにファイルサイズが512byteであることを教える
        dw  0AA55h       ;■ブートストラップの最後の2byteは0AA55hがセットされていなければならない
0523デフォルトの名無しさんNGNG
ひげぽんがんばれage!!!
参考になればどうぞ。
>最後のブートシグニチャは必ずマジックナンバーと呼ばれる0xAA55という値が
>入っています。この値が入っていないとマスターブートレコード自体が
>無効なものとして扱われ、BIOSによってはブートストラップローダが
>実行されませんし、パーティションテーブルも読み込まれません。
>つまりこのマスターブートレコードが正当なものであることを保証する署名(シグニチャ)です。
0524デフォルトの名無しさんNGNG
>>823はひげぽん以下という罠。
0525デフォルトの名無しさんNGNG
○ >>523
× >>823
0526デフォルトの名無しさんNGNG
>>524
え?どういうこと
0527デフォルトの名無しさんNGNG
>>526
お前、すぐ上の >>522 ぐらいみろよ。

> dw 0AA55h ;■ブートストラップの最後の2byteは0AA55hがセットされ
>       ていなければならない

バカ丸出しだぞ。
0528ひげぽんNGNG
>>523
ありがとう。
詳しい説明たすかります。
0529デフォルトの名無しさんNGNG
だんだんとひげぽんが成長するにつれ、
疑問に答えられるやつがいなくなってきたね。
オレモナー
0530デフォルトの名無しさんNGNG
>>90
MS-DOSみたいなのを作ればいいんじゃないかな。
なんか、話が発展しすぎてるけど。GUIとかJAVAは当分先だろう。
個人的には、GPLなLinuxよりもBSDをベースにして欲しい。
フロッピー1枚に収まるBSDとか探して、ソース見てみれば?
CUIで低機能でも、個人が作ったOSならば是非とも触ってみたい。
0531530NGNG
なんじゃこりゃ。
こんなにレスあったんか。
鬱だ・・・氏んできます。
0532デフォルトの名無しさんNGNG
ひげぽん以外を応援あげ。

みんな、性格がよく(煽りに乗らず、くだらんレスにもお礼を言う)、
勤勉で(会社から帰っての1、2時間を勉強にあてている)、
頭のいい(短期間でかなりの進歩を見せている)、
そんなひげぽんなんかに負けるな。

性格がゆがんでて、怠惰で、頭の悪い2チャンネラの底力を見せてみろ。
0533デフォルトの名無しさんNGNG
(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと
たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
0534デフォルトの名無しさんNGNG
>>532
頭が悪いのはあなただけです。
0535デフォルトの名無しさんNGNG
オレ質問いいっすか?>>514 なんだけど、一番最初で、割り込みを禁止して
ss:sp を設定したら、またすぐ割り込み許可してるじゃん。
でも、まだ、割り込みベクタを初期化してるわけでもないし、
割り込みが発生したときに実行されるべきルーチンもロードされてないわけじゃん。
そんな状況で割り込み許可なんてしちゃって良いの?
そんなとき割り込みが発生したらどうなるの?

あと >>515 でひげぽんは retf の説明を「呼び出し元に戻る」と書いているけど
本当はそうじゃないのは分かってるよね? いや念のため確認したかっただけっす。
0536デフォルトの名無しさんNGNG
>535
あれ?リアルモードの割り込みベクタは、0:0〜0:1000までに存在してて
ベクタ初期化はBIOSがやってくれてて、ルーチンも、UMAのどっかに
BIOS ROMとして用意されていたはず。
#でないとint13hとか、int 09hとかで大問題になるはず……
0537デフォルトの名無しさんNGNG
まちがい。0:0〜0:400
0538まぁ、どうでも良いけどNGNG
>>533
おれは、だから仕様をと、、、
0539デフォルトの名無しさんNGNG
>>535
ブートローダに制御が渡る前にBIOSが設定してる。
0540デフォルトの名無しさんNGNG
>>516 int 13h のコメントが「成功した場合キャリフラグが1になる」 になってますけど、これは「失敗した場合」ですよね? つまり 成功するまで同じ処理を繰り返す、と。
0541ひげぽんNGNG
>>533
>(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと
>たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.
その通りです、まずは取っ掛かりですね。ブートローダーがきちんと作れれば
一応先に進めるんで・・・
まずは動く物を作りたいっす。

>>535 >>536 >>537 >>539
私の思いつかない疑問と、その回答ありがとうございます。
BIOSってさまさまですね。
割り込みルーチンが無かったら確かにえらいことですよね。

>>540
間違いでした。すいません。

0542ひげぽんNGNG
誤 BIOSってさまさまですね
正 BIOSさまさまですね
0543デフォルトの名無しさんNGNG
>>541
>>535の最後の質問への回答きぼん。
0544ひげぽんNGNG
>>535
失礼しました。
あまり考えずに進んだところに罠が・・・
確かに呼び出し元に戻るっていうのはどう考えてもおかしいですね。

ret:call命令でコールされたサブルーチンから復帰する。
と同等のものとの認識でした。

以下
http://members.tripod.co.jp/guriponn/others/japanise/chapter7.txt
より引用

(*) コードセグメントが一つ(tiny,small,compactモデル)の時は、関数は

nearです。つまり、関数の引数がデータセグメントに置かれるかスタ

ックに詰まれた時の関数のポインタは16 bitsの長さのオフセットと

言う事です。(CSレジスタはその値を永遠に変更せずいつでも全ての関

数のアドレスを返します。)そして関数は普通のnearの`CALL'で呼び出

され、`RETN'を用いて関数へ戻ります。(NASMでは、`RETN'と`RET'を同

義語として扱います。)つまり、あなたが自分のルーチンを書く時に、

関数へ戻るには`RETN'を使い、外的な(externの)Cのルーチンを呼び出

すときにはnearの`CALL'を使わねばならないと言う事です。



(*) コードセグメントが1つ以上(medium,large,hugeモデル)の時は、関数は

farです。つまり、関数のポインタは32 bitsの長さと言う事です。(16-

bitのオフセットと16-bitのセグメントで処理される)そして、`CALL FAR'

(または`CALL seg:offset')で呼び出され、`RETF'で関数に戻ります。も

う一度繰り返しますが、従ってあなたが自分のルーチンを書くときに関

数へ戻るには`RETF'を用いて関数へ戻り、`CALL FAR'で外的な(extern

の)Cのルーチンを呼び出すのです。
引用ここまで

良く分からないです。

0545ひげぽんNGNG
CALL FAR で呼び出されているのは何でしょうか?
0546デフォルトの名無しさんNGNG
スタックに0x1000:0000を積んで、そのアドレスにretfで戻る(飛ぶ)。
retだから呼び出し元に戻るという考えは捨てよ
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
retfだけじゃなくてretn(ret)もスタックの一番上から
アドレスを取り出してそこにジャンプする命令
0549デフォルトの名無しさんNGNG
>>544
なんでこのページは第7章しかないの?
はじめから見てみたい。
目次の場所教えて。
0550デフォルトの名無しさんNGNG
archive.orgへ逝け
0551ひげぽんNGNG
そろそろ自分でソースを書きそうなのですが
アセンブラのソースって、どういうインデントが良いのかなあ。
コメントは、日本語英語どっちがいいんだろう。
PJ名(仮称)はどうしよう。
0552デフォルトの名無しさんNGNG
>コメントは、日本語英語どっちがいいんだろう。
本気なら英語のほうが良い。
でも2chでは日本語のほうが良いかも。

PJ名は、2chとかどうよ?
0553デフォルトの名無しさんNGNG
>>552 本気なら英語のほうが良い。
根拠は?
0554デフォルトの名無しさんNGNG
日本人以外の奴等とオープンソースで開発するならばという意味です。
英語圏のやつらでなくても、日本語よりはましかと・・・
0555デフォルトの名無しさんNGNG
英語のほうがいいかも。
今のところひげぽんは本気っぽいからね。
プログラム板の猛者も、立ち上がるかもしれん。

PJ名(仮称) higeponOSでいいんじゃない?
0556デフォルトの名無しさんNGNG
はっきり言ってガイジンと開発はだめすぎ
クズOSじゃガイジンは見向きもしないし、
良いOSになりそうだったらそれは日本人の手柄でありたいと思うがどうよ?
0557デフォルトの名無しさんNGNG
英語のメリット
日本人以外のやつにとって敷居が低くなる
英語のデメリット
日本人にとって読みにくい。
いんちき英語コメントになる可能性がある。

日本語のメリット
日本人にとって非常に読みやすい。
日本語のデメリット
日本語はマイナー言語である。
0558デフォルトの名無しさんNGNG
技術以外の話題になるとみんなとたんに元気になるね。
0559デフォルトの名無しさんNGNG
いいじゃん。
少しでも貢献したいんだよ。
純粋に。
0560ひげぽんNGNG
アセンブラのインデントはemacsのasm-modeに準じることにしました

コメントは、どうしましょう。
一応良いOSを作るつもりなので、
英語のほうが良いのでしょうか?
0561デフォルトの名無しさんNGNG
つもりって…
死ぬほど無謀だな
0562デフォルトの名無しさんNGNG
ひげぽん期待age!
2ch発信のOSをつくれり。
0563デフォルトの名無しさんNGNG
オープンソースにしてsourceforgeにプロジェクト登録はどうか?
ttp://sourceforge.jp/

容量無制限かつcgi可のHPスペースとか、MLとかが無料で利用できるし、
何よりも新規プロジェクトに飢えてるから、本家よりも軽快だし。
0564デフォルトの名無しさんNGNG
>>559
単にブートローダーの話がつまらないだけだと思われ。

アプリケーションプログラマには関係ないし。
0565デフォルトの名無しさんNGNG
日本語はUTF-8だのSJISだのEUCだのの変換が面倒かもな。
0566デフォルトの名無しさんNGNG
せっかくだからUCS4ネイティブで行きましょう。
0567ひげぽんNGNG
>>565
コメントは英語で行くことにしました。
いんちき英語にならぬよう祈るのみです。

>>555
引き続き名前募集です。

>>563
それは良いかもしれませんね。
骨格部分が出来て公開できる段階になったら
sourceforgeにいくかも!!
0568デフォルトの名無しさんNGNG
ttp://sourceforge.jp/projects/hos/
こんな感じ?こっちは組み込みOSだけど。
0569デフォルトの名無しさんNGNG
OSのデベロッパーってすごいな
0570ひげぽんNGNG
>>568
見てみました。
なんだか見ているだけでやる気が出てきます(笑)
やはり複数人で開発すると楽しそうですね。
0571デフォルトの名無しさんNGNG
>>568
HOSって、パトレイバーか?(w
0572デフォルトの名無しさんNGNG
>>571
作者がファンだから、あやかってるらしい。
0573デフォルトの名無しさんNGNG
http://lkh.linux.or.jp/24kernel/source/html4/boot.html
0574デフォルトの名無しさんNGNG
>>573
俺はあんたを愛してしまいそうだ。
0575デフォルトの名無しさんNGNG
お前らUNIX Magazine 7月号の特集は読みましたか?
なかなか、参考になるぞ。















っと言おうと思ったが、>>573 の方が詳しい罠
0576デフォルトの名無しさんNGNG
>>575
おーい。あんまり変なスペース入れなよ。俺様の大事なスレなんだから。(w
ウニクスマガジンの特集って白崎博生さんのだよね。
5月から読んでるけど、俺、これが楽しみでしょうがない。
(俺はウイン屋だから、こういう雑誌見たことなかった。)

ページ数を3倍増くらいしてがむばってほしい。>>白崎さん
って、2チャンなんか見てないかな。
0577ひげぽんNGNG
>>573
貴重な情報サンクス!
ブート部はgasで書かれているようですが、
参考になります。

昨晩は、bochs(x86エミュレータ)を入れていろいろ実験していました。
かなり便利ですね。
アセンブル→ブートテストのサイクルが同じマシン上ですぐ出来る!

0578デフォルトの名無しさんNGNG
PC のブートの勉強用としてはこんなのもある。
ttp://www.rbt.his.fukui-u.ac.jp/~naniwa/comp/OS/

GPL。μITRON 上に POSIX API を実装したという珍品。しかも純和製。
ドキュメントが少ないので勉強用としては今一つかな。カーネル本体は
複雑で訳わからんが、ブート部 (eota/sfsboot, eota/boot 以下) は比
較的すっきりしている。eota/boot は gas と C で書かれていて、
eota/sfsboot 以下はそれを nasm と C で書き換えて拡張したようだ。
Bochs でも動いた。

参考になるかな。
0579ひげぽんNGNG
>>578 さん
ありがとう。
nasmで書かれたbootソースというだけでも
大変助かります。

Bochs等お詳しそうですね。
今後もアドバイス頂けるとうれしいです。
0580578NGNG
単なるマイナー OS オタなのでアドバイスは無理っぽい。
0581ひげぽんNGNG
>>580
では、580さんに目をつけてもらえるようになったら
マイナーOSの仲間入りですね(笑)
早くそうなるようにがんばります。
0582ひげぽん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
>>584
'Hello!' の後ろに、00h がないからじゃないの ? アセンブラは、C みた
いに "ABC" で 00h は付加してくれないよ。
Intel 系のアセンブラは良くわかんないけど...
msg db 'Hello!', 00h
とか書けばいいのでは ?
0586デフォルトの名無しさんNGNG
>>584
msg db 'Hello!' を
msg db 'Hello!$'
cmp al, 0 を
cmp al ,'$' にしてみては?
0587586NGNG
わーだぶっちゃったごめんなさい
0588ひげぽん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ひげぽんNGNG
>>585 586
thanks!!
これで結構すっきりかけたと思います。
0590585NGNG
>>586
なんか懐かしい。そう言えば、Intel 系って文字列のターミネータが何故
か '$' だったよね。Motorola 派 (流派かよ!!) としては、結構不思議
でした。

>>589
ひげんぽん一歩前進、おめでとう。俺がついていけるのは、このあたりま
でだけど、がむばってね。
0591ひげぽんNGNG
>>585
本当にありがとう。
おかげさまで、ちょっとだけ前に進みました。

次の目標は、
フロッピーの最初の512byte以降のプログラムを読み込めるように
することです。
0592デフォルトの名無しさんNGNG
>>590
文字列のターミネータが$なのはMS-DOSのシステムコールの仕様。

このスレ見てたらなんか作りたくなってきた…(w
0593ひげぽんNGNG
>>592
>このスレ見てたらなんか作りたくなってきた…(w
作りましょう。
ぜひ・・・
0594デフォルトの名無しさんNGNG
ひげぽん期待age
有言実行すばらしい。
0595デフォルトの名無しさんNGNG
ひげぽん素晴らしい。
漏れもOSとまではいかないでもハードウェアとアセンブラの勉強を
兼ねてOSもどきを作ろうとか思ってたけどまだ、何もはじめてない…
水戸黄門の歌みたいだ…♪後から来たのに追い越され〜
鬱…
0596590NGNG
>>592
ちょっと惜しい。CP/M からだよ。固定文字列なら、いいんだけどカーソル位置
指定なんかで動的に文字列生成する時に、たまたま '$' が生成されてはまった
事あり。
と言うように、優れていない仕様でもとにかく具体的に動くものがあるとなんか
萌える。そう言う意味で、>>588 みたいにソースを適時出すのはいいことだと
思う。ひげぽんがむば。
0597592NGNG
>>596
Intel系って80系も含めて言ってたわけね。
なんかアホみたいだ、俺。

ってことで、mingw32とnasmをインストール。
0598592NGNG
Technical Documents Related to Bochs
http://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デフォルトの名無しさんNGNG
7c0h:startはseg:offの形式だっつーの。
0601デフォルトの名無しさんNGNG
cs=dsとはコードとデータが同一セグメントにあると言うこと。
vcのリンカ設定で言うなら、/merge:.data=.textってことサ
0602ひげぽんNGNG
ありがとうございます。

>>600
jmp 07C0した時点で、セグメントアドレスが決まるのか?
もともとセグメントアドレスは、07COだったのでしょうか?

>>601
なるほど。
コードとデータが同一セグメントであることを指定しない場合、
どういう扱いになるのでしょうか?


該当部分をコメントアウトすると、実行しても文字列が
表示されませんでした。
0603デフォルトの名無しさんNGNG
>>602
プログラムの先頭に来た時点 (=jmp 命令実行直前) で CS (コードセグメント
レジスタ) と IP (命令ポインタ/プログラムカウンタ) は、各々 0x0000 と
0x7c00 になっている。(インターフェース誌7月号 P.68 参照のこと)

それで、この jmp 命令で CS に 0x7c00 を入れて IP に Start ラベルの
オフセットを入れる。

msg 等のラベルも全て 0x07c0 セグメント内でのオフセットとなっているから
DS (データセグメントレジスタ) は、0x07c0 を入れておく必要がある。
(そう言う意味では、mov es, ax は不要。)

> コードとデータが同一セグメントであることを指定しない場合、
> どういう扱いになるのでしょうか?
その時の DS が示す値 (正確には × 16 して) に msg のオフセットを加えた
所から文字列を持ってこようとする。(要は、変な DS の値を元にアクセスする
アドレスを計算するため、変な場所から無理矢理データを持ってこようとする。)

ちなみに、SS (スタックセグメントレジスタ) と SP (スタックポインタ) も
設定しておいた方が良いと思う。(インターフェース誌, P.70, リスト1〜2参
照のこと)
0604デフォルトの名無しさんNGNG
いんたーふぇーすかってこよ
0605デフォルトの名無しさんNGNG
org 0
jmp 0x07c0よりも
org 0x7c00としたほうがds,esにcsをセットしなくてよくてお徳なんじゃないですか?
0606デフォルトの名無しさんNGNG
そんなことはない。
raw binaryの実行イメージだから、セグメントの設定は行ってくれない。
0607デフォルトの名無しさんNGNG
そうなんですか?orgとdsを0x7c00と0x07c0の組合わせで試してみてだめだったので、
dsの設定をはずしてみたら正しく動いたのですが、これはなにか別なところで問題が
あることが考えられるのでしょうか?
0608ひげぽんNGNG
>>603
603さんの解説とインターフェース誌を総合すると
jmp 0x07C0:startの替わりに
jmp startとした場合には、コードセグメントは0のままである。

その場合は、セグメント0のオフセットアドレス0x7C00のところへ
ブートプログラムがロードされてしまう。
するとセグメント0がブートプログラムによって分断されてしまうので
よろしくないということですよね。

ところがjmp 0x7C0:startとすると
ブートプログラムは、セグメント0x7C0の先頭の場所へロードされる。
↑
ここが分かりません。
BIOSはブートプログラム512byteを物理メモリのあるアドレスに読み込み,
CPUはそのアドレスへジャンプし、実行すると思うのですが
なぜセグメント0x7C0を指定するセグメントの先頭にブートプログラムが
ロードされているかが分からないです。
0609デフォルトの名無しさんNGNG
ロードされる物理メモリの場所は一定。

far jmpではCSの値も変更できるから、07c0:0000にロードされると見ることが出来るわけ。
07c0:0000 と 0000:7c00は物理的には同じアドレスを指してるってコトをよぉく理解しよう。
0610ひげぽんNGNG
>>609さん
ありがとう。
少ない頭で、ただいま考え中です。
0611609NGNG
まぁ、segment:offsetの概念ってなかなか理解しがたいものがあるしね…

物理アドレス = segment * 16 + offset

つまり、同じアドレスを示すsegとoffの組み合わせが何通りもあるという事。
利点としては、「64k以下のプログラムなら何処にでもロードできる」と理解しておくのがいいかも。


以上の話は「リアルモード」でしか通用しないので注意。
プロテクトモードでどーなるのかは、プロテクトモードに入れる段階になったら考えればよし。
0612ひげぽんNGNG
>>609さん
1セグメントのサイズは必ず64KBであり、物理メモリを64KBずつに
区分けしたものがセグメントだと思っていたので混乱していました。

結局ブートプログラムは、
リニアアドレス = 0x7C00に
ロードされているのですね。

そこでセグメントレジスタを07C0にセットするとセグメントの先頭ということもあり
非常に都合が良いと。

ブートプログラムが開始されてjmpした以降は、
07C0のセグメントの中でのお話になるという事ですね。

はじめて読む486の125ページにCSレジスタの役割が書いてありました・・・

↑
日本語が変ですが、609さんのおかげで分かってきました。
0613609NGNG
正解。
0614ひげぽんNGNG
>>609さんに大感謝!!!!

ちょっと欲を出してマクロまで使ってみました。
ディスクリセットまで実現!!


;-------------------------------------------------------------------------------
; Name        : higeboot.asm
; Description : boot from floppy disk and echo "Hello 2ch!!"
; Revision    : $Revision: 1.3 $
; Copyright (c) 2002 HigePon
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; Name        : PRINTSTR
; Description : print string
; Param1      : string(db)
;-------------------------------------------------------------------------------
%macro PRINTSTR 1
        mov si, %1
%%hige:
        lodsb                   ; set al=current character at si
        cmp al, 0               ; if al == 0 then
        je  %%end               ; end this macro
        mov ah, 0Eh             ; print
        mov bh, 0               ; the charcter which is
        int 10h                 ; at al
        jmp %%hige              ; next character
%%end:
%endmacro
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
>>609さんのおかげにより
ディスクリセットまでこぎつけました。

次は、ディスクの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
>>616
それは取り敢えずリアルモードのまま?
0619デフォルトの名無しさんNGNG
>>616
まだプロテクトモードに入ってないから、
32bitコンパイラは使えないよ。

16bitコンパイラでバイナリを生成した後にexe2bin汁。
MSのexe2binは.com形式のためにorg100扱いで実行ファイルを生成した鴨
0620デフォルトの名無しさんNGNG
>>617
yep
0621609NGNG
>>617
>なら jmp 07c0h:start をしなくても ok って事?
OKかもしれないけど…
…よく分かりません…


jmp offsetってのはIPにoffsetを代入。
jmp segment:offsetってのはIPにoffset、CSにsegmentを代入です。
0622ひげぽんNGNG
>>618
>>619
何も考えていませんでした。
とりあえずプロテクトモードに入ったと仮定しての
お話でお願いします。
(プロテクトモードへの移行は一応はじめての486に記述があるので
いけそうだと踏んでいます。)

アセンブラとCのつなぎの部分とかが全然分かっていない状態です。
どういう環境で、どういう手順を踏んだら良いかすら分かっていないです。
0623デフォルトの名無しさんNGNG
アセンブラとCの繋ぎなんて関係ない。
メモリ上にロードしてエントリポイントのアドレスへjmpするだけだから。
#場合によっては環境の設定をしてから。
0624ひげぽんNGNG
Cでソースを書く(インラインアセンブラを含む??)
→どのライブラリ、関数が使用可能かということが分からない

コンパイラでコンパイル
→どのコンパイラ(もしくは特別なコンパイルオプション)をつかえば
良いかが分からない。

コンパイル済みのバイナリをそのままディスクに書き込めばよいのか?

もう分からないこと尽くしです、
どなたか、取っ掛かりだけでも教えてもらえないでしょうか?
0625デフォルトの名無しさんNGNG
1 コンパイラ依存だし、ライブラリのソースが無い物の場合、
 自分で調べられないなら全部作る必要がある。
 まぁ、string.hくらいは使えるかもね

2 世に出ている16bitのコンパイラで、OS固有のヘッダ領域を除去可能なツールが使える物。

2 ディスクに書き込んでも良いし、ファイルシステムに保存しても良いけど、
 後者の場合は自前で読み込むか、FSサブシステムをロードしておく必要がある。
0626デフォルトの名無しさんNGNG
ていうか、ローダーの時点でさっさとプロテクトモードに移行して、
そこから実行するのが吉かと。
0627609NGNG
果たしてあれだけの処理が512バイトに収まるかという問題も有る気が…

一旦リアルモード -> プロテクトモードにいく16BitプログラムをCで作って
exe2bin(exeヘッダを取り除く)して、それをディスクのブートセクタ以降に配置
とかの方がいいかも。

確かexe2binしたプログラムのエントリポイントは普通0だった気がするから、
セグメントの先頭に配置してやれば動くはず。
0628デフォルトの名無しさんNGNG
>>627
MS-DOSの.com形式は256バイトのPSP領域を勝手にOSが用意するから、
ORG 100hのバイナリが生成されたと思うけど?
0629デフォルトの名無しさんNGNG
別に32bitコンパイラでも使う即値が16bit以下ならリアルモードでも動かせるんじゃなかったっけ?
0630609NGNG

exdebのマニュアルからコピペ。

;"""""""""""""""""""""""""""""""""""""""
; .EXE ファイル・ヘッダー
; .EXE File Header
;"""""""""""""""""""""""""""""""""""""""

EXH

Offset Size Name Description
00h 2 BYTEs exe_ID ;'MZ'または'ZM'
02h WORD last_page_byte ;最終ページ内のバイト数
04h WORD file_page ;ファイルの大きさ(1ページ=512バイト)
06h WORD relocation ;リロケーション数
08h WORD header_size ;ヘッダの大きさ(1パラグラフ=16バイト)
0Ah WORD last_byte_min ;プログラムの後に必要な最小メモリ(パラグラフ)
0Ch WORD last_byte_max ;プログラムの後に必要な最大メモリ(パラグラフ)
0Eh WORD SS_inital ;SSの初期値
10h WORD SP_inital ;SPの初期値
12h WORD head_chk_sum ;チェックサム
14h WORD IP_inital ;IPの初期値         <= ここの値
16h WORD CS_inital ;CSの初期値
18h WORD reloc_tbl_off ;リロケーションテーブルのオフセット
1Ah WORD overlay_no ;オーバレイ番号
1Ch WORD reloc_table ;リロケーション情報

ここの値が幾つかによるわけだ..
0631ひげぽんNGNG
>>625,626,609,628さん
ありがとうございます。
プロテクトモード移行後であれば32bitコンパイラが
使えるということですね。

ブートプログラム内または、ブートセクタ以降でプロテクトモードに移行
すればよいのですね。

お勧めな環境とかってありますか?
こういうのってどこで調べればよいのでしょうか。
キーワードが悪いのか全然だめです。


0632まだ分からない奴NGNG
話題が映っているのに恐縮ですが、、
609さん
>>621 の最後の2行は「教科書的意味」でそうなるのは分かりますが、
厳密にそうなるのでしょうか?
今オレは nasm を試せないのですが、 linuxの as86(いわゆる gas だと思う)
で↓をアセンブルすると、
jmp L1
jmp L1
L1:jmp L1
jmp 0x07c0:L1

出力されるコードが、
eb 02 eb 00 eb fe ea 04 00 c0 07
となります。つまり最初の6バイトに関しては eb が jmp 命令で
その後の1バイトが相対アドレスだと思います。
(負の数を2の補数で表している)
つまり、機械語レベルでは代入ではなく加算なのではないでしょうか?

一方最後の5バイトは ea が jmp 命令で 続く4バイトでジャンプ先の
絶対アドレスを指定しているので文字どおり代入が行われているとおもいます。

以上をまとめると、jmp off は相対アドレスジャンプで jmp seg:off は絶対アドレスジャンプ
になり、だからこそ>>480 とかは自分が読みこまれている場所を意識しなくても
上手く言ったと思うのですが、、

あと、微かな記憶ですが、 jmp off でも -128 から 127 に入り切らない場合は
絶対アドレスジャンプの命令に置き換わっていた気がしますが、、
0633609NGNG
>>632
ザッツライトです(汗
私の言っていることが不正確でした。

jmpがどのジャンプかはアセンブラがかってに判断してくれるみたいですね…
普通にアセンブラで書くときは即値かオフセットなのかは全然気にしてなかったもんで..

MASMとかTASMはかってに絶対アドレス命令に置き換えてくれます。

(知ったかぶり口調は自制するです…スマソ
0634デフォルトの名無しさんNGNG
おいおい。
ひげぽんがしらぬまにまた成長している・・・

0635592NGNG
>>632
shortは8bit相対ジャンプ
nearは16bit相対ジャンプ
farは32bit(seg:off)絶対ジャンプ。

リアルモードでプリフィックスなしではこうなるはず。
0636デフォルトの名無しさんNGNG
おれも知りたいコンパイラ。
0637ひげぽんNGNG
OS開発環境を整えるページを見つけました。
http://www.osdev.org/developers/guide01/

ただし、gccとnasmの組み合わせが多いですね。
Windows環境でいけるのが、みつからない・・・
0638デフォルトの名無しさんNGNG
もちろんこれから作るOSは操作でわからないことがあると
幼女声で答えてくれたり気紛れな態度を取ってくれる萌えOSなんだろうな?
0639デフォルトの名無しさんNGNG
>>638
ひげぽんが喋ります
0640デフォルトの名無しさんNGNG
>>639
それは萌え(w

それ以前に喋らすためにはサウンドドライバ書かなきゃいかんだろ
昔のソフトみたいにBEEPで喋らすのもありだが(藁
0641FreeDOS教徒NGNG
ひげぽんたん‥‥‥ハァハァ(ぉ
0642592NGNG
>>637
gcc(mingw32)もnasmもWin32で動くぞ。
0643デフォルトの名無しさんNGNG
>>637
いくらひげぽんOSがいいものになっても、それを自分でコンパイルするには、
VCとか他の有料アプリを購入しなければ行けないとなればオレ的に萎え〜です。
gccとnasmは萌え〜。
0644デフォルトの名無しさんNGNG
mingwinってどうやって使うの?
使い方がいまいち分かんない。
0645デフォルトの名無しさんNGNG
そもそもそれ何?
0646デフォルトの名無しさんNGNG
MingW32の間違いでした。



MingW32は発音できないから、ミングウィンか、ミングイン、の方が言いやすいなぁ。(ぼそ)
みんぐwは尻切れっぽい感じが・・・。(ぼそぼそ)
0647645NGNG
いや、だからさ、そのMingW32って何なのさ。
おせーて、おせーて、おせーてよ。
0648デフォルトの名無しさんNGNG

なんかこのスレさ。
ひげぽんを中心とするエリート軍団と、俺みたいなオッチー軍団に別れちゃったな。

あーあ。オッチーにも愛の手(やさしい説明)を。
0649デフォルトの名無しさんNGNG
ム板でスレ建てるコテハンに優秀な奴はいないと思ってたけどそうでもないんだな
とひげぽんを見てふと思ひ
0650デフォルトの名無しさんNGNG
>>649
しかもよく読めば単発質問な。
0651デフォルトの名無しさんNGNG
> ム板でスレ建てるコテハンに優秀な奴はいない
誤解だな。正確には
「ム板で単発質問でスレ建てるコテハンに優秀な奴はいない」だ

ここの1は単発質問をしていないので上記の条件には当てはまらない。
0652デフォルトの名無しさんNGNG
>>648
どこが分からない?
0653デフォルトの名無しさんNGNG
FreeDOS教徒たんの開発環境ってどんな感じょ?
0654デフォルトの名無しさんNGNG
WIN32で他のOSの開発環境つながりだから聞いてしまえ!

>>641
FreeDOSカーネルのコンパイルはこのページの説明でできるの?
http://home.interlink.or.jp/~s-nakani/freedos/build.html
0655デフォルトの名無しさんNGNG
>>647
Windows上で動くGCC
GCCはGNU Compiler Collectionの略(になったらしい。前はGNU C Compiler)

Windows上で動くフリーのコンパイラって事らしい。ちなみにGPL。
0656655NGNG
【追加説明】

MinGW: Minimalist GNU For Windows

詳細こちら(英語)
http://www.mingw.org/

tar.gzはいまダウンロード中だけど、どうすれば良いんだ?
ソースっぽいし。
UNIXでコンパイルしてもWindows上で動くのかな?
exe形式になるの?
SJIS通るのかな?
PATH通せばいいだけ?
0657デフォルトの名無しさんNGNG
SJIS通らないよ。

それから、gcc3.1系をばらで落とした方が良いかも知れない
0658デフォルトの名無しさんNGNG
>>656
UNIXでコンパイルすればUNIXでWin32のコードを吐くクロスコンパイラになる。

>>657
別に通らないってことはないだろ。
ただ、特にSJIS対応してないから
// ソ
とか
// 表
とか2バイト目に '\' が入ってると楽しいことになるだけで。
0659デフォルトの名無しさんNGNG
>>658
そういうのは通らないというのだ
0660デフォルトの名無しさんNGNG
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
Latest MinGW-1.0 Snapshot
を解凍して、DOSプロンプトから実行したら動いたよ。
0661デフォルトの名無しさんNGNG
1.0Snapって2.9.4じゃなかった?
3.1落とせって
0662デフォルトの名無しさんNGNG
ああ。ソースフォージに行けばいいのね。最新はここか。
http://sourceforge.net/projects/mingw/

・・・なんか良くわかんないな。
いっぱいファイルあるけど。

っしかし、なんで、日本語なんだ?
クライアントコードページでも参照してるのかな?

CVSもどういう事なんだか良くわかんないし、死にそう。
CVS超わかんねーよ。ヽ( `Д)ノウワァァァァン
ソースフォージどうなってんだよ。ヽ( `Д)ノウワァァァァン
0663デフォルトの名無しさんNGNG
VRAM直接アクセスで画面表示出来たよん。
int13h 使うのと違って画面の左上に"2ch"って上書きしちゃうから
bochs 使うと "2ch bios" ってなって(・∀・)ワラエル!!

-----------------
[ORG 0]

jmp 07C0h:start

start:

hello:
mov ax, 0B800h
mov ds, ax
mov di, 0
mov al, '2'
call print
mov al, 'c'
call print
mov al, 'h'
call print

jmp hang

print:
mov [di],al
add di,2
ret

hang:
jmp hang

times 510-($-$$) db 0
dw 0AA55h
----------------
んじゃ、ひげたんこれからもガムバテネ。
0664デフォルトの名無しさんNGNG
>>662
httpリクエストのAccept-Languageヘッダ見てるだけだと思うが。
0665デフォルトの名無しさんNGNG
http://prdownloads.sourceforge.net/mingw/bunutils-2_12_90-20020518-1.tar.gz?download
http://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っぽいけど何だ?インストールプログラムかな?

バラバラにダウンロードして組み込んでも良いの?
バージョンでおかしくなったりしないのかな?
適当にまとめられてる奴無いのかな。
0667666NGNG
>>665
どうもありがとう。

>Ada/Pascalも欲しければどうぞ
ああ。なるほど。
言語ごとにバラバラしてるわけね。
で、GCCはそれをコントロールしてるって事か。

0668デフォルトの名無しさんNGNG
gcc-coreはc/c++コンパイラも含んでる
0669ひげぽんNGNG
なんだか盛り上がって来てうれしいですね。

今日は仕事の合間に駄目もとでcygwin gccを試していたがだめでした。

それで
http://www.delorie.com/djgpp/
を見つけました。

これもWin上で動くgccらしいです。

でもなんとなく皆さんが紹介してくださった
Mingwのほうがよさげなのでそちらにしようかと思っております。

なんだかそろそろgnu makeをきちんと勉強したほうが良い気が
してきました。必要そうだし。


0670666NGNG
って訳でもないか。
binutilsって何?何かのユーティリティなのかな?
DOS窓だとmanとか無いし、htmlドキュメントをブラウザで開くのかな?

これらの混在環境って良いのか?
バージョンで混乱したりしないのかな?
0671ひげぽんNGNG
>>663
>VRAM直接アクセスで画面表示出来たよん。
それはすごい!!
ありがとう。
今日はちょっと試す時間が無いので
明日試してみます。
>>665
取りまとめありがとう。
利用させてもらいます。

ちなみにNASM&BochsはWin版を使ってます。
0672666NGNG
あり?良いのか。

ああ。良いんだ良いんだ。

release note.txt読めば良かったんだね。

頭混乱してた。恥ずかしいからsage

0673ひげぽんNGNG
>>669
前言撤回Mingwやめました。
DJGPPにしました。

明日はVRAM叩きをまねして、
あとはmakeの勉強。
プロテクトモードへの移行もやらないと

でもなんだか前より増してやる気が出てきた!
会社でこそっとやろう。。。
0674デフォルトの名無しさんNGNG
djgppって32bit DOS extender搭載したDOS用のコンパイラじゃないの?
0675デフォルトの名無しさんNGNG
DOSエクステンダ用のコンパイラなら、
TOWNS用にHigh-Cなんてのを持ってたなぁ....
今はどこかへ行ってしまったが。
0676デフォルトの名無しさんNGNG
メディア、5インチでよければあるよ、High-C
0677ひげぽんNGNG
>>674
以下のようなオプションが使えるので
OS開発に使えるようです。

>-ffreestanding
>produce code that is meant to be run without an OS (ie:kernel code)
>-c
>compile but don't link (creates an object file)
0678デフォルトの名無しさんNGNG
gcc 使う場合リンカは何使うの?
オレ gcc の標準の ld を使おうかと思っているけど
-oformat output-format を何にしたら良いか分からなくて止まってる。
ぐぐっても良く分からないよ〜。
0679ひげぽんNGNG
>>678
試してはいませんが、
OS developer's siteでは、
ld -Ttext 0x100000 --oformat binary -o
ld -o xxx -Ttext 0x0 -e main xxxx.o
のようなものを使っていた。
0680デフォルトの名無しさんNGNG
>>679
(・∀・)ソレダ!!
0681デフォルトの名無しさんNGNG
ちょっと分かった。
windows では分からないけど linux では、
nasm -f elf xxxxx.asm
gcc -c yyyyy.c
ld -oformat binary -Ttext 0x0 -e start xxxxx.o yyyyy.o
こんな感じにすると C とアセンブラのくっついた COMファイル(?)ができる。
つまり、バイナリにヘッダとかなくていきなり実行イメージがきているような奴。

でも、これだと問題点が二つある。
* 最後に AA55 をくっつけることが出来ない。
* C で書いたコードは32bit用コードになっている。

だから、やっぱり最初の512バイトはオールアセンブリで書いて
その中でフロッピーをメモリに読みこんでプロテクトモードにして
それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい。
0682ひげぽんNGNG
>>681
681さん、同じところで悩んでいますよね。

>だから、やっぱり最初の512バイトはオールアセンブリで書いて
>その中でフロッピーをメモリに読みこんでプロテクトモードにして
>それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい
プロテクトモードへの移行の前には、
GDTの設定、ITDRの設定などを行わなければいけないんでよね。
その辺のことは、本に書いてあるのですが。

ブートコードからCでコンパイルした
(bootディスク上にある)実行イメージを呼び出す方法が分からない・・・

(1)実行イメージのサイズがきちんと分かっている場合
ディスクを必要セクタ分読み込めばよいのでしょうか?
  int 13hを使う感じで・・・

(2)アセンブラで出来たブートイメージと、
Cで書いて出来た実行イメージを
ひとつのイメージにまとめて
diskに対して ddコマンド等で書き込んでやればよいのでしょうか?

今日は一日中悩みました。
いろいろ実験したのですが、
Cで実行イメージを作成しようにも、そいつが読み込まれて
動作したかを確認する方法がないっす。
int main() {
}
と空のmainを書けばライブラリに依存しないのでOKかと思ったのだが
動作確認が出来ない(涙)
0683デフォルトの名無しさんNGNG
プロテクトモード移行は 2nd boot でやった方が良さそうな気がして来た。
で、『はじめて読む486』では、MakeSegDesc とかいう関数作ったりして
大がかりだけど、eota の boot/2nd/start16.S とか見ると
ディスクリプタを最初っから直書きしていて、こうした方が楽な気がする。
できれば、『はじめて読む486』のようにC を使って書きたいところだけど、
gcc に 16 bit 用コードを吐きださせる方法が分からないから。
アセンブリ使うしかなさそう。

(1) そうだと思う。
(2) 1st boot でプロテクトモードにするならそれでOKだと思うけど、
2nd boot でプロテクトモードに切り替えるなら2nd boot の先頭はアセンブリの
コードにしておいて(プロテクトモードに切り替えて)そこから C の関数を
呼べば良いと思う。

動作確認は>>663 の VRAM直接アクセスをCで書けば良いと思う。
/boot/2nd/lib.c の write_vram が参考になる。
上手く行かなければ、
int c_func()
{
return 'A';
}
という関数をアセンブリからcallすれば ax に 'A'が入る。それを
アセンブリで画面表示すれば良いと思う。
どうしてもダメならリアルモードに戻してBIOSコールってことになるかな。

0684デフォルトの名無しさんNGNG
プロテクトモード移行は 2nd boot でやった方が良さそうな気がして来た。
で、『はじめて読む486』では、MakeSegDesc とかいう関数作ったりして
大がかりだけど、eota の boot/2nd/start16.S とか見ると
ディスクリプタを最初っから直書きしていて、こうした方が楽な気がする。
できれば、『はじめて読む486』のようにC を使って書きたいところだけど、
gcc に 16 bit 用コードを吐きださせる方法が分からないから。
アセンブリ使うしかなさそう。

(1) そうだと思う。
(2) 1st boot でプロテクトモードにするならそれでOKだと思うけど、
2nd boot でプロテクトモードに切り替えるなら2nd boot の先頭はアセンブリの
コードにしておいて(プロテクトモードに切り替えて)そこから C の関数を
呼べば良いと思う。

動作確認は>>663 の VRAM直接アクセスをCで書けば良いと思う。
/boot/2nd/lib.c の write_vram が参考になる。
上手く行かなければ、
int c_func()
{
return 'A';
}
という関数をアセンブリからcallすれば ax に 'A'が入る。それを
アセンブリで画面表示すれば良いと思う。
どうしてもダメならリアルモードに戻してBIOSコールってことになるかな。
0685684NGNG
死ぬほどミスった。>>683他スマソ
0686デフォルトの名無しさんNGNG
>>682
スタートアップルーチンの存在は知らないんだな。
0687デフォルトの名無しさんNGNG
とりあえず、今後進みやすい道のりは、

step1
1st boot, 2nd bootともにオールアセンブリで、 BIOS を使って "Hello higepon"

step1.5
1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon"

step 2
1st boot, 2nd bootともにオールアセンブリで、2nd bootでプロテクトモードにして
"Hello higepon"(もちろん VRAM アクセス)

step 3
1st boot はオールアセンブリ
2nd boot はアセンブリ+C言語
アセンブリ部分でプロテクトモードにして C の関数を呼び出し
C の関数が "Hello higepon"

step 2.9 ( step 3 がダメだった場合)
C の関数を
char *higepon_string()
{
const static char buf[]="Hello higepon";
return buf;
}
とかしといてそれを アセンブリで表示。

って感じでどう?
step 1 で作った 1st boot はそのままずっと使い、 以後は 2nd boot 部分だけ
書き換えれば良くなるでしょ?
0688デフォルトの名無しさんNGNG
>>686
つまり、普通にコンパイルしたんではスタートアップルーチンがあるから
上手く行かないって言いたい?
0689デフォルトの名無しさんNGNG
あれ?スタートアップルーチンってリンカがつけるもんじゃなかったっけ?
0690デフォルトの名無しさんNGNG
違う
0691デフォルトの名無しさんNGNG
正確に言うとエントリポイント(スタートアップルーチン)を含んだ
オブジェクトファイルやライブラリを、大抵のリンカが暗黙の内にリンクしているだけで、
それを回避するオプションが付いているはず
0692ひげぽんNGNG
>>683,684,687
ありがとう。

>step1.5
>1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon"
を書いてみました。
0693ひげぽんNGNG
boot.mac

;-------------------------------------------------------------------------------
; Name        : PRINTSTR
; Description : print string
; Param1      : string(db)
;-------------------------------------------------------------------------------
%macro PRINTSTR 1
        push ax
        mov  si, %1
%%hige:
        lodsb                   ; set al=current character at si
        cmp al, 0               ; if al == 0 then
        je  %%end               ; end this macro
        mov ah, 0Eh             ; print
        mov bh, 0               ; the charcter which is
        int 10h                 ; at al
        jmp %%hige              ; next character
%%end:
        pop ax
%endmacro
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ひげぽんNGNG
read:
        mov ax, 1000h
        mov es, ax              ; es:bx is
        mov bx, 0               ; data buffer

        mov ah, 02h             ; read sectors into memory
        mov al, 5               ; number of sectors to read
        mov ch, 0               ; low eight bits of cylinder number
        mov cl, 2               ; sector number
        mov dh, 0               ; head number
        mov dl, 0               ; drive number
        int 13h                 ; read!
        jc  read

        jmp 1000h:0000          ; jump to the secondboot

forever:
        jmp forever

        times 510-($-$$) db 0
        dw 0AA55h
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ひげぽんNGNG
>663さんに感謝
0699デフォルトの名無しさんNGNG
ひげぽんさん、サイト作ろうよ
0700デフォルトの名無しさんNGNG
プロテクトモードに移行したあとの次の命令で、Bochsは3rd exeptionって言ってくる
んですがなにが原因なんでしょう?誰か助けてー
0701デフォルトの名無しさんNGNG
/cpu/exception.cppによれば,
---
BX_CPU_THIS_PTR errorno++;
if (BX_CPU_THIS_PTR errorno >= 3) {
BX_PANIC(("exception(): 3rd exception with no resolution"));
BX_ERROR(("WARNING: Any simulation after this point is completely bogus."));
#if BX_DEBUGGER
bx_guard.special_unwind_stack = true;
#endif
return;
}
---

3回目の割り込みは発生しちゃだめって事らしいヨ
0702デフォルトの名無しさんNGNG
>>700
それ俺もなった。で試行錯誤の結果やっと上手くいった。
それ貼るからちょっと待ってて。
0703デフォルトの名無しさんNGNG
3rd exception を発生させずにプロテクトモードに移行できたバージョン 1/2

基本的には、『はじめて(略』に従ったけど、一部変えてある
2nd-boot は俺は 0x0100 セグメントに読みこまれるように
してあるから リニアアドレスに変換する部分では 0x1000 を足している。
もっと上手い方法がありそうだけど分からない。また、『はじめて(略』に
書かれている offset は nasmでは使えなかった。
最初はこのリニアアドレス変換をしていなくて 3rd exception しまくってた。
------------
[ORG 0]

bits16
lgdt[gdtr]

RealToProto
cli
moveax,cr0
oreax,1
movcr0,eax
;;
jmpflush_q1

gdtr:dw256 * 8 -1 ; ここは適当 ( eota に従った )
ddgdt + 0x1000 ; リニアアドレスに変換

gdt:
dw0; limitL
dw0; baseL
db0; baseM
db0; type
db0; limitH
db0; baseH
;; seg-08 (code-seg)
dw0xffff; limitL
dw0; baseL
db0; baseM
db0x9a; type code
db0xcf; limitH
db0; baseH
;; seg-10 (data-seg)
dw0xffff; limitL
dw0; baseL
db0; baseM
db0x92; type data
db0xcf; limitH
db0; baseH
;; seg-18 (stack-seg)
dw0; limitL
dw0; baseL
db0; baseM
db0x96; type data
db0xc0; limitH
db0; baseH
; -------------------- 大きすぎて一度に書き込めないので一度ここで切る。
0704デフォルトの名無しさんNGNG
>>703 の続き
3rd exception を発生させずにプロテクトモードに移行できたバージョン 2/2
------------
bits32

flush_q1:
db0eah
dw set_cs_desc1 + 0x1000 ; リニアアドレスに変換
dw08h ; 08h は code-segment

set_cs_desc1:
moveax,10h ; 10h は data-segment
movds,ax
moves,ax
moveax,18h ; 18h は stack-segment
movss,ax
movesp,0x1000 ; ここが 0 だとなぜかエラー

hello:movedi,0B8000h
moval,'2'
callprint
moval,'c'
callprint
moval,'h'
callprint

hang:
jmphang

printmov[edi],al
addedi,2
ret
times512-($-$$)db 0
0705703=704NGNG
ごめんタブが消えた、、、
0706デフォルトの名無しさんNGNG
>>705
どうもありがとうございました。これから格闘してみます。
ここまではなんとかなりましたが、ここからが厳しいところですね。
頑張りたいと思います
0707ひげぽんNGNG
>>703>>704
ありがとう!!
先を越されてしまってくやしいっす。
勉強不足です。反省。
0708デフォルトの名無しさんNGNG
少なくとも3人は出来るやつがいる模様。(ひげぽんも含む)
お前ら全員で2ch OS作ってください。
0709デフォルトの名無しさんNGNG
もちろん 2ch 運営に最適化されたOSということで (w
0710デフォルトの名無しさんNGNG
運営ですか!!!
0711デフォルトの名無しさんNGNG
作っても夜勤が採用しないワナ。
0712デフォルトの名無しさんNGNG
説得汁。
0713デフォルトの名無しさんNGNG
作れないうちから心配するなアフ
0714デフォルトの名無しさんNGNG
> 704
> movesp,0x1000 ; ここが 0 だとなぜかエラー
0だとスタックに積んだとたんに逝っちゃうよ。
0715デフォルトの名無しさんNGNG
無事動きましたー。csが1000ならアドレスは10000だということを忘れてました。
こんにちはプロテクトモード
0716デフォルトの名無しさんNGNG
割り込みについて調べていたらこんなページをみつけました。
ttp://poli.cs.vsb.cz/misc/rbint/ix/index.html
0717デフォルトの名無しさんNGNG
>>716
>>507-508
確か、ベクターにwinhelp版があったはず。
0718デフォルトの名無しさんNGNG
とりあえず、2ndローダでプロテクトモードに切り替えるところまで成功。
PE形式のカーネルのロードは面倒そうだ…。
0719デフォルトの名無しさんNGNG
皆さんブートローダの次のステップをどのようにする予定ですか?
0720デフォルトの名無しさんNGNG
メモリマネージャとタスクマネージャ
0721デフォルトの名無しさんNGNG
文字出力、ファイルIO、プロセス終了のファンクションリクエストくらいあれば、とりあえずいろいろ動かせる。
0722デフォルトの名無しさんNGNG
>>720
いきなりは無理では。

まず、
1. とりあえず何もしなくていいから、OSを終了するシステムコール(Halt)
2. 1文字ずつコンソールに出力するシステムコール(Input)
3. キーボードから1文字ずつ入力を受け取るシステムコール(Output、後回しで
いいかも)
4. ディスクのセクタを直接指定して読み書きするシステムコール(Read, Write)
5. 特権モードのままでいいし、特定の物理メモリ上でいいし、一つしか実行で
きず、呼び出したタスクに戻ってこなくていいから、ディスクから読み込んだ
バイナリを展開し、実行するシステムコール(Exec)
6. とりあえず何もしなくていいから、タスクを終了するシステムコール(Exit)
を実装し、

ブートローダ
↓
カーネル
↓
文字を表示し、入力を受け取り、特定のセクタの内容を読み込み表示し、特定の
セクタに適当なデータを書込み、終了する、Cで書かれたプログラム

という感じで動作するものを作ってみるのはどうだろう。

そのあとで、ユーザモードで動作し、複数展開可能で、呼び出したタスクに戻って
くるExecを実装し、ユーザモードで動く簡単なコマンドラインシェルを実装する、
というのはどう?
0723722NGNG
>>721
あ、かぶった。

>>722をちょい訂正。

> 2. 1文字ずつコンソールに出力するシステムコール(Input)
> 3. キーボードから1文字ずつ入力を受け取るシステムコール(Output)

名前が逆じゃん、出力がOutputで入力がInputね。
0724デフォルトの名無しさんNGNG
ネイティブな開発はよくわからんが
システムコールの設計は慎重にやってくれよp
0725デフォルトの名無しさんNGNG
>>724
なんで?
0726722NGNG
>>724
別に>>722のシステムコールを最後までそのまま使えって意味じゃないよ。
あくまで暫定的なもの。ファイルシステムがなければ、openやread、write、
close等のファイルに関するシステムコールなんて作れないでしょ?ファイル
システムやメモリマネージャが出来たら、そのときシステムコールを作り
直せばいい。
0727デフォルトの名無しさんNGNG
実務開発で言うなら、いわば技術検証(と言う名のお勉強)でしょ?
まだ設計に入る段階じゃないと思われ。
勿論、先に設計が来る方が良いけど、未経験なんだから良いんじゃないの?
0728724NGNG
だよねーテヘヘぼくちゃん先走っちゃったアハハ
0729ひげぽんNGNG
そのうちlibcを採用しようかと・・・
0730718NGNG
libcなら組込向けのnewlibが扱いやすいかも。

http://sources.redhat.com/newlib/
0731718NGNG
OSに依存しないドライバインターフェース…らしい。

Uniform Driver Interface
http://www.projectudi.org/
0732718NGNG
ELF関連

FreeBSDの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
いま、 eota の boot/2nd/console.c とか boot/2nd/lib.c あたりを
読んでる。lib.c の set_cursor_pos が、こんな感じになってる。
-------------------------
void
set_cursor_pos (int x, int y)
{
int addr;

lock ();
addr = CURSOR_POS (x, y);
/* addr *= 2; */

outb (GDC_ADDR, 0x0e);
outb (GDC_DATA, (addr >> 8) & 0xff);
outb (GDC_ADDR, 0x0f);
outb (GDC_DATA, addr & 0xff);
unlock ();
}
-----------------------
lock(), unlock は各々 cli,sti を実行するだけ。

で質問だけど、
(1) こんな風に IO ポートのどこに何を書けばどうなるのか、
ってのはどっかにまとめて載ってない?

(2) なんでここで割り込みを禁止する必要があるの?
まあ漠然とは、
outb(GDC_ADDR,xxxx) と outb(GDC_DATA,xxxx) の間に
余計なIO ポートアクセスがあったらまずい気がするなぁと感じるけど
それであってる?
0734718NGNG
mingwでld --helpしたらelf32-i386とか出てたからELFバイナリ吐けると思ったらダメらしい。
素直にPEにしておくか。

>>733
(1)
http://www.oadg.or.jp/tosho/index.htm#techref

(2)
vsync割り込みハンドラでグラフィックコントローラを叩く可能性を考えてるのかと。
0735デフォルトの名無しさんNGNG
>>722
かなり賛成。ちょうど良い目標ダネ。
ただちょっと分からなかったんだけど >>722 の 5 はマルチタスクを
想定しているの? オレはシングルタスクで call とか jmp 使えば
いいと思うんだけど。
あとバイナリを展開ってどの程度のこと考えてる?
オレは実行イメージそのままで良いと思ってる。(固定アドレスに置くんだから)
あと、 >>722 では触れられてないけど、VRAMとか IOポートにアクセスするのは

step 1
ライブラリっぽいものを書いてそれをプログラムにスタティックリンクさせる。

step 2
システムコールとして実装

という段階を踏んだ方が良さそう。
で確認なんだけど step 2では、ソフトウェア割り込み使えばいいんだっけ?
そして割り込みを発生させる関数をスタティックリンクすればOK?
0736デフォルトの名無しさんNGNG
>>735
システムコールの呼び出しにはコールゲートかトラップゲートを使うかと。
0737riarutyuubouNGNG
きょう始めてよむ486が届いた
7月11日に発送してもらったんだけど、はじめて読む486の12刷発行が
7月11日だった。(わら
はじめて読む8086の方がまだだ、本来こっちの方が先に届いてほしいんだが。
0738デフォルトの名無しさんNGNG
そんなに売れてるのか… > はじめて読む

折れもリア厨のころに買って読んで、サンプル必死に打ってた気がする。
8086の方は英語がOKなら、上でガイシュツのInterrupt Listとかで十分間に合う。はず。
0739manko_chinko==737 ◆c2rpKRNM NGNG
>>738
どうも
僕は英語駄目なんで(英検三級がやっととれたレベル)、日本国内で日本語を使用した
86系アセンブラの解説ページで勉強しようと思うのですが、、、
0740manko_chinko==737 ◆c2rpKRNM NGNG
始めて読む8086の注文はキャンセルしました
0741FreeDOS教徒NGNG
超亀レスですごめんなさい。

>>653
NASMだけです。C言語を使うほどでもありませんし。

>>654
あとsuppl.zipが要るかも。ソースの\supplに説明があるはず。
0742653NGNG
オールアセンブラ Σヽ(´i i`)ノ ぬりがとう
0743デフォルトの名無しさんNGNG
C言語から呼び出すときのアセンブラのコードで
破壊していいレジスタはどれ?
eax,edx は戻り値に使われるから分かるけど、他のは?

ぐぐったら windows での話は出てきたけど、これってコンパイラ依存の
話だからgcc なら別だよな?
0744デフォルトの名無しさんNGNG
そんなもん、gccで関数をasm出力すれば
わかるだろうに。
0745デフォルトの名無しさんNGNG
edi
0746654NGNG
>>741
Thank you.
これから調べてみます
0747デフォルトの名無しさんNGNG
プロテクトモードでjmpするとエラーになってしまう...なんでだー
0748FreeDOS教徒NGNG
>>654
ヴぁー、申し訳ない。あれcommand.comの作り方だった‥‥
カーネルはあそこの説明のとおりでよかったです。

しかもスレ沈めまくってさらに申し訳ない(汗
0749ひげぽんNGNG
おくれてしまったひでぽんです。
どうしても3rd exception with no resolutionが出てしまいます。
どなたかアドバイスをいただけたら幸いです。
以下エラーになるソースを貼らせていただきます。


0750ひげぽんNGNG

RealToProtect:
        lgdt [gdtr]             ; load gdtr
        cli                     ; disable interrupt
        mov  eax, cr0           ; real
        or   eax, 1             ; to
        mov  cr0, eax           ; protect
        jmp  flush_q1

flush_q1:
        db 0eah
        dw set_cs_desc1 + 1000h
        dw 08h
        jmp  hang

set_cs_desc1:
        mov  ax, 10h
        mov  ds, ax
        mov  es, ax
        mov  ax, 18h
        mov  ss, ax
        mov  sp, 0x1000
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ひげぽんNGNG
gdt10:                          ; segment 10(data segment)
        dw 0xffff               ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x92                 ; Type Data
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH

gdt18:                          ; segment 18(stack segment)
        dw 0xffff               ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x96                 ; Type Stack
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH

gdt_end:                        ; end of gdt

hang:
        jmp hang
print:
        mov [edi], al
        add edi  , 2
        ret
0753デフォルトの名無しさんNGNG
>>749
gdt08のセグメントベースは10000hにしてみてはどうでしょうか?
違うかな
0754デフォルトの名無しさんNGNG
>>747
は既に解決してますか?まだなら俺にちょっと心当たりがあります。
もしかして、cs を 08h とかそう言うGDTRで設定したセグメントにする前の段階の話じゃないですか?
0755デフォルトの名無しさんNGNG
>>750 と >>751 の間に抜けてるものはない? コピペミスじゃない?
mov sp,0x1000 のあとに jmp が必要でしょ。
0756ひげぽんNGNG
>>753
ありがとうございます。
gdt08:                          ; segment 08(code segment)
        dw 0xffff               ; segment limitL
        dw 0x00000001           ; segment baseL
        db 0                    ; segment baseM
        db 0x9a                 ; Type Code
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH
        
としてみましたが、だめでした。
Bochsがエラーを出すときセグメントは↓となっています。
00000195256i[CPU  ] |  DS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  ES:1000( 0000| 0|  0) 00010000 0000ffff 0 0
00000195256i[CPU  ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  SS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  CS:1000( 0000| 0|  0) 00010000 0000ffff 0 0
0757ひげぽんNGNG
>>755
おっしゃるとおりコピペミスです。
jmp hang
があります。
0758デフォルトの名無しさんNGNG
ひげぽんまだ寝るなよ。あとで、アドバイスすっから。
0759747&753NGNG
>>754
それが設定した後なんです。
それと753に書いたの間違えました。
dw set_cs_desc1+1000h
は+10000hではないでしょうか?
0760ひげぽんNGNG
>>758
ありがとうございます。
お待ちしております。
よろしくです。
0761デフォルトの名無しさんNGNG
>>759
そうですか、じゃあ関係ないかもです。役に立てんでごめんです。
あと、 10000h は dw に入らないんじゃない?


ひげぽんは >>750 からのコードどこに置いた? 1000h?
あと、エラーのときの IP も書いて欲しい。それがそのコードどこにあたるのかとかも
それから
bochsout.txt の
00010420000i[CPU ] protected mode
00010420000i[CPU ] CS.d_b = 32 bit
00010420000i[CPU ] SS.d_b = 32 bit
↑ここの部分はどうなってた?
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
>>761
>ひげぽんは >>750 からのコードどこに置いた? 1000h?
1000hです。
>696のreadのところで読み込んでます。

>あと、エラーのときの IP も書いて欲しい。それがそのコードどこにあたるのかとかも
00000195256i[CPU  ] | EIP=0000001a (00000015)
となっています。

bochsout.txtは↓となってしました。
00000195256i[SYS  ] Last time is 1026574623
00000195256i[CPU  ] protected mode
00000195256i[CPU  ] CS.d_b = 16 bit
00000195256i[CPU  ] SS.d_b = 16 bit
0766ひげぽんNGNG
>>762
dw set_cs_desc1 + 10000h
としてみて、アセンブルすると
通ってしまうのですが、Okなのでしょうか。
0767ひげぽんNGNG
>763 764
入れ違いです。すいません。
0768747NGNG
調べるてみると
label:
jmp label
はだめで
jmp label
label:
はエラーなしでした。
>>765
もし1000hなら
dd gdt0+1000h*16
の*16hがいらないのではないでしょうか?
0769デフォルトの名無しさんNGNG
ひげぽん(・∀・)オキテタ!!

>>765 それなら、>>762 で決まり。
>>766 OKじゃねえよ。できたバイナリ見ろよ。
0770デフォルトの名無しさんNGNG
>>768
CPUが32bit モードになっているのにbits 32を書いてないので、
コードが32bit用に成っていないのでは? >>764 は試してみた?
0771デフォルトの名無しさんNGNG
>>765
CS が 1000h になっているのに実行イメージが1000hに置かれてるって
なんか勘違いしてませんか?
0772ひげぽんNGNG
>>770
[bits 32]
flush_q1:
としてみました。

>>771
read:
        mov ax, 1000h
        mov es, ax              ; es:bx is
        mov bx, 0               ; data buffer

        mov ah, 02h             ; read sectors into memory
        mov al, 5               ; number of sectors to read
        mov ch, 0               ; low eight bits of cylinder number
        mov cl, 2               ; sector number
        mov dh, 0               ; head number
        mov dl, 0               ; drive number
        int 13h                 ; read!
        jc  read

        jmp 1000h:0000          ; jump to the secondboot
とすると、1000hに読み込まれた実行イメージにジャンプするという
認識だったのですが、もしかして出発点から間違ってます?
0773ひげぽんNGNG
>>769さん。
上記>>772
の1000hの部分を0100hにしてかつ、
[bits 32]
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h
        jmp  hang
および
gdtr:
        dw gdt_end - gdt0 - 1   ; gdt limit
        dd gdt0 + 100h    ; start adderess
としてみましたがだめでした。
0774デフォルトの名無しさんNGNG
>>772
それなら、リニアアドレスでは10000hになるのは分かる?
そして、flush_q1 の後のジャンプの場所指定で書かなければいけないのはリニアアドレス。
(なぜならもうプロテクトモードなんだし、08 のコードセグメントのベースが0に成っているから)
0775デフォルトの名無しさんNGNG
>>773
違う。 gdtr の所の start addressはリニアアドレス。
あと、「上手くいった/だめだった」の二元論ではなくどこでエラーが
起きたのかが重要。ダメなときはどこで止まったのか調べないと。
0776ひげぽんNGNG
>>774
なるほど良く分かりました。
ということは、もともとのCS * 16するってことですよね。
でもうまくいかないです。
だいぶ前進したとは思うのですが、
0777ひげぽんNGNG
>>776さんのおっしゃる通りなのでちょっとまとめます。
現在の状況は
0100hに読み込まれたイメージの中でプロテクトモードに移行しようとしているが
以下のようなエラーが出てしまう。
00000195256i[CPU  ] protected mode
00000195256i[CPU  ] CS.d_b = 16 bit
00000195256i[CPU  ] SS.d_b = 16 bit
00000195256i[CPU  ] | EAX=60000011  EBX=00000000  ECX=00010002  EDX=00000000
00000195256i[CPU  ] | ESP=0000fffe  EBP=00000000  ESI=00000025  EDI=0000ffe4
00000195256i[CPU  ] | IOPL=0 NV UP DI PL NZ NA PE NC
00000195256i[CPU  ] | SEG selector     base    limit G D
00000195256i[CPU  ] | SEG sltr(index|ti|rpl)     base    limit G D
00000195256i[CPU  ] |  DS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  ES:0100( 0000| 0|  0) 00001000 0000ffff 0 0
00000195256i[CPU  ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  SS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  CS:0100( 0000| 0|  0) 00001000 0000ffff 0 0
00000195256i[CPU  ] | EIP=0000003b (0000003b)
0778ひげぽんNGNG
移行時に実行していること
gdtr:
        dw gdt_end - gdt0 - 1   ; gdt limit
        dd gdt0 + 100h * 16     ; start adderess
----
[bits 32]
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h
        jmp  hang

うーんどこが悪いかが分からない。
もう少しねばってみます。
0779デフォルトの名無しさんNGNG
flush_q1 では実はまだ32bit モードじゃないらしいんだよ。
おれも詳しくは分からないけどプロテクトモードだけど16bit モードってのがあるらしい。
(bochs のソースを見てそう思った)
本当に32bit モードに成るのは CS が 08 に成ってから。
だから、それだとbits32を置く場所がちょっと違う。
0780ひげぽんNGNG
>>779
ありがとうございます。
bits 32の場所を変えてみましたが、だめでした。
>>704(プロテクトモード移行成功)も同じ場所だったので
今回のエラーの直接の原因ではないかもしれません。
0781デフォルトの名無しさんNGNG
>>780 了解。
じゃあ、エラーが起きてる IP=0x003b のところはソースでいうどこにあたる?
0782ひげぽんNGNG
>>781さん
IPってオフセットアドレスですよね?
ソースのどの部分が該当するかを調べるには
どうしたらよいのでしょうか

質問ばかりで申し訳ないです。
0783デフォルトの名無しさんNGNG
>>782
デバッガある?
0784ひげぽんNGNG
>>783
DJGPPにgdb.exeがついてきていましたが
これでよいですか?
使ったことがないのですが、これで出来るなら
明日にでも勉強いたします。
0785デフォルトの名無しさんNGNG
gdbで、いいかどうかはちょっと分からない。
ベクターとかにありそうなMS-DOS用のcomファイルを調べられるの使うのが良い。
あとは、nasm の -l オプションかな。
0786ひげぽんNGNG
遅くまでありがとうございます。
実行しながらデバッグするのでしょうか?
それだとBochsの機能でなにかあるのかなあ。
0787デフォルトの名無しさんNGNG
もしかしたら bochs にそういう機能があるかもしれないけど俺は分からん。
つうか、今はどこでエラーが起きたのか分かれば良いんだから、
実行しながらデバグなんてしなくて良いよ。
-l は試した? 結局 3b ってどこなのさっ!!
0788747NGNG
なにも変更してないのに突然エラーなくなりました。わけわからん。
相談に乗っていただいた方どうもありがとうございました。
0789デフォルトの名無しさんNGNG
>>747
おめでと。役に立てなくてゴメン。
またなんかあったら聞いてね。今度こそ役立つアドバイスするカラ
0790747NGNG
またエラーになった...もう寝よう
0791ひげぽんNGNG
おはようございます。
nasm -l でリストを出力しました。
    62 00000031 AC                  <2>         lodsb
    63 00000032 3C00                <2>         cmp al, 0    
    64 00000034 7409                <2>         je  %%end    
    65 00000036 B40E                <2>         mov ah, 0Eh    
    66 00000038 B700                <2>         mov bh, 0    
    67 0000003A CD10                <2>         int 10h    
    68 0000003C E9F2FF              <2>         jmp %%hige    
    69                              <2> %%end:    
    70 0000003F 58                  <2>         pop ax    
    71                              <1>     
    72                              <1> reset:    

3bはどこにあるのでしょうか。
0792ひげぽんNGNG
いろいろ調べてみると
プロテクトモード移行直後の
jmp flush_q1以降で死んでいるようです。
jmp hangとすると3rd exceptionは発生しませんでした。
0793デフォルトの名無しさんNGNG
今でも死ぬときのIPは 3bなの?
0794ひげぽんNGNG
ええ。
3bです。こんな感じです。
00000195256i[CPU ] | EIP=0000003b (0000003b)
0795デフォルトの名無しさんNGNG
>>792
現在のコードはどうなってるの?
0796ひげぽんNGNG
[bits 16]
RealToProtect:
        lgdt [gdtr]             ; load gdtr
        cli                     ; disable interrupt
        mov  eax, cr0           ; real
        or   eax, 1             ; to
        mov  cr0, eax           ; protect
        jmp  flush_q1

;-------------------------------------------------------------------------------
; GDT definition
;-------------------------------------------------------------------------------
gdtr:
        dw gdt_end - gdt0 - 1   ; gdt limit
        dd gdt0 + 100h * 16     ; start adderess

gdt0:                           ; segment 00
        dw 0                    ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0                    ; segment type
        db 0                    ; segment limitH
        db 0                    ; segment baseH
0797ひげぽんNGNG
gdt08:                          ; segment 08(code segment)
        dw 0xffff               ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x9a                 ; Type Code
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH

gdt10:                          ; segment 10(data segment)
        dw 0xffff               ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x92                 ; Type Data
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH
0798ひげぽんNGNG
gdt18:                          ; segment 18(stack segment)
        dw 0                    ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x96                 ; Type Stack
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH

gdt_end:                        ; end of gdt
0799ひげぽんNGNG
[bits 32]
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h

set_cs_desc1:
        mov  ax, 10h
        mov  ds, ax
        mov  es, ax
        mov  ax, 18h
        mov  ss, ax
        mov  sp, 0x100
        jmp  hang

hang:
        jmp hang
;  ;  print:
;  ;          mov [edi], al
;  ;          add edi  , 2
;  ;          ret
0800ひげぽんNGNG
>>795
板を汚して申し訳ありません。
現状は上記の通りです。
0801デフォルトの名無しさんNGNG
もしかして>>791は1stブートのやつじゃ、、
0802ひげぽんNGNG
>>801さん。
ええその通りです。
BIOS経由で文字列出力する部分です。
nasmでアセンブルするときはひとつにまとめるので
リストもfirst boot, second bootもあわせたものになっています。

0803デフォルトの名無しさんNGNG
>>802
Σ(゚д゚lll)ガーン もっと考えれ。
second boot の先頭を 0 として 3b がどこかを調べなきゃ意味ないだろ。
0804795NGNG
>>800
うーん、リスティングファイルの方がよかったかも。
で。
>>695とか見ると、リニアアドレス0x0010000にそのコードをロードしてるみたいだけど。

> gdtr:
> dw gdt_end - gdt0 - 1 ; gdt limit
> dd gdt0 + 100h * 16 ; start adderess

dd 0010000h+gdt0では?

> flush_q1:
> db 0eah
> dw set_cs_desc1 + 100h * 16
> dw 08h

こっちも。

あと、どっかに垢取ってそっちにコード全体を上げた方がいいかも。
0805ひげぽんNGNG
>>803
>>804
もっと考えます。
いま、とりあえず垢をとっています。
0806デフォルトの名無しさんNGNG
もしかしてひげぽんは
1st-boot と 2nd-boot くっつけてアセンブルしない?
別々にアセンブルしてからくっつけた方が良いかも
0807795NGNG
あと、ベースアドレスが00010000h、リミットが0000FFFFhで16ビットのセレクタを用意して、
そっちで作業した方が楽だと思われ。
ベースアドレスが00000000hのセレクタに切り替えると、オフセット計算が面倒なことになる。
0808デフォルトの名無しさんNGNG
>>806の詳しい解説
1st-boot は、 2nd-boot の先頭が 1000hにくるように
ディスクをロードする。
だから、2nd-boot の先頭から数えた offset に 1000h を加算すれば
それがちょうど リニアアドレスになる。
しかし、ひげぽんは1st-bootと2nd-boot をくっつけて
アセンブルしているので、offsetがずれてしまう。
nasm -l の出力で
dd gdt0 + 100h * 16 ; start adderess
dw set_cs_desc1 + 100h * 16
この2行がどうアセブルされているか見てみ。
前者が [1B100000] 後者が[4010]なら正しいぞ。
でもそうなっていないはず。
で、今度はばらばらにアセンブルしてみな。
すると上のようになるはずだ。それを確認したら
copy とか dd とかつかって二つをくっつける。
これで上手く行くはず。
0809795NGNG
>>808
>>696でes:bxが1000:0000だからリニアアドレスは00010000hだって。
0810デフォルトの名無しさんNGNG
>>809
>>777見れ
0811ひげぽんNGNG
>>806 >>808
まとめてアセンブルしてました。
(1)まとめてアセンブルした場合
    133 00000217 [1B120000] <1> dd gdt0 + 100h * 16 ; start adderess
    172 0000023C [4012] <1> dw set_cs_desc1 + 100h * 16
(2)secondboot.asm単体アセンブルの場合
22 00000017 [1B100000] dd gdt0 + 100h * 16 ; start adderess
61 0000003C [4010] dw set_cs_desc1 + 100h * 16
>>808さんのおっしゃる通りになってました。
今から別々にアセンブルを試してみます。
0812809NGNG
>>810
 ∧||∧
(  ⌒ ヽ
 ∪  ノ >>773で変更してたのね…
  ∪∪
0813デフォルトの名無しさんNGNG
ドマイ。オフセットをWORDに入れなきゃだから。
>>807みたいな手もあるけど、、、、。
0814ひげぽんNGNG
ひげぽんです。
皆さんありがとうございます。
別々アセンブルでも同じIPでエラーが起きてしまいました。

今から外出しなければいけなくなってしまったので
戻り次第アカウントを取得してソースを簡単に公開できるようにします。

ところで
copy firstboot.bin + secondboot.bin higeboot.bin
をddコマンドでやるにはどうやったら良いんでしょうか?
if=で複数ファイルを指定してみたらうまくいかなかった。


0815デフォルトの名無しさんNGNG
>>814
そっか。自信あったんだけどダメだったか。
ソース公開を待つことにするよ。
0816デフォルトの名無しさんNGNG
あれ?やっぱできるじゃん。
俺、ひげぽんの >>796 - 799 と自作 1st-boot で、上手く行ったよ。
もしかして 1st-boot で、 ds を設定していないとか言うオチですか?
0817ひげぽんNGNG
>>815
>>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
やっと、ソースをほぼ自動的にhtmlとしてアップする仕組みが出来た。
今日は、OS製作以外でちょっとだけプログラムした・・・
最近は、ftpの出来ないフリースペースが多いですね。
アップロードをスクリプトに出来なくて面倒なので
ftpのokなtripodにしました。
0819デフォルトの名無しさんNGNG
>>818
もちろんアセンブラで書いたんですよね?
0820ひげぽんNGNG
>>818
私の腕前では無理です(笑)
0821デフォルトの名無しさんNGNG
>>818

> 10 00000000 0F0116[1500] lgdt [gdtr] ; load gdtr

この時のDSレジスタの値は?
firstbootで設定された07C0hを引きずってるように見えるが。
0822ひげぽんNGNG
>>821
07C0hを引きずっています。
load gdtrした後に
flush→CSセットとなるのかな。
00000195256i[CPU  ] |  DS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  ES:0100( 0000| 0|  0) 00001000 0000ffff 0 0
00000195256i[CPU  ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00000195256i[CPU  ] |  SS:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00000195256i[CPU  ] |  CS:0100( 0000| 0|  0) 00001000 0000ffff 0 0
00000195256i[CPU  ] | EIP=0000003b (0000003b)
0823821NGNG
じゃ、それが原因。

GDTRに不正な値をロード。
far jump時にCSレジスタに不正な位置を指したセレクタをロードしようとする。
一般保護例外発生。
例外ハンドラに処理を渡そうとする。
IDTRがセットされてないので失敗。
ダブルフォールトの例外ハンドラに処理を渡そうとする。
当然失敗。
トリプルフォールトであぼーん。

こんなシナリオかと。

lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか。
0824ひげぽんNGNG
>>814
自己レスです。
>copy firstboot.bin + secondboot.bin higeboot.bin
>をddコマンドでやるにはどうやったら良いんでしょうか?
>if=で複数ファイルを指定してみたらうまくいかなかった。
catでうまくいきました。
catってバイナリファイルも連結できるんですね・・・

0825ひげぽんNGNG
>>821>>823さん
>GDTRに不正な値をロード。
gdtrにロードするアドレスが不正なのか
それともディスクリプタテーブルにセットされている
セグメント設計が不正なのでしょうか。

>lgdt cs:[gdtr]としてCSレジスタ相対にするか、DSレジスタをCSにそろえるか
ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。

0826821NGNG
>>825
GDTRにロードされる値。
リスティングファイルを見ながらどんなアドレスが生成されるか考えてみよう。

gdtrの指すアドレスは0100:0015。
実効アドレスは00000115h。

lgdt [gdtr]でロードされるのはds:gdtr。
dsレジスタは07C0hだから07C0:0015。
実効アドレスは00007C15h。

> ldgt cs:[gdtr]はアセンブル時にエラーになってしまいました。

スマソ、cs:[gdtr]はmasmの書き方だった。
nasmでは[cs:gdtr]。
0827821NGNG
> gdtrの指すアドレスは0100:0015。
> 実効アドレスは00000115h。

嘘書くなよ、俺。
00001015hが正解。
0828821NGNG
つーか、実効アドレスの意味間違ってるような。
実効アドレス→リニアアドレスに訂正。
0829ひげぽんNGNG
http://ime.nu/oshigepon.tripod.co.jp/
[報告]
結論から言うとnasmでは[cs:gdtr]でばっちりうまくいきました。
>lgdt [gdtr]でロードされるのはds:gdtr。
ということは、secondbootにジャンプしたときに
dsをきちんとセットしていなかったのが問題だったわけですね。
        mov  ax, cs
        mov  ds, ax
        lgdt [gdtr]             ; load gdtr
でもうまくいきました。

アドバイスを下さったたくさんの方々
ありがとうございます。



0830ひげぽんNGNG
http://ime.nu/ime.nu/oshigepon.tripod.co.jp/
今回の反省点[プロテクトモード移行時]
・アセンブラファイルを分割していたことを考慮していなかった。
・リニアアドレスを設定しなければいけないところを考慮できていなかった。
・firstbootからsecondbootにジャンプしたときにdsを設定しなおさかった。
・nasm -lを知らなかった。
・bits 16,bits 32の記述をしていなかった。
いろいろです。
0831ひげぽんNGNG
[次の目標]
インラインアセンブラを駆使しつつ、Cでソースをかいて
32bitコンパイラでコンパイルする。
出来上がったバイナリを、secondbootで読み込み実行する。

0832ひげぽんNGNG
プロテクトモード移行に成功したソースを
http://oshigepon.tripod.co.jp/
に置きました。

プロテクモード万歳!!!
皆さんありがとうございます。
00161809000i[CPU  ] protected mode
00161809000i[CPU  ] CS.d_b = 32 bit
00161809000i[CPU  ] SS.d_b = 32 bit

本当に皆さんのおかげでこのスレッドは、非常に有用な
スレッドになっていると思います。

大変お世話になっております、そしてこれからもよろしくお願いいたします。

私と同様に、OSを本気で作ろうと考えている人たち
一緒にがんばりましょう。
0833デフォルトの名無しさんNGNG
ひげぽんまだいる?もう少し補足がある。
0834ひげぽんNGNG
>>833
います。
0835833NGNG
ごみん。間違い。>>833 は忘れて。
0836ひげぽんNGNG
>>835
了解です。

そろそろ仮称でも良いからPJ名(OS名)を決めないと・・・
取り返しがつかなくなる気がする。

higeboot.asmって結構恥ずかしい名前だ。

どなたかかっこいい名前ありませんか?
0837デフォルトの名無しさんNGNG
higepos
0838ひげぽんNGNG
>>837
>higepos
ちなみになんて読むの?ひげぷおーえす?
もし万が一、有名になって、ちょっとでも外人に名前が知られるように
なったとしたら、なんて発音するんだって揉めそう(←もめないって?)

0839デフォルトの名無しさんNGNG
ヒゲポソ
0840=・ NGNG
まんこ
0841ひげぽんNGNG
>>839
あ!半角カタカナにして、2chであることを考慮すると
読めるってことですね。
良い名前随時募集中!!
0842デフォルトの名無しさんNGNG
2chOS
0843デフォルトの名無しさんNGNG
2ちゃんどうず
0844ひげぽんNGNG
>>842
>2chOS
見た目は非常に良いですね。
にちゃんおーえす?
にこす?

>>843
>2ちゃんどうず
なんか微妙です。
2chdows?

OSASK,nwsosもそれぞれ読み方が良く分からないです。
引き続き募集!
0845FreeDOS教徒NGNG
OSASK -> おさすく/おーえすあすく
NWSOS -> なうえすおーえす‥‥と呼んでいる

しっかし、いい名前っていうと思いつかんなぁ
0846デフォルトの名無しさんNGNG
GATES FREE
0847ひげぽんNGNG
>>845
>OSASK -> おさすく/おーえすあすく
>NWSOS -> なうえすおーえす‥‥と呼んでいる
なるほど。
おさすくかあー

>しっかし、いい名前っていうと思いつかんなぁ
そうですよね。
linuxって人の名前からとった割には、
かっこいい名前ですよね。

>>846
>GATES FREE
ストレートですね。
受けは良いかもしれませんが・・・
これって、門が開いている(だれでもいいよ)
っていう意味にも取れるのかな?
→英語得意な方
0848デフォルトの名無しさんNGNG
OSの特徴がはっきりしないんじゃ
名前の付けようがないだろ。
プロジェクト名ならhigeposでもかまわん。
0849デフォルトの名無しさんNGNG
超ひげぽん 
0850ひげぽんNGNG
>>848
>OSの特徴がはっきりしないんじゃ
>名前の付けようがないだろ。
>プロジェクト名ならhigeposでもかまわん。
ちょっとこの案に傾いてきた。
でも、ひげ生えてないんだよね。全然・・・
名前変えようかな・・・
0851デフォルトの名無しさんNGNG
よし、かっちょいい名前考えてやるから本名晒せ。
0852ひげぽんNGNG
PJ名(仮称):higeposに決定!!!

しました。
今後ともよろしくお願いいたします。
0853837NGNG
ホントに採用されるとは思わなかった (w
0854ひげぽんNGNG
>>853
おめでとうございます???
名付け親ですね。
0855デフォルトの名無しさんNGNG
ひげぽんプロテクトモード到達
      &
higeposプロジェクト開始

まとめてage
0856FreeDOS教徒NGNG
名前はともかくとして、secondbootのCR0書き換えたあとのジャンプって
farジャンプなの?これじゃ問題がないとは言えないような‥‥‥

万全を期したいなら、farジャンプにするために
   DB 0x2E
   JMP なんとか
っていう形にしてしまえばいいと思うよ。間違ってたらゴミン
0857ひげぽんNGNG
>>856
この部分で実際ジャンプしていると思います。
でも自信なし・・・
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h
0858ひげぽんNGNG
gccでインラインアセンブラということは、
Intel形式ではないのですね・・・

アセンブラからCでコンパイルした実行イメージを読み込めるようがんばります。

int main() {
    asm("cli");
    return 0;
}
こんなやつがsecondbootから呼べればよいんだよね。
がんばろう。
0859デフォルトの名無しさんNGNG
ひげぽんがCからアセンブラの関数を呼ぼうとせずに
インラインアセンブラにこだわる理由って何?
0860ひげぽんNGNG
>>859
別にこだわってないですよ。
>>859さん
インラインアセンブラ方法と
Cからアセンブラを呼ぶ方法
どちらが方法として一般的ですか?
どちらが容易ですか。
やはりどちらとも経験しておいたほうが良いでしょうか。
0861デフォルトの名無しさんNGNG
>>857
それであってますよ。

[bit16]
flush_q1:
  jmp 8:set_cs_desc1 + 1000h

の方がわかりやすいですけど...。
0862ひげぽんNGNG
>>861
>この部分で実際ジャンプしていると思います。
>でも自信なし・・・
>flush_q1:
> db 0eah
> dw set_cs_desc1 + 100h * 16
> dw 08h
↑は、はじめての486からのパクリです。
はじめて・・・によると、
「セレクタ地を使ったセグメント間ジャンプ命令をニーモニックでは記述できないので
マシン語命令コードを直接している」
そうです。



0863ひげぽんNGNG
セレクタ地→セレクタ値
0864デフォルトの名無しさんNGNG
>>860
どちらが一般的かは知らんが、俺は関数として
アセンブリを呼ぶことを勧める。
まぁ、まずはこれを見ろよ。
http://ghost.math.sci.hokudai.ac.jp/speedmania/speedmania-6.html
オールアセンブリでなくC言語を使う理由って何だよ?
「書きやすさ、読みやすさ、保守のしやすさ、バグの入りにくさ。」
じゃないのか?
このページに載ってるのはとてもC言語らしくない醜い物だと思うぞ、俺は。

一方アセンブリで書いた関数をCから呼ぶ場合、アセンブリ部こんな感じ。

;
; void outb(word ioaddr,byte data);
;
; +-----------------------+ sp
; | return addr |
; +-----------------------+ +4
; | ioaddr |
; +-----------------------+ +8
; | data |
; +-----------------------+

outb:
mov edx,[esp+4]
mov eax,[esp+8]
out dx,al
ret

ブラウザで見ると激しくズレるので等幅フォントで見てくれよ。
Cから呼び出すには、上に書いたプロトタイプにしたがって呼び出せば良い。
よほどキレイだろ。

一応、考えられる反論も書いとく:
(1)#define マクロを使えばもっとキレイにできる。
→ バグの入りやすさは変わらんだろ。

(2)関数を呼ぶとオーバーヘッドがかかる。
→なら最初からCなんか使うなよ。

(3)リンクが大変だ。
→割り込みのコールバック関数は iret で戻らなきゃ行けないから、
そこではアセンブリ使わざるを得ないだろ。だから結局
C言語とアセンブリのリンク作業は避けられん。

ちなみにリンク作業に付いて補足しておくとウチのところでは、

gcc -c xxxx.c
nasm -f aout yyyy.asm
ld -oformat binary xxxx.o yyyy.o
で上手く行ったぞ。あと必要に応じて -Ttext、 -Tdata、 -Tbbs、 -e
等をつければOK
0865デフォルトの名無しさんNGNG
>>862
「はじめての486」はMASMを前堤に書いているから
そうなのかもしれん。しかし、NASMなら>>861でできるぞ。
0866ひげぽんNGNG
>>864
大変貴重なご意見ありがとう。
確かにインラインアセンブラは、アセンブラとCが共存している時点
で見やすくはありませんね。

#define lock() asm("cil")
見たいなのはありですよね?

>>864さんが
せっかく方法を提示してくれたので
明日挑戦してみます。
0867デフォルトの名無しさんNGNG
>>866
プログラムやるならコード書くときくらいはミスタイプに慎重になれよ。
0868ひげぽんNGNG
cliですね。
0869FreeDOS教徒NGNG
>>861
プロテクトモードに移行したら速やかにパイプラインの初期化をしなきゃ
ヘタな16bitコードが間に入ると落ちたりする‥‥けど、この場合は
ぜんぜん問題なさそうですね。なんかいらん心配してました(汗
0870ひげぽんNGNG
>>865
なるほどnasmだと出来るのですね。
0871デフォルトの名無しさんNGNG
なんかよくわからんけど
ひげぽん第一目標クリアしたのかな。
とりあえずおめでとさん〜。

#こんぱいる済みのもアップしてみてほすぃ。
0872ひげぽんNGNG
>>871
higeboot.binもアップするようにしました。
Bochsでフロッピーイメージとして設定すると
ブートできますよ。
実際のディスクにddコマンドで書いてもよいけど。
0873デフォルトの名無しさんNGNG
>>864
ちょっと観点がずれてない ?
> Cから呼び出すには、上に書いたプロトタイプにしたがって呼び出せば良い。
と言うのは、当然なんだけど、要は呼び出され側をどう作るかじゃないの ?

フルアセンブラで、

outb:
mov edx,[esp+4]
mov eax,[esp+8]
out dx,al
ret

と書くのと C + インラインアセンブラで

void outp(word ioaddr, byte data)
{
 asm("out %%dx,%%al"
   :
   : "d"(ioaddr), "a"(data));
}

と書くののどちらがいいかの問題だと思う。個人的には、[esp+4] なんかが結構
面倒と思う。特にローカル変数とか持つとね。そう言うところは、コンパイラに
やらせるべきだと思うけど...。
0874デフォルトの名無しさんNGNG
>>873
ああ、言われてみればそんな気がして来た。
俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
インラインアセンブラの使い方が嫌なだけだった。
インラインアセンブラ をごっそり関数で括ってあとは
そっちだけ利用すれば一緒だな。

gasの文法を使わなきゃ行けなかったり、
: "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
でも、それって確かに主観の問題だ。
0875ひげぽんNGNG
>>873,>>874
うーん迷いますね。
gasの文法で書かなければいけないのが
インラインアセンブラの微妙なところかもしれないです。
→正直

結局gasでよいなら、もともとnasmなんか使わなければ・・・

迷うので明日の朝起きてから考えよう。
0876デフォルトの名無しさんNGNG
ひげぽんは、結構質問屋だけど

質問する前に、自分である程度試しているみたいだし
学習スピードが速いね。

これって結構すごいと思う。

応援しているのでがんばってね。
もうすぐ多分、俺もついていけなくなる(技術的に)
0877過去ログ読む気はない!NGNG
ここってマジに作ってんの?
0878デフォルトの名無しさんNGNG
他の板でこのスレの宣伝してる奴がいる…
宣伝厨うぜぇ。
0879デフォルトの名無しさんNGNG
このスレ見てると、「おちこぼれ」の気分になれます。
0880 NGNG
関数をインライン展開したくなったときにフルアセンブラの関数だと厄介だよね。
0881デフォルトの名無しさんNGNG
>>879
この掲示板にいる人がおちこぼれってこと?
0882デフォルトの名無しさんNGNG
サンプル
0883デフォルトの名無しさんNGNG
cの配列ってbssセクションにメモリが確保されるの?
putchar関数をつくってみたけどちゃんと動かない。
0884デフォルトの名無しさんNGNG
bssは静的配列だけだろ
0885デフォルトの名無しさんNGNG
>>883
初期化してるなら data、 してないなら bss、 ローカル変数ならスタックじゃない?
でも、一度アセンブリ出力したのを見た方が確実かも。
0886デフォルトの名無しさんNGNG
>>885さんの通りでした。どこに配置されているかはわかったものの
なにが悪いのかよくわかっていないので、これから解決してみます
0887デフォルトの名無しさんNGNG
.ldsが書けない。欝だ死ぬ
0888デフォルトの名無しさんNGNG
NOWSMART OS クロス開発環境 DL 可能記念あげ。
0889886NGNG
だめだどうすればいいのかわかんない...
0890デフォルトの名無しさんNGNG
nowsmartって独自の開発環境があるの?
0891デフォルトの名無しさんNGNG
>>890
あるよ。
独自開発の「処理系」が。
言語自体は独自じゃなく、MASM 準拠、ANSI C 準拠みたいだけど。
まあ、独自言語よりも凄いかも知れんけど。
0892デフォルトの名無しさんNGNG
>>889
ソースをここにコピペしてくれれば相談に乗れるかも
0893873NGNG
>>874
> 俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
> インラインアセンブラの使い方が嫌なだけだった。
なら、同意。

> gasの文法を使わなきゃ行けなかったり、
> : "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
> でも、それって確かに主観の問題だ。
こっちも、同意。GNU の文法ってちょっと変と思う。変数属性の二重括弧と
か...。
0894ひげぽんNGNG
firstboot real-mode secondbootをディスクを読み込んでjmp
secondboot protected-modeへ移行 thridをディスクを読み込んでjmp
thirdでは、Cからアセンブラで実装した引数なしの関数をよぼうと思う。

現在プロテクトモードでディスクを読み込むところを実装中・・・
0895_NGNG
>>891
この人、凄すぎ。Cコンパイラが動くならGNUのソフトウェアは移植できないのかな。
0896デフォルトの名無しさんNGNG
>>894
プロテクトモードでディスク読み込みってまだ難くない?
secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
0897デフォルトの名無しさんNGNG
ハッカーあげ
0898デフォルトの名無しさんNGNG
JAVA版のLinuxってどこにあるんですか
0899デフォルトの名無しさんNGNG
JAVAバイトコードをはく Cコンパイラはありますか
0900889NGNG
>>892
メモリダンプしてみると初期化した値がどこにもないようでした。
どうやらもっと基本的な部分で間違えているようです。
0901デフォルトの名無しさんNGNG
>>900
gcc -Wa,-a -c xxxx.c
って試してみた?
0902デフォルトの名無しさんNGNG
ゴメン↑じゃあまり参考にならなそう。リンクのときに、
-Map mapfile
ってオプションつけてみ。そして、できたmapfile 見ると良いかも。
俺もこれの正しい読み方分からないけど、なんとなくなら分かる。
誰か解説ページ知らない?
0903889NGNG
ひょっとしたらなにが原因かわかったかもしれません。もうちょっと試してみます。
マップファイルをみるとdjgppがつけたと思われるものが色々ありますが、
これっていらないもののような感じがするんだけど...
0904903NGNG
間違ってp2pのスレに書いてしまった...
問題は半分解決しました。
0905デフォルトの名無しさんNGNG
>>904
スマン勝手にコピペさせてもらう。

>値がないのは、フロッピーの読み込みをちゃんとしていなかったという
>初等的なミスでした。
>次に問題なのは、実体のあるアドレスとポインタの値が一定値ずれているということ
>なのですが、これはまだどうやったらいいのかわからないままです。

「一定値ずれている」のは、ld のオプションで -Tbbs -Tdata を使えばいい。
0906デフォルトの名無しさんNGNG
>>895
恐らく GCC なども移植できるでしょう。
0907デフォルトの名無しさんNGNG
おい、お前ら3chねるをみろ!
0908デフォルトの名無しさんNGNG
ん?なんだ
ニコニコプンしかやってないぞ
0909デフォルトの名無しさんNGNG
>>908
ワラタ
0910デフォルトの名無しさんNGNG
3chでニコニコぷんはやってない。と言う罠。
でもウケタYO
0911デフォルトの名無しさんNGNG
掲示板の文字が黒い
0912デフォルトの名無しさんNGNG
NHK 総合 : 2ch
NHK 教育 : 12ch

ですが、何か?
0913デフォルトの名無しさんNGNG
総合3ch
教育9ch
が普通でしょ?ニコニコプンは教育。てかニコニコプンって今もやってるの?
0914デフォルトの名無しさんNGNG
NHK 総合 : 1ch
NHK 教育 : 3ch

これが関東標準だぞ。
0915志津NGNG
>>913
てか、どこにすんでんの
0916志津NGNG
>>912は関西標準
0917デフォルトの名無しさんNGNG
3chはSunTVが畿内標準デス
0918913NGNG
私は名古屋です。
地方で違うんですね。知りませんでした。板汚してごめんよ
でも900超えたからいいかな?
0919デフォルトの名無しさんNGNG
これのことだろ。

>第7回 7/10・7/17
>「OSって何?」
> コンピューターの働きをつかさどるオペレーティング・システム。
>複数のプログラムを交通整理するしくみと、その発展の歴史を紹介する。

ttp://www.nhk.or.jp/denno/nagare/06/top.html
0920ひげぽんNGNG
>>896
>プロテクトモードでディスク読み込みってまだ難くない?
>secondboot で、ディスク読んでからプロテクトモードに移行の方が良いと思うよ。
>じゃなければ、firstboot で、second third 両方読みこんじゃう手もある。
昨日、今日とずっと考えてやっとだ取り付いた結論が↑に書いてありました(笑)
さてどこに読み込んで、プロテクトモードに移ったときに
どうすれば実行されるのかでまた悩みます・・・

スレッドが900を超えたのでそろそろ新スレッドを・・・
0921デフォルトの名無しさんNGNG
>>920
読みこむ場所はとりあえずどこでも良いんじゃない?
実行するにはその場所をcallするかjmpする。
とりあえず簡単なCのプログラムを書いて
ld のオプションで -e xxxx -Ttext yyyy -oformat binary
を指定すればOK
0922ひげぽんNGNG
>>921
アドバイスありがとう。
いきなりCのプログラムだと、もし出来なかった場合
どこが悪いのか分からなくなるので

firstboot.asm 512byte
secondboot.asm 512byte
test.asm 512byte
としてfirstbootで2セクタ読み込もうとしています。
firstbootでは、es:bx 0x100:0をバッファとして指定してます。
リアルモードでは、上記の理由から
jmp 0x100:0にジャンプしました(secondbootへ)
secondbootでプロテクモード移行を済ませた後に
test.asmにjmpしようと思うのですが、どこにjmpしたら
良いかが、分からなくなりました。
gdtを設定したことを考慮しなければいけないとは思うのですが、、、
0923デフォルトの名無しさんNGNG
>>922
gdt の設定の仕方が前みたい(csのbase=0)だったら
普通にリニアアドレスを書けば良い。つまり、読みこまれたアドレス。
たぶんひげぽんの場合だと 0x1000 に2セクタ目から読むから
0x1000+512 = 0x1200 をcall ( or jmp) かな。
Cが上手く呼べたかどうか調べるには。

char c_prog()
{
return 'A';
}
みたいにして、 eax に'A'がはいってくることを確かめる(アセンブリ部で表示)か、

void c_prog()
{
(*(char *)0xb8000)='A';
}
のようにVRAM直接アクセスでよい。
後者の方がお勧めかな。
ちなみにかっこ付けて

char *vram=0xb8000;

void c_prog()
{
vram[0]='A';
}

とかやると、変数に上手くアクセスできるかとかそういう問題が
からんで来ちゃうから最初はやらない方が良い。でも、↓ならOK

#define vram ((char *)0xb8000)

void c_prog()
{
vram[0]='A';
}
うん。まあ上のどれか試してみて報告しれ。
0924904NGNG
>>905
どうもありがとうございました。無事動くようになりました!!
0925924NGNG
躓いた大きな点を参考にならないかと思いますが書いておきます。
・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
> 925
リンかスクリプト使えって。

ld -T simple.ls xxx.obj -o a.exe
objcopy a.exe a.bin -O binary

てな感じで。

/* simple linker script */
OUTPUT_FORMAT(pei-i386)
SECTIONS
{
. = 0x1000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
0927デフォルトの名無しさんNGNG
みなさん、エミュレータは何を使われてますか?
それとも実機なのでしょうか?
0928デフォルトの名無しさんNGNG
>>972
だいたいBochsの人が多い。
ていうか過去ログ嫁
0929デフォルトの名無しさんNGNG
Bochsってコンソールモードじゃ動作しないんでしょ?
Plex86は動くみたいだけど。。
0930デフォルトの名無しさんNGNG
>ひげぽん氏
トリップ付けといたら?
0931デフォルトの名無しさんNGNG
>>929
(゚Д゚)ハァ?
0932デフォルトの名無しさんNGNG
VMwareじゃだめなん?
0933デフォルトの名無しさんNGNG
フロッピーからコードを0x0000に置くとなぜか止まってしまうんですがこれってなんででつか?
0934デフォルトの名無しさんNGNG
0:0には16bitの割り込みベクタがあるから、かな?
0935デフォルトの名無しさんNGNG
>>932
いいけど、高いよ。
0936デフォルトの名無しさんNGNG
>>935
評価版がタダじゃないの?
0937ひげぽんNGNG
>>923
ありがとう。
third.asmにjmpして実行するのには成功したので
以下のようなCのソースを
書いてみました。
大体こんな感じ
int main() {
hige();
}
char hige() {
return 'A';
}

gcc -c -Wall main.c -o main.o
みたいな感じでコンパイルしました。

cat firstboot.bin secondboot.bin main.o >higeboot.bin
としてみたところ、
bochs異常終了・・・撃沈。

ただいま原因究明中。

>930
必要と感じたら付けますよ。
0938デフォルトの名無しさんNGNG
だれか次スレ作れーーー
0939ひげぽんNGNG
リンクが必要なことに気づいてきました。
0940 NGNG
cygwin の gcc で main って関数名を使うと初期化ルーチンへの
ジャンプコードが埋め込まれるので注意が必要です。
0941ひげぽんNGNG
>>940
cygwinではなく、DJGPPを使っているんですけど
まずいですかね?

リンクってオブジェクトファイルがひとつしかない場合も必要なんでしょうか?

0942デフォルトの名無しさんNGNG
cygwinだろうがDJGPPだろうが、
mainに引数を渡したりランタイムの初期化処理が入るからダメ。
プログラムエントリをmainに出来るならそれもOK

たとえば、VCのリンカだったら -entry:mainCRTStartupみたいな感じで指定できる。
0943ひげぽんNGNG
>>942
>cygwinだろうがDJGPPだろうが、
>mainに引数を渡したりランタイムの初期化処理が入るからダメ。
>プログラムエントリをmainに出来るならそれもOK

gccの場合↓のオプションのことでしょうか?
-ffreestanding
produce code that is meant to be run without an OS (ie:kernel code)
0944デフォルトの名無しさんNGNG
950の人が次スレたてればいいと思われ。。。
0945デフォルトの名無しさんNGNG
>>937
ひげぽん それ main は要らない。 >>923 は別に主要部分だけ書いたんじゃなくて
あれで全て。
0946ひげぽんNGNG
>>945
深読みしすぎました。
${CC} -c -ffreestanding -Wall ??.c -o ../bin/third.bin
でコンパイルしてcatすればいいはずなのに・・・
bochs異常終了
いったい何をやらかしているのだろう。


他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。
0947デフォルトの名無しさんNGNG
リスティングしてコード読んでみれば?
0948デフォルトの名無しさんNGNG
>>946
ソースうpれ。Makefileも忠実にな。
0949 NGNG
binaryでリンクした方が良い気がするけどなぁ。
*.oのヘッダとか自分で解析するの面倒だし。
0950デフォルトの名無しさんNGNG
>>946
> 他のオブジェクトに依存していない場合は、リンク処理は必要ないですよね。

オブジェクトファイルのヘッダがついてるだろ…
0951デフォルトの名無しさんNGNG
nasm で、セグメント・オーバライト・プレフィックスってどう指定すりゃいいん
でしょうか ? 具体的には、lodsb に CS セグメントオーバーライトしたいんで
す。
 cs:loadsb
とか、
 cs:
 loadsb
とかやってみたけど、エラーになっちゃう。
 db 2eh
 loadsb
とやると、ちゃんと動くから命令としてはサポートしてると思うんだけど....。
0952951NGNG
>>951
間違えた loadsb → lodsb だった。(一番上は、合ってんのに暑さでボケ
てたみたい。)
0953デフォルトの名無しさんNGNG
>>952
cs lodsb
0954デフォルトの名無しさんNGNG
>>951
?
0955ひげぽんNGNG
次スレッドを作りました。
こちらへどうぞ
↓
http://pc3.2ch.net/test/read.cgi/tech/1027080631/
0956951NGNG
>>953
サンクス。でも、これは思いつかないなぁ...。

>>954
アセンブラスレで聞いたほうが良かったかな ? こっちなら、nasm 使ってる人も
多いかと思ったもので...。(ひげぽん Boot をちょっと改造して遊んでたので、
まんざら関係ないわけじゃないということで許してちょ。)
0957デフォルトの名無しさんNGNG
OSをつくろうpart3
http://pc3.2ch.net/test/read.cgi/tech/1027080631/
0958次スレNGNG
OSをつくろうpart3
http://pc3.2ch.net/test/read.cgi/tech/1027080631/l50
0959yujiNGNG
うんこ
0960次スレ案内NGNG
OSをつくろうpart3
http://pc3.2ch.net/test/read.cgi/tech/1027080631/l50
0961デフォルトの名無しさんNGNG
OSのソースを見たいのですが何処で見れるでしょうか
0962デフォルトの名無しさんNGNG
もう見つけたと思うけど
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos/src/
あと次スレがあるからこっちを上げないでね
0963デフォルトの名無しさんNGNG
あげ
0964デフォルトの名無しさんNGNG
日本語でOSってつくれるでしょうか?
是非こっちにきて、言語板の電脳のよくわからない住民に教えてやってくださいな。
http://academy.2ch.net/test/read.cgi/gengo/1028424001/l50
0965デフォルトの名無しさんNGNG
>>964
日本語ニーモニックを開発シル
0966デフォルトの名無しさんNGNG
てsyと
0967デフォルトの名無しさんNGNG
d
0968デフォルトの名無しさんNGNG
0:0には16bitの割り込みベクタがあるから、かな?
0969デフォルトの名無しさんNGNG
0970デフォルトの名無しさんNGNG
うめ、よろし?
0971デフォルトの名無しさんNGNG
こっちも...捧げつつ埋め!

感謝を捧げつつ....てか!?
0972デフォルトの名無しさんNGNG
ひげぽんこっちには来ないかな?捧げ埋め
0973デフォルトの名無しさんNGNG
sa sage ume
0974デフォルトの名無しさんNGNG
ume
0975デフォルトの名無しさんNGNG
埋め立て
0976デフォルトの名無しさんNGNG
埋め、ただしまったりと
0977ひげぽんNGNG
part3がDAT落ちしましたね。残念。
埋め(・x・)
0978デフォルトの名無しさんNGNG
一日一人限定ですか >ひげぽん
0979デフォルトの名無しさんNGNG
うめ!(一日一梅)
0980ひげぽんNGNG
>>978
まったりといきませう。
産め。
0981デフォルトの名無しさんNGNG
あげ
0982デフォルトの名無しさんNGNG
梅肉!!
0983デフォルトの名無しさんNGNG
梅毒!!
0984FreeDOS教徒NGNG
梅田!!
0985ひげぽんNGNG
Women
0986デフォルトの名無しさんNGNG
淋病!!
0987デフォルトの名無しさんNGNG
イブ埋め!
0988デフォルトの名無しさんNGNG
梅とくか。
09891000とりNGNG
でもしようかな
09901000とりNGNG
あと10
09911000とりNGNG
9
09921000とりNGNG
ソロソロ8
09931000とりNGNG
7?
09941000とりNGNG
(@@)
09951000とりNGNG
5?!
09961000とれNGNG
4か!とりてーな
09971000とれNGNG
1000番!
09981000とれNGNG
100000000!
09991000とれNGNG
2000ぬ
10001000とれ@いえい@(・◎・)NGNG
撮ったぞー
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。