OSをつくろうpart2

このエントリーをはてなブックマークに追加
1ひげぽん
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

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

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

Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。
もう外出だよ
32:02/06/18 23:50
Σ(´д`)

・・・・2getシトケバヨカタ・・・
4デフォルトの名無しさん:02/06/18 23:51
1はちょっと本気っぽいな。
がんばれよ。
52:02/06/18 23:51
あ、しかもちゃんとpart2ってあるな・・・


     ||
   Λ||Λ
  ( / ⌒ヽ
   | |   |
   ∪ 亅|
    | | |
    ∪∪
6manko_chinko:02/06/18 23:53
カーネルだけで何万行ぐらいだろう、、、
7デフォルトの名無しさん:02/06/18 23:53
linuxとOSASKを並列にするのもどうかと思うが・・・

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

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


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

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

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

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

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

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

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

ほかにもあったら紹介してほしいな。
46デフォルトの名無しさん:02/06/19 00:37
atheosとかは?
47デフォルトの名無しさん:02/06/19 00:38
>>45
thnx!今はvmwareがあるから便利だね。
Powers CEベースのOSを作るというのはどうですか?
49ひげぽん:02/06/19 00:50
スレッドがにぎわってきてうれしいです。
>>46
明日会社で見て見ます・・・
50ひげぽん:02/06/19 00:56
>>47
vmware上でOSの実験とかって出来るんですかね。
ブートとか。
vmwareつかったこと無いです。
51デフォルトの名無しさん:02/06/19 01:18
現代的な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
52デフォルトの名無しさん:02/06/19 02:06
漏れはPowers CEでOSを勉強した。
Powers CE ってなんだ?
ググってもそれっぽいのが引っかからないが。
patroで検索
さっぱり引っかからん。
直リンくれ。
ここにも粘着君(>>52)が居たか・・・
57ひげぽん:02/06/19 23:07
>>51
ありがとう。
初めて読む486本屋で探してみます。-
58ひげぽん:02/06/19 23:09
さてまじめにOSを作ろうとしている(または挫折した人)
お話をぜひ聞かせてください。
絶版
60ひげぽん:02/06/19 23:13
>>59
まじっすか???
むしろ図書館で探すか。
61ひげぽん:02/06/19 23:25
atheosちょっと見てみました。
やはり、ある程度はアセンブリが必須なんですかね。
vmware誰か使ったことあるっすか???
>>59
おいおい。うそつくなよ(藁
63ひげぽん:02/06/19 23:38
x86アーキテクチャ入門講座
http://ha3.seikyou.ne.jp/home/Joyit/asm/regs.html
アセンブラとかの本は需要が無いのか絶版多し。
65デフォルトの名無しさん:02/06/19 23:51
便乗質問。
昔あった98テクニカルデータブックとか
IBM PC-ATハードウェアバイブルとか
この手のに相当する資料って今はどっから入手するものなの?
持ってる香具師からもらうしかないんじゃないの?
67ひげぽん:02/06/19 23:54
>>64
そうですね。本当にごく少数の人しか今は使わないですよね。
アセンブラで書く部分はコード的には量は少ないけど
きっと重要なところなんですよね。
>>66
ドライバ屋なんかが参考にする書籍って売りに出てないのかなぁ。
69ひげぽん:02/06/20 00:08
>>68
見つけたらぜひ紹介してください。
68さんもOSを作ることに興味があるんですか・
70ひげぽん:02/06/20 00:19
よく見たらアセンブラのスレッドがありますね。
ちょっと今から読んでみます。
>>69
興味はあるけど時間はない(藁
テクニカルデータブックなら手元にあるから
古い98を買って何か作りたいなーなんて、たまに思うくらい。
98関連の資料なら
スーパーテクニック、テクニカルデータブック、GDCテクニカルブック、プログラマーズバイブル
あたりが転がってる。
ほしけりゃ捨てメアド書いておいてくれ。
73ひげぽん:02/06/20 00:35
>>71
なるほど、確かに時間は無いですな。
会社でこっそりやろうかな。
うちも9821があまってる。すごい重いノートだよ。
ひげぽんぽんは今までどんなもん作ってきた?
75ひげぽん:02/06/20 00:56
N88ベーシックから始まり
C,C++,java,perl, ruby をかじりつつ
今はSEやってます。SEって言ってもほとんどPGですが、
うーん何を作ってきたかといわれると困る
仕事では、CでCGI書いたり、シェル書いたり・・・

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

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

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

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

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

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

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

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

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

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

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

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

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

だと思うが。

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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


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

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

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

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

それとも
全部自作??
191ひげぽん:02/06/23 11:14
そういえばunixマガジンもブート特集してましたね。

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

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

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

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

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

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

まったく同じ仕組みでつくろうとは思いませんが、
プロセス間通信とか、パイプの実装とか・・・
勉強になりますね。
タネンバウム(・∀・)イイ!!
199ひげぽん:02/06/24 00:09
良スレハケーン
200 ◆mDa3YTQk :02/06/24 00:17
キャップをつけます。
OSの魔法使い
2002 06/18
その日、2ちゃんねるの漢たちが立ち上がった・・・。
最高のOSを作るべく。


できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか
開発コード: ひげぽん618 とか
204デフォルトの名無しさん:02/06/24 10:31
OS作りたいんだったら、理系の大学へ進学して
NEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。
>>204
趣味でそこまでできません。
206155:02/06/24 15:42
ブートローダはOSの本質的な仕事じゃないな。
grubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか
「メモリの特定アドレスにkernel imageをロードする機能」

「そっから動くカーネル」
は別もんだ。
207デフォルトの名無しさん:02/06/24 18:24
開発コード:ひげぽん0721
>>204
ダメだろ。そう言うところは、自分で OS を1から作ってるわけじゃないからね。
悪く言うと既存の OS を自社のマシンにポーティングしてるだけだよ。
そんなことするぐらいなら、英語の勉強して Linux とか FreeBSD とかのコミュ
ニティに参加した方がいいよ。

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

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

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

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

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

言語はCでは無くC++で書こうかなあ。
そのほうがいろいろ素直にかけそう。
>>212
×JINI
○JNI

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

セマフォ勉強中・・・
217デフォルトの名無しさん:02/06/24 23:39
Javaのyield()ってどうやって実現してるんだろ・・・

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

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

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

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

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

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

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

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

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

よろしくお願いします。
MBRはブートローダーを保存する領域
ブートローダーは保存されるプログラム
244242:02/06/25 23:09
>>243
さっそくのレスありがとうございました。
勘違いしていました。

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

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

>>243
くだらん。

>>245
知らないなら知らないと言えよ。(w
248244:02/06/26 12:35
>>247
ありがとうございます。2000ユーザなので、家に帰ったらやってみます。

>>246
ごもっとも。
あと、英語が少し変です。
>>247
最初の2行だけにしとけばよかったのにな。

>>248
246へのレスは245へのレスか?
どこが変なのか教えてたも
250ウマさんシカさん ◆vBaka42s :02/06/26 22:36
>>244
rawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?
>>248
がんばってください。
でも、日本語が少し変です。
252ひげぽん:02/06/26 23:51
>>242
242さんよろしく。
一緒に学んで行きましょう。

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

間違いや、認識違いを指摘していただけるとありがたいです。
253デフォルトの名無しさん:02/06/27 00:04
>>245
understandの時点でうそ英語
馬鹿丸出しだね。
鈴木アグリー
255デフォルトの名無しさん:02/06/27 00:13
>>253
understoodにするの?
教えてくれ。
256デフォルトの名無しさん:02/06/27 00:20
あんでーすてんど
0000 0001 0000
258デフォルトの名無しさん:02/06/27 06:17
>>232
電波だから気にしない方が良い。


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

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

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

必要性を示してください。
別に2種持ってないとOSがつくれんわけじゃないが、2種取れる程度の知識もないと、
OSの勉強すらままならんだろ。
あんつーれべるのひくさだ。
267264:02/06/27 20:43
>>265
>2種取れる程度の知識もないと、OSの勉強すらままならんだろ。

これは同意。

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


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

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

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

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

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

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

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

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


285デフォルトの名無しさん:02/06/28 17:20
>>272
ほんとかよ。
てっきり俺はJava専門プログラマかと思ったよ。

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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


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

とりあえず『どういうのが欲しいのか』が無いとね。
>>344
文字列の扱いぐらいCの標準関数でも十分汎用性があるが。

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

あれすごく面白かったよね
それじゃあ32bitOSはどうやって動いてるんですか?

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



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


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

32bitリアルモードってなに?
402デフォルトの名無しさん:02/06/30 12:54
(・∀・)シラン
403デフォルトの名無しさん:02/06/30 13:04
protected: (・∀・)mode!!
404デフォルトの名無しさん:02/06/30 13:20
何でプロテクトやねん!!
(・∀・)シラン
406デフォルトの名無しさん:02/06/30 13:34
メモリ保護って事か?

Windowsカーネルは保護されてねーじゃん。どういうことだよ。
407デフォルトの名無しさん:02/06/30 13:35
(・∀・)シラン
408デフォルトの名無しさん:02/06/30 13:38
(゚Д゚)ハア?
409デフォルトの名無しさん:02/06/30 13:39
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
(゚Д゚)ハア?
410デフォルトの名無しさん:02/06/30 14:16
つまり、Windowsはx86を使いこなせてないという事で良いですね。
411仕様書無しさん:02/06/30 14:29
>>410
セグメントを殆ど使ってないLinuxよりはWindowsの方が386の
機能を活用してるように思うけど、どうなんだろう?
412デフォルトの名無しさん:02/06/30 15:07
安定しないで数時間で落ちるOSと、安定してて数十日はもつOSと、どっちが良い?
安定してて数百日はもつOS
414デフォルトの名無しさん:02/06/30 15:10
>>411
なぜそこでlinuxが出てくるのか小一時間
49日毎に確実に落ちるOSと、うまくいけば数百日持つけどハード
が何も使えないOS、どちらが良い?
416デフォルトの名無しさん:02/06/30 15:12
>>413
FreeBSDなら98日という記録をマークすますた。
>>415
不正な処理で49日持たないわなな
418暴走すますた:02/06/30 15:15
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
ハードが何も使えないOS
・・・
>>415
49日があるのはWindows95だけだっけ?
NT系は大丈夫だっけ?
どちらにしろ9x系はだめだね。
NT系がいいよ。2000ならハードもかなり使えるし。
DOSはマイクロカーネル
ケンタッキーフライドチキンを食いたくなった。
422デフォルトの名無しさん:02/06/30 15:21
>>419
カーネル保護されてねーOSが49日持つかよ。
どうせ、PRO串とかDNSとかWINSとかファイルサーバとか限定用途なんだろ?

これくらい一台のPentium PCで出来るはずの事だぞ。
「おい!サーバが、サーバが盗まれたぞ!」
「一台にまとめたんです。何でもできるんですよ。」
>>422
49日の意味知らないだろ。
424422:02/06/30 15:30
>>423
起動合計時間処理がどうたらとか聞いたなぁ。
興味ないんで突っ込まなかったが。

第一、Windows95系で49日持たせる用途なんてねーし。(w
NT系で十分
426422:02/06/30 15:36
49day= 1176 hour = 70560 minute = 4233600 second = 4,233,600,000 ms

つー事かい?
人間はOSですか?
win95はパッチがあるよ>49日

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

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

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

さあ頑張ってHelloWorld 書くぞ。


>>422
> カーネル保護されてねーOSが49日持つかよ。

(゚д゚)ハァ?
初めて読むItanium、蒲池先生書いてくれないかなー
432デフォルトの名無しさん:02/06/30 17:52
>>429
アセンブラでHello Worldを書こうと思ったら
BIOSの呼び出しかVRAMへの直接書込が必要になる。
これにはアセンブラの知識だけじゃなくて、
ハードウェア(のアーキテクチャ)に固有のBIOSなどの知識が必要。
アセンブラの知識だけならこのスレの最初の方で出ていた
インテルの純正マニュアル(pdf)と各種入門サイトで一通りカバーできる。
BIOSなどについてはFreeDOSのソースを見るといいかも。
433ひげぽん:02/06/30 17:54
アセンブラ環境をとりあえず整えてみました。
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:

実行も成功!

どなたかアセンブリ言語の入門に
最適なサイトを紹介していただけませんか?
435ひげぽん:02/06/30 18:21
>>432
入れ違いになっちゃいましたね。
BIOS呼び出しとVRAMへの直接書き込みどちらが、
入門者向きでしょうか?
また、メジャーなOSはどちらを選択しているのでしょうか?
>>435
OSを作るなら当然前者ではありえない。
ただ、前者を使ったモジュールもあるべき。
最初は前者で書いて、あとから後者を追加すればいい。
437俺様のブックマーク:02/06/30 18:24
438ひげぽん:02/06/30 18:30
>>434
>>437
ありがとう。

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

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

勉強の過程を同じような志の人たちにフィードバックできたら
と考えています。
445今更だが・・・:02/06/30 20:10
>>25-32
・・・
446タ僕 ◆njaj0FGY :02/06/30 20:11
>>444
それならSunriseOSがオススメ。
ソースがべらぼうに読みやすい。
>>444
ソース読め馬鹿
448ひげぽん:02/06/30 20:20
とりあえず。

■アセンブラ
    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
    著:蒲池 輝尚
    アスキー出版局
449デフォルトの名無しさん:02/06/30 20:23
>>447
は無視していきましょう。
>>1
は無視していきましょう。
447=450
はきっと寂しいんだよ。
みんな相手してあげて。
452457(!=450):02/06/30 20:52
つか、まじめにスレ読もうとしたおれから言わせてもらうと、
うざいんですけど。

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

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


linuxとかのソースとか。
>>457
知ってる事しか質問してないように見える.
460ひげぽん:02/06/30 21:27
私の質問と、質問の仕方によりご迷惑をおかけいたしております。

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

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

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

464デフォルトの名無しさん:02/06/30 22:28
>>460
ココはOSを作ろうとする人のための質問スレなんだから何でも聞いて良いんじゃない?
オープンに何でも話そうよ。
文字出力するだけでもVGAを叩かなくちゃいけないんですか?
ひげぽんが出てこないと妄想君が議論始めるから
ひげぽんは気軽に出てくるように。
467デフォルトの名無しさん:02/06/30 23:24
たまに出てきてね
うん、次は4年後だね
469デフォルトの名無しさん:02/07/01 01:11
>>465
BIOS叩いてもできるけど結局同じこと。
http://ise-city.no-ip.com/~foo/
↑これひげぽん?
>>436 を読むとBIOSを使うのはあまり良くないようだけど何故なの?
>>471
PCのBIOSはプロテクトモードから呼び出せないし再入可能でもない。
リアルモードで動くシングルタスクのOS以外からは使い物にならんよ。
>>472
目から鱗が落ちますた。
474デフォルトの名無しさん:02/07/01 06:05
>>472
ちょっとまて。
そうかといって本格的にOS作り始めたとき山のようにドライバ書かなくちゃならなくなるんじゃ?
BIOS叩いてやれば少なくともドライバがないから画面真っ黒とかいうことにはならんと思うが。
なにをいまさら
476デフォルトの名無しさん:02/07/01 19:41
>>474
たうぜん
477デフォルトの名無しさん:02/07/01 19:42
まいくろかーねるにしようぜ。いい加減。
478ひげぽん:02/07/01 22:07
SunriseOSのソースを眺めてちょっとずつ勉強しています。
とりあえず自分なりにコメントを付加してみました。
15%も理解していないですが・・・
これから理解を深めます
osimg.asm ブート部分
479ひげぽん:02/07/01 22:09

; --------------------------------------------------------
; 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から始まる事を示す
480ひげぽん:02/07/01 22:11


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 ;■呼び出し元に戻る
481ひげぽん:02/07/01 22:12

; -------------------------------------------------------
; 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
大学でOSの作成経験あり↓
http://pc.2ch.net/test/read.cgi/tech/1025441630/116
483ひげぽん:02/07/01 22:15
ソースのレイアウトがくずれてしまいました.
484デフォルトの名無しさん:02/07/01 22:27
帰ってきたひげぽん。
おかえりーー
485ひげぽん:02/07/02 00:03
これから少しずつソースを読んで行こうと思います。
良いリファレンス、ひげぽんの間違い指摘、アドバイス等ありましたら
ぜひ書き込みください。

まずはこの部分から。
>;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

勉強が足らないですね。

486ひげぽん:02/07/02 00:06
良いリファレンスを探さねばと、痛感しております。
もう英語でもいいから、いいところ無いかなあ。
スタックはss:spになる。
それだけだろ?
>>485
はじめて読む486の最後の方の命令セット一覧見てご覧よ。
セグメントレジスタに即値を mov できないでそ。
489ひげぽん:02/07/02 00:31
>>487
ありがとう
axを介しているのはなぜでしょうか?
cli
mov ss, 0x9000
mov sp, 0
sti
で良い様に見えるのですが何か理由があるのでしょうか。
490ひげぽん:02/07/02 00:32
>>488
・・・すいません入れ違いになりました。
ありがとう。
491デフォルトの名無しさん:02/07/02 01:23
うーん、ひげぴん、がんばってるなぁ
一般的に、
i++ ; // iに1足す。
みたいなコメントは、かな〜り逝ってよしです。
とりあえず、アセンブラ初心者はそれで良いんじゃないの?
レジスタの名前は決まっちゃってるんだし、コメントがあっても邪魔じゃないだろ
アセンブラはそれこそ

mov ax,0x9000
mov ss,ax

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

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

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

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

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


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


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


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

>ここは本当に意味が分からないです、axに0をセットしているものの、
>これ以降どこかでつかっていないように見えるのですが。。。

int13hでつかってるんだろ。
>>500さん、すてき!
天才。まじで。
502ひげぽん:02/07/03 00:17
>>500 さん
ありがとう。
これをヒントにいまint 13hを調べております
503ひげぽん:02/07/03 00:22
とりあえずこんなの見つけました。
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 グラフィックフォント)
504500:02/07/03 00:31
つーかな、
http://www.cse.iitd.ernet.in/~csu98123/old/home/learn/os/nasmBoot.html
くらいはすぐに見つかるだろ。
505!ひげぽん:02/07/03 00:39
>>504 500さん、あなたは英雄です。
すごすぎます。
506ひげぽん:02/07/03 00:39
>>504
ありがとうございます。
int,13h,axをキーワードにWebをさまよっていました。

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

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

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

http://www.ascii.co.jp/books/support/apc/4-7561-0213-1.html
調子はどうだひげぽん
ローダくらいはできたか
512ひげぽん:02/07/03 21:16
>>507 >>508 >>510
ありがとう。
はじめて読む486一応読み終わりました。(かなり斜め読み)

仕事から帰ってから1,2時間しか時間が無いので
進みは遅いですがよろしくお願いいたします。

ソースレイアウトがくずれるのが、見づらいのですが、
半角空白を&nbsp;で置き換えるしかないのでしょうか?

513ひげぽん:02/07/03 21:44
皆様のご好意により資料が増えましたので
コメントを書き換えました。
; --------------------------------------------------------
; 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から始まる事を示す
514ひげぽん:02/07/03 21:45
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を実行
515ひげぽん:02/07/03 21:46

    ;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



516ひげぽん:02/07/03 21:50

;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
517ひげぽん:02/07/03 21:57
ソースの概要および実行順序を今分かっている分を書いてみると

(1)外部割込み禁止
(2)スタックのセットアップ
(3)外部割り込み可能にする
(4)ブートドライブ情報保存
(5)ディスクをリセットする
(6)ディスクを読んでメモリにセットする
(7)読み込んだプログラムへジャンプする???

でしょうか。
518ひげぽん:02/07/03 21:59
>>511
もう一息です、がんばります。

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


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

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

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

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

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

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

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

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

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

542ひげぽん:02/07/05 11:32
誤 BIOSってさまさまですね
正 BIOSさまさまですね
>>541
>>535の最後の質問への回答きぼん。
544ひげぽん:02/07/05 12:38
>>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のルーチンを呼び出すのです。
引用ここまで

良く分からないです。

545ひげぽん:02/07/05 12:40
CALL FAR で呼び出されているのは何でしょうか?
スタックに0x1000:0000を積んで、そのアドレスにretfで戻る(飛ぶ)。
retだから呼び出し元に戻るという考えは捨てよ
547ひげぽん:02/07/05 13:04
確認です

>;jump to the loaded program
>
>mov ax,0x1000
>mov es,ax
>mov ds,ax
>push ax
>mov ax,0
>push ax
>retf

retfの手前では
ax →0
es →0x1000
ds →0x1000
スタックには、0x1000と0が積まれています。

>>546さん
>スタックに0x1000:0000を積んで、そのアドレスにretfで戻る(飛ぶ)。

retfはどのレジスタ(スタック)を参照してそのアドレスに飛ぶのでしょうか?
それ以外のレジスタは、とんだ先で実行されるコードで参照されるためのものでしょうか?

質問ばかりで申し訳ないですが、お願いいたします。

今日は仕事はお休みのため、勉強するチャンスです。


retfだけじゃなくてretn(ret)もスタックの一番上から
アドレスを取り出してそこにジャンプする命令
>>544
なんでこのページは第7章しかないの?
はじめから見てみたい。
目次の場所教えて。
archive.orgへ逝け
551ひげぽん:02/07/05 16:42
そろそろ自分でソースを書きそうなのですが
アセンブラのソースって、どういうインデントが良いのかなあ。
コメントは、日本語英語どっちがいいんだろう。
PJ名(仮称)はどうしよう。
552デフォルトの名無しさん:02/07/05 17:46
>コメントは、日本語英語どっちがいいんだろう。
本気なら英語のほうが良い。
でも2chでは日本語のほうが良いかも。

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

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

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

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

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

アプリケーションプログラマには関係ないし。
日本語はUTF-8だのSJISだのEUCだのの変換が面倒かもな。
せっかくだからUCS4ネイティブで行きましょう。
567ひげぽん:02/07/05 20:35
>>565
コメントは英語で行くことにしました。
いんちき英語にならぬよう祈るのみです。

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

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















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

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

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

PC のブートの勉強用としてはこんなのもある。
ttp://www.rbt.his.fukui-u.ac.jp/~naniwa/comp/OS/

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

参考になるかな。
579ひげぽん:02/07/06 16:52
>>578 さん
ありがとう。
nasmで書かれたbootソースというだけでも
大変助かります。

Bochs等お詳しそうですね。
今後もアドバイス頂けるとうれしいです。
580578:02/07/06 21:54
単なるマイナー OS オタなのでアドバイスは無理っぽい。
581ひげぽん:02/07/06 22:00
>>580
では、580さんに目をつけてもらえるようになったら
マイナーOSの仲間入りですね(笑)
早くそうなるようにがんばります。
582ひげぽん:02/07/06 22:01
;-------------------------------------------------------------------------------
; 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
583ひげぽん:02/07/06 22:04
やっと動くものを自分で作れました。
>>582のソースをnasmでコンパイルして
フロッピーディスクにddコマンドなどでコピー
ブートすると"2ch"の文字が!!

全然たいしたものではないのですが、やっぱりうれしいですね。
584ひげぽん:02/07/06 22:15
上記ソースだと文字列を表示するのが大変なので
↓のようにしたのですが
"Hello!"の後に文字化けした文字列が出てしまいます。
なぜでしょうか?

msg     db  'Hello!'

start:

        mov si, msg
print:
        lodsb      

        cmp al, 0  
        je hang

        mov ah, 0Eh
        mov bx, 7
        int 10h

        jmp print  
>>584
'Hello!' の後ろに、00h がないからじゃないの ? アセンブラは、C みた
いに "ABC" で 00h は付加してくれないよ。
Intel 系のアセンブラは良くわかんないけど...
msg db 'Hello!', 00h
とか書けばいいのでは ?
>>584
msg db 'Hello!' を
msg db 'Hello!$'
cmp al, 0 を
cmp al ,'$' にしてみては?
587586:02/07/06 22:43
わーだぶっちゃったごめんなさい
588ひげぽん:02/07/06 23:03
;-------------------------------------------------------------------------------
; 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
589ひげぽん:02/07/06 23:04
>>585 586
thanks!!
これで結構すっきりかけたと思います。
590585:02/07/06 23:11
>>586
なんか懐かしい。そう言えば、Intel 系って文字列のターミネータが何故
か '$' だったよね。Motorola 派 (流派かよ!!) としては、結構不思議
でした。

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

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

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

ってことで、mingw32とnasmをインストール。
598592:02/07/07 11:57
Technical Documents Related to Bochs
http://bochs.sourceforge.net/techdata.html
599ひげぽん:02/07/07 12:03
いくつか疑問点があります。

>[ORG 0]
>
>jmp 07C0h:start

セグメント07C0hに行くということだと思うのですが、
どういう意図なのでしょうか?
意味も分からず書いていました。


>        msg db  'Hello 2ch World!', 00h
>
>start:
>        mov ax, cs              ; what??
>        mov ds, ax              ; what??
>        mov es, ax              ; what??

csの値を、ds,esに設定しているのですが、
これは絶対必要な処理なのでしょうか?

7c0h:startはseg:offの形式だっつーの。
cs=dsとはコードとデータが同一セグメントにあると言うこと。
vcのリンカ設定で言うなら、/merge:.data=.textってことサ
602ひげぽん:02/07/07 12:26
ありがとうございます。

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

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


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

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

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

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

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

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

ところがjmp 0x7C0:startとすると
ブートプログラムは、セグメント0x7C0の先頭の場所へロードされる。

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

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

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

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


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

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

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

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

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


日本語が変ですが、609さんのおかげで分かってきました。
613609:02/07/07 16:57
正解。
614ひげぽん:02/07/07 17:06
>>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
615ひげぽん:02/07/07 17:07
;-------------------------------------------------------------------------------
; 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
616ひげぽん:02/07/07 17:17
>>609さんのおかげにより
ディスクリセットまでこぎつけました。

次は、ディスクの513byte以降を、或るセグメントに読み込み
そのセグメントにjmpすれば、そのコードが実行される!!
ということを実現しようと思っています。

この読み込まれるプログラムをアセンブラオンリーでなく
Cオンリーまたは、C with インラインアセンブラで書きたいのですが、
どのような環境を整えればよいのでしょうか?

ひげぽんの環境は、
Windows XP Pro
NASM
C++のコンパイラは、
cygwin のgccと、VC++6.0 standardです。

すいません。まだ分からない奴がいるんですが、

>>605 に関連して

org 0x7c00
mov ax,cs
mov ds,ax
mov es,ax

なら jmp 07c0h:start をしなくても ok って事?

あと、
jmp offset
は相対アドレスのジャンプで、
jmp segment:offset
は絶対アドレスのジャンブって事ですか?
>>616
それは取り敢えずリアルモードのまま?
>>616
まだプロテクトモードに入ってないから、
32bitコンパイラは使えないよ。

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


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

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

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

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

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

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

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

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

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

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 ;リロケーション情報

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

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

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


632まだ分からない奴:02/07/07 18:08
話題が映っているのに恐縮ですが、、
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 に入り切らない場合は
絶対アドレスジャンプの命令に置き換わっていた気がしますが、、
633609:02/07/07 18:19
>>632
ザッツライトです(汗
私の言っていることが不正確でした。

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

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

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

635592:02/07/07 18:45
>>632
shortは8bit相対ジャンプ
nearは16bit相対ジャンプ
farは32bit(seg:off)絶対ジャンプ。

リアルモードでプリフィックスなしではこうなるはず。
おれも知りたいコンパイラ。
637ひげぽん:02/07/08 00:48
OS開発環境を整えるページを見つけました。
http://www.osdev.org/developers/guide01/

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

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



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

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

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

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

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

Windows上で動くフリーのコンパイラって事らしい。ちなみにGPL。
656655:02/07/08 22:12
【追加説明】

MinGW: Minimalist GNU For Windows

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

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

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

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

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

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

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

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

jmp 07C0h:start

start:

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

jmp hang

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

hang:
jmp hang

times 510-($-$$) db 0
dw 0AA55h
----------------
んじゃ、ひげたんこれからもガムバテネ。
>>662
httpリクエストのAccept-Languageヘッダ見てるだけだと思うが。
666デフォルトの名無しさん:02/07/08 23:46
とりあえず、スナップショットが実行可能形式配付ファイルだと思われる事は解った。
最新版は1.0.8。
386、586、686、って分かれてるな。最適化済みの実行ファイルって事か。
なんかexeっぽいけど何だ?インストールプログラムかな?

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

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

gcc-coreはc/c++コンパイラも含んでる
669ひげぽん:02/07/08 23:54
なんだか盛り上がって来てうれしいですね。

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

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

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

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

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


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

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

ちなみにNASM&BochsはWin版を使ってます。
672666:02/07/09 00:08
あり?良いのか。

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

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

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

673ひげぽん:02/07/09 01:14
>>669
前言撤回Mingwやめました。
DJGPPにしました。

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

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

>-ffreestanding
>produce code that is meant to be run without an OS (ie:kernel code)
>-c
>compile but don't link (creates an object file)
678デフォルトの名無しさん:02/07/09 22:34
gcc 使う場合リンカは何使うの?
オレ gcc の標準の ld を使おうかと思っているけど
-oformat output-format を何にしたら良いか分からなくて止まってる。
ぐぐっても良く分からないよ〜。
679ひげぽん:02/07/09 23:08
>>678
試してはいませんが、
OS developer's siteでは、
ld -Ttext 0x100000 --oformat binary -o
ld -o xxx -Ttext 0x0 -e main xxxx.o
のようなものを使っていた。
>>679
(・∀・)ソレダ!!
ちょっと分かった。
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バイトはオールアセンブリで書いて
その中でフロッピーをメモリに読みこんでプロテクトモードにして
それから、上のようにして作った実行イメージを呼び出さなきゃダメっぽい。
682ひげぽん:02/07/10 00:27
>>681
681さん、同じところで悩んでいますよね。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>step1.5
>1st boot, 2nd bootともにオールアセンブリで、 VRAM直接アクセスで "Hello higepon"
を書いてみました。
693ひげぽん:02/07/10 21:48
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
694ひげぽん:02/07/10 21:49
;-------------------------------------------------------------------------------
; 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'
695ひげぽん:02/07/10 21:51
;-------------------------------------------------------------------------------
; 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
696ひげぽん:02/07/10 21:51
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
697ひげぽん:02/07/10 21:52
;-------------------------------------------------------------------------------
; 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
698ひげぽん:02/07/10 21:53
>663さんに感謝
699デフォルトの名無しさん:02/07/10 21:55
ひげぽんさん、サイト作ろうよ
プロテクトモードに移行したあとの次の命令で、Bochsは3rd exeptionって言ってくる
んですがなにが原因なんでしょう?誰か助けてー
701デフォルトの名無しさん:02/07/10 22:06
/cpu/exception.cppによれば,
---
BX_CPU_THIS_PTR errorno++;
if (BX_CPU_THIS_PTR errorno >= 3) {
BX_PANIC(("exception(): 3rd exception with no resolution"));
BX_ERROR(("WARNING: Any simulation after this point is completely bogus."));
#if BX_DEBUGGER
bx_guard.special_unwind_stack = true;
#endif
return;
}
---

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

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

bits16
lgdt[gdtr]

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

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

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

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

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

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

hang:
jmphang

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

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

ブートローダ

カーネル

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

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

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

>>722をちょい訂正。

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

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

http://sources.redhat.com/newlib/
731718:02/07/12 01:27
OSに依存しないドライバインターフェース…らしい。

Uniform Driver Interface
http://www.projectudi.org/
732718:02/07/12 03:09
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/
いま、 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 ポートアクセスがあったらまずい気がするなぁと感じるけど
それであってる?
734718:02/07/12 06:58
mingwでld --helpしたらelf32-i386とか出てたからELFバイナリ吐けると思ったらダメらしい。
素直にPEにしておくか。

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

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

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

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

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

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

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

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

ぐぐったら windows での話は出てきたけど、これってコンパイラ依存の
話だからgcc なら別だよな?
そんなもん、gccで関数をasm出力すれば
わかるだろうに。
edi
746654:02/07/13 22:45
>>741
Thank you.
これから調べてみます
プロテクトモードでjmpするとエラーになってしまう...なんでだー
748FreeDOS教徒:02/07/13 23:27
>>654
ヴぁー、申し訳ない。あれcommand.comの作り方だった‥‥
カーネルはあそこの説明のとおりでよかったです。

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


750ひげぽん:02/07/13 23:37

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
751ひげぽん:02/07/13 23:39
;-------------------------------------------------------------------------------
; 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
752ひげぽん:02/07/13 23:39
gdt10:                          ; segment 10(data segment)
        dw 0xffff               ; segment limitL
        dw 0                    ; segment baseL
        db 0                    ; segment baseM
        db 0x92                 ; Type Data
        db 0xcf                 ; segment limitH
        db 0                    ; segment baseH

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

gdt_end:                        ; end of gdt

hang:
        jmp hang
print:
        mov [edi], al
        add edi  , 2
        ret
>>749
gdt08のセグメントベースは10000hにしてみてはどうでしょうか?
違うかな
>>747
は既に解決してますか?まだなら俺にちょっと心当たりがあります。
もしかして、cs を 08h とかそう言うGDTRで設定したセグメントにする前の段階の話じゃないですか?
>>750>>751 の間に抜けてるものはない? コピペミスじゃない?
mov sp,0x1000 のあとに jmp が必要でしょ。
756ひげぽん:02/07/14 00:03
>>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
757ひげぽん:02/07/14 00:06
>>755
おっしゃるとおりコピペミスです。
jmp hang
があります。
ひげぽんまだ寝るなよ。あとで、アドバイスすっから。
759747&753:02/07/14 00:10
>>754
それが設定した後なんです。
それと753に書いたの間違えました。
dw set_cs_desc1+1000h
は+10000hではないでしょうか?
760ひげぽん:02/07/14 00:11
>>758
ありがとうございます。
お待ちしております。
よろしくです。
>>759
そうですか、じゃあ関係ないかもです。役に立てんでごめんです。
あと、 10000h は dw に入らないんじゃない?


ひげぽんは >>750 からのコードどこに置いた? 1000h?
あと、エラーのときの IP も書いて欲しい。それがそのコードどこにあたるのかとかも
それから
bochsout.txt の
00010420000i[CPU ] protected mode
00010420000i[CPU ] CS.d_b = 32 bit
00010420000i[CPU ] SS.d_b = 32 bit
↑ここの部分はどうなってた?
まとめると、多分こう言うことだ。
エラーのとき CSが1000hになっているってことは、
コードはリニアアドレスで 10000h に置いたってことだ。
だから、
dw set_cs_desc1 + 1000h
ここは、
dw set_cs_desc1 + 10000h
にしなければ行けない。(リニアアドレスを書かなければ行けないから)

でもそれだと dw に入らない。

結論もっと低いアドレスに置くべき。
おいっ!寝たのかよ!!レスしろよ。

あと32ビットモードになったら bits 32 にしないとだめだよ。
ちっ、寝ちまったか。
------------
bits 16
L1: jmp L1
bits 32
jmp L1
------------
じゃ、起きたら、このコードをアセンブルしてそれをdumpで見て
それが何を意味するのかよーく考えろよ。
じゃな。
765ひげぽん:02/07/14 00:38
>>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
766ひげぽん:02/07/14 00:42
>>762
dw set_cs_desc1 + 10000h
としてみて、アセンブルすると
通ってしまうのですが、Okなのでしょうか。
767ひげぽん:02/07/14 00:43
>763 764
入れ違いです。すいません。
768747:02/07/14 00:43
調べるてみると
label:
jmp label
はだめで
jmp label
label:
はエラーなしでした。
>>765
もし1000hなら
dd gdt0+1000h*16
の*16hがいらないのではないでしょうか?
ひげぽん(・∀・)オキテタ!!

>>765 それなら、>>762 で決まり。
>>766 OKじゃねえよ。できたバイナリ見ろよ。
770デフォルトの名無しさん:02/07/14 00:46
>>768
CPUが32bit モードになっているのにbits 32を書いてないので、
コードが32bit用に成っていないのでは? >>764 は試してみた?
771デフォルトの名無しさん:02/07/14 00:48
>>765
CS が 1000h になっているのに実行イメージが1000hに置かれてるって
なんか勘違いしてませんか?
772ひげぽん:02/07/14 00:55
>>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に読み込まれた実行イメージにジャンプするという
認識だったのですが、もしかして出発点から間違ってます?
773ひげぽん:02/07/14 00:58
>>769さん。
上記>>772
の1000hの部分を0100hにしてかつ、
[bits 32]
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h
        jmp  hang
および
gdtr:
        dw gdt_end - gdt0 - 1   ; gdt limit
        dd gdt0 + 100h    ; start adderess
としてみましたがだめでした。
>>772
それなら、リニアアドレスでは10000hになるのは分かる?
そして、flush_q1 の後のジャンプの場所指定で書かなければいけないのはリニアアドレス。
(なぜならもうプロテクトモードなんだし、08 のコードセグメントのベースが0に成っているから)
>>773
違う。 gdtr の所の start addressはリニアアドレス。
あと、「上手くいった/だめだった」の二元論ではなくどこでエラーが
起きたのかが重要。ダメなときはどこで止まったのか調べないと。
776ひげぽん:02/07/14 01:02
>>774
なるほど良く分かりました。
ということは、もともとのCS * 16するってことですよね。
でもうまくいかないです。
だいぶ前進したとは思うのですが、
777ひげぽん:02/07/14 01:07
>>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)
778ひげぽん:02/07/14 01:09
移行時に実行していること
gdtr:
        dw gdt_end - gdt0 - 1   ; gdt limit
        dd gdt0 + 100h * 16     ; start adderess
----
[bits 32]
flush_q1:
        db 0eah
        dw set_cs_desc1 + 100h * 16
        dw 08h
        jmp  hang

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

質問ばかりで申し訳ないです。
>>782
デバッガある?
784ひげぽん:02/07/14 01:35
>>783
DJGPPにgdb.exeがついてきていましたが
これでよいですか?
使ったことがないのですが、これで出来るなら
明日にでも勉強いたします。
gdbで、いいかどうかはちょっと分からない。
ベクターとかにありそうなMS-DOS用のcomファイルを調べられるの使うのが良い。
あとは、nasm の -l オプションかな。
786ひげぽん:02/07/14 01:41
遅くまでありがとうございます。
実行しながらデバッグするのでしょうか?
それだとBochsの機能でなにかあるのかなあ。
もしかしたら bochs にそういう機能があるかもしれないけど俺は分からん。
つうか、今はどこでエラーが起きたのか分かれば良いんだから、
実行しながらデバグなんてしなくて良いよ。
-l は試した? 結局 3b ってどこなのさっ!!
788747:02/07/14 01:47
なにも変更してないのに突然エラーなくなりました。わけわからん。
相談に乗っていただいた方どうもありがとうございました。
>>747
おめでと。役に立てなくてゴメン。
またなんかあったら聞いてね。今度こそ役立つアドバイスするカラ
790747:02/07/14 02:50
またエラーになった...もう寝よう
791ひげぽん:02/07/14 11:56
おはようございます。
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はどこにあるのでしょうか。
792ひげぽん:02/07/14 12:46
いろいろ調べてみると
プロテクトモード移行直後の
jmp flush_q1以降で死んでいるようです。
jmp hangとすると3rd exceptionは発生しませんでした。
今でも死ぬときのIPは 3bなの?
794ひげぽん:02/07/14 13:16
ええ。
3bです。こんな感じです。
00000195256i[CPU ] | EIP=0000003b (0000003b)
>>792
現在のコードはどうなってるの?
796ひげぽん:02/07/14 13:19
[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
797ひげぽん:02/07/14 13:20
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
798ひげぽん:02/07/14 13:20
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
799ひげぽん:02/07/14 13:20
[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
800ひげぽん:02/07/14 13:21
>>795
板を汚して申し訳ありません。
現状は上記の通りです。
もしかして>>791は1stブートのやつじゃ、、
802ひげぽん:02/07/14 13:35
>>801さん。
ええその通りです。
BIOS経由で文字列出力する部分です。
nasmでアセンブルするときはひとつにまとめるので
リストもfirst boot, second bootもあわせたものになっています。

>>802
Σ(゚д゚lll)ガーン もっと考えれ。
second boot の先頭を 0 として 3b がどこかを調べなきゃ意味ないだろ。
804795:02/07/14 13:37
>>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

こっちも。

あと、どっかに垢取ってそっちにコード全体を上げた方がいいかも。
805ひげぽん:02/07/14 13:46
>>803
>>804
もっと考えます。
いま、とりあえず垢をとっています。
もしかしてひげぽんは
1st-boot と 2nd-boot くっつけてアセンブルしない?
別々にアセンブルしてからくっつけた方が良いかも
807795:02/07/14 13:54
あと、ベースアドレスが00010000h、リミットが0000FFFFhで16ビットのセレクタを用意して、
そっちで作業した方が楽だと思われ。
ベースアドレスが00000000hのセレクタに切り替えると、オフセット計算が面倒なことになる。
>>806の詳しい解説
1st-boot は、 2nd-boot の先頭が 1000hにくるように
ディスクをロードする。
だから、2nd-boot の先頭から数えた offset に 1000h を加算すれば
それがちょうど リニアアドレスになる。
しかし、ひげぽんは1st-bootと2nd-boot をくっつけて
アセンブルしているので、offsetがずれてしまう。
nasm -l の出力で
dd gdt0 + 100h * 16 ; start adderess
dw set_cs_desc1 + 100h * 16
この2行がどうアセブルされているか見てみ。
前者が [1B100000] 後者が[4010]なら正しいぞ。
でもそうなっていないはず。
で、今度はばらばらにアセンブルしてみな。
すると上のようになるはずだ。それを確認したら
copy とか dd とかつかって二つをくっつける。
これで上手く行くはず。
809795:02/07/14 14:12
>>808
>>696でes:bxが1000:0000だからリニアアドレスは00010000hだって。
>>809
>>777見れ
811ひげぽん:02/07/14 14:14
>>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さんのおっしゃる通りになってました。
今から別々にアセンブルを試してみます。
812809:02/07/14 14:35
>>810
 ∧||∧
(  ⌒ ヽ
 ∪  ノ >>773で変更してたのね…
  ∪∪
ドマイ。オフセットをWORDに入れなきゃだから。
>>807みたいな手もあるけど、、、、。
814ひげぽん:02/07/14 14:39
ひげぽんです。
皆さんありがとうございます。
別々アセンブルでも同じIPでエラーが起きてしまいました。

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

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


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

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

この時のDSレジスタの値は?
firstbootで設定された07C0hを引きずってるように見えるが。
822ひげぽん:02/07/14 18:57
>>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)
823821:02/07/14 19:04
じゃ、それが原因。

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

こんなシナリオかと。

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

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

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

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

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

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

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

スマソ、cs:[gdtr]はmasmの書き方だった。
nasmでは[cs:gdtr]。
827821:02/07/14 19:31
> gdtrの指すアドレスは0100:0015。
> 実効アドレスは00000115h。

嘘書くなよ、俺。
00001015hが正解。
828821:02/07/14 19:32
つーか、実効アドレスの意味間違ってるような。
実効アドレス→リニアアドレスに訂正。
829ひげぽん:02/07/14 19:37
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
でもうまくいきました。

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



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

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

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

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

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

私と同様に、OSを本気で作ろうと考えている人たち
一緒にがんばりましょう。
ひげぽんまだいる?もう少し補足がある。
834ひげぽん:02/07/14 20:08
>>833
います。
835833:02/07/14 20:19
ごみん。間違い。>>833 は忘れて。
836ひげぽん:02/07/14 20:28
>>835
了解です。

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

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

どなたかかっこいい名前ありませんか?
higepos
838ひげぽん:02/07/14 20:35
>>837
>higepos
ちなみになんて読むの?ひげぷおーえす?
もし万が一、有名になって、ちょっとでも外人に名前が知られるように
なったとしたら、なんて発音するんだって揉めそう(←もめないって?)

ヒゲポソ
840=・ :02/07/14 20:36
まんこ
841ひげぽん:02/07/14 20:37
>>839
あ!半角カタカナにして、2chであることを考慮すると
読めるってことですね。
良い名前随時募集中!!
842デフォルトの名無しさん:02/07/14 20:44
2chOS
2ちゃんどうず
844ひげぽん:02/07/14 20:56
>>842
>2chOS
見た目は非常に良いですね。
にちゃんおーえす?
にこす?

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

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

しっかし、いい名前っていうと思いつかんなぁ
GATES FREE
847ひげぽん:02/07/14 21:22
>>845
>OSASK -> おさすく/おーえすあすく
>NWSOS -> なうえすおーえす‥‥と呼んでいる
なるほど。
おさすくかあー

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

フルアセンブラで、

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

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

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

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

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

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

迷うので明日の朝起きてから考えよう。
ひげぽんは、結構質問屋だけど

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

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

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

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

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

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

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

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

これが関東標準だぞ。
915志津:02/07/17 19:59
>>913
てか、どこにすんでんの
916志津:02/07/17 19:59
>>912は関西標準
3chはSunTVが畿内標準デス
918913:02/07/17 20:05
私は名古屋です。
地方で違うんですね。知りませんでした。板汚してごめんよ
でも900超えたからいいかな?
これのことだろ。

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

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

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

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

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

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

char *vram=0xb8000;

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

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

#define vram ((char *)0xb8000)

void c_prog()
{
vram[0]='A';
}
うん。まあ上のどれか試してみて報告しれ。
924904:02/07/18 02:22
>>905
どうもありがとうございました。無事動くようになりました!!
925924:02/07/18 03:32
躓いた大きな点を参考にならないかと思いますが書いておきます。
・1トラック当たりのセクタ数は18
・binary形式だと.dataセクションや.bssセクションを使うときにだめっぽい
・そこでcoff形式にしたところ始めの部分はいらないので
 ddでそこを飛ばして書きこむ必要がある。
ちなみにgccでつけたオプションはインターフェースに載っていたのも踏まえて
-nostdlib -g -Wall -W -O2 -fcall-used-ebx -fno-common\
-fnhibit-size-directive -fomit-frame-pointer -fno-ident -fno-builtin -c
でした。
> 925
リンかスクリプト使えって。

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

てな感じで。

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

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

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

ただいま原因究明中。

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

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

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

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

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


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

オブジェクトファイルのヘッダがついてるだろ…
951デフォルトの名無しさん:02/07/19 17:02
nasm で、セグメント・オーバライト・プレフィックスってどう指定すりゃいいん
でしょうか ? 具体的には、lodsb に CS セグメントオーバーライトしたいんで
す。
 cs:loadsb
とか、
 cs:
 loadsb
とかやってみたけど、エラーになっちゃう。
 db 2eh
 loadsb
とやると、ちゃんと動くから命令としてはサポートしてると思うんだけど....。
952951:02/07/19 17:26
>>951
間違えた loadsb → lodsb だった。(一番上は、合ってんのに暑さでボケ
てたみたい。)
>>952
cs lodsb
>>951
955ひげぽん:02/07/19 21:11
次スレッドを作りました。
こちらへどうぞ

http://pc3.2ch.net/test/read.cgi/tech/1027080631/
956951:02/07/19 22:19
>>953
サンクス。でも、これは思いつかないなぁ...。

>>954
アセンブラスレで聞いたほうが良かったかな ? こっちなら、nasm 使ってる人も
多いかと思ったもので...。(ひげぽん Boot をちょっと改造して遊んでたので、
まんざら関係ないわけじゃないということで許してちょ。)
958次スレ:02/07/20 11:50
959yuji:02/07/25 21:01
うんこ
960次スレ案内:02/07/26 12:09
961デフォルトの名無しさん:02/08/25 16:41
OSのソースを見たいのですが何処で見れるでしょうか
もう見つけたと思うけど
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos/src/
あと次スレがあるからこっちを上げないでね
963デフォルトの名無しさん:02/09/09 21:09
あげ
日本語でOSってつくれるでしょうか?
是非こっちにきて、言語板の電脳のよくわからない住民に教えてやってくださいな。
http://academy.2ch.net/test/read.cgi/gengo/1028424001/l50
965デフォルトの名無しさん:02/09/10 23:11
>>964
日本語ニーモニックを開発シル
966デフォルトの名無しさん:02/10/24 05:21
てsyと
967デフォルトの名無しさん:02/11/02 22:26
0:0には16bitの割り込みベクタがあるから、かな?
969デフォルトの名無しさん:02/12/08 02:23
うめ、よろし?
こっちも...捧げつつ埋め!

感謝を捧げつつ....てか!?
ひげぽんこっちには来ないかな?捧げ埋め
sa sage ume
ume
埋め立て
埋め、ただしまったりと
977ひげぽん:02/12/18 23:22
part3がDAT落ちしましたね。残念。
埋め(・x・)
一日一人限定ですか >ひげぽん
うめ!(一日一梅)
980ひげぽん:02/12/21 16:59
>>978
まったりといきませう。
産め。
981デフォルトの名無しさん:02/12/22 18:39
あげ
梅肉!!
梅毒!!
984FreeDOS教徒:02/12/23 10:23
梅田!!
985ひげぽん:02/12/23 10:49
Women
淋病!!
イブ埋め!
梅とくか。
9891000とり:02/12/24 12:44
でもしようかな
9901000とり:02/12/24 12:47
あと10
9911000とり:02/12/24 12:47
9
9921000とり:02/12/24 12:48
ソロソロ8
9931000とり:02/12/24 12:48
7?
9941000とり:02/12/24 12:50
(@@)
9951000とり:02/12/24 12:50
5?!
9961000とれ:02/12/24 12:52
4か!とりてーな
9971000とれ:02/12/24 12:53
1000番!
9981000とれ:02/12/24 12:53
100000000!
9991000とれ:02/12/24 12:54
2000ぬ
撮ったぞー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。