5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

OSをつくろうpart2

1 :ひげぽん:02/06/18 23:48
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

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

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

Javaマシン(バイトコードをそのまま処理するやつね)上で
動かすなら事情は違うのでしょうけど。

2 :デフォルトの名無しさん:02/06/18 23:49
もう外出だよ

3 :2:02/06/18 23:50
Σ(´д`)

・・・・2getシトケバヨカタ・・・

4 :デフォルトの名無しさん:02/06/18 23:51
1はちょっと本気っぽいな。
がんばれよ。

5 :2:02/06/18 23:51
あ、しかもちゃんとpart2ってあるな・・・


     ||
   Λ||Λ
  ( / ⌒ヽ
   | |   |
   ∪ 亅|
    | | |
    ∪∪

6 :manko_chinko:02/06/18 23:53
カーネルだけで何万行ぐらいだろう、、、

7 :デフォルトの名無しさん:02/06/18 23:53
linuxとOSASKを並列にするのもどうかと思うが・・・

けどアセンブリで書かなきゃいけないところってそんなに多くないよね。

8 :デフォルトの名無しさん:02/06/18 23:55
アセンブリで書かないと逝けないのはブートローダーと、
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作成にかかわる部分で・・・

12 :デフォルトの名無しさん:02/06/18 23:59
>>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エミュレータ用
の書いたのが最後だ、、、。

16 :デフォルトの名無しさん:02/06/19 00:02
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!!
しかも日本語じゃん。
なんかわくわくしてきた。早速読ましてもらうよ。
これだけでこのスレッド立てた意味があったよ。

20 :デフォルトの名無しさん:02/06/19 00:07
>>18
それ俺も気になってた。

21 :ひげぽん:02/06/19 00:08
間違ってたら誰か突っ込んでね。
>>18
.exeファイルそのものが実行イメージだと思う。
メモリーにロードされてそのまま実行されるんじゃないのかな。

22 :18:02/06/19 00:11
>>21
恥を忍んでさらに聞く。

じゃあ、exeファイルもx86系のCPUで動いてるほかのOSのバイナリ
コードと(ヘッダとかそういうの除いて)同じなわけ?


23 :デフォルトの名無しさん:02/06/19 00:12
OSによって違うのは、ヘッダとか、データとの
配置レイアウトとか、DynamicLinkするテーブルとか。
実行される機械語としては、OS毎に違いは(あんまし)ない。

24 :18: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 これからもよろしく

30 :18:02/06/19 00:15
>>25
それは聞いた事ある。
基本はC/C++で、MFC使って書いてるらしい。
このMFCも外部に出してないMS秘蔵のMFCがあるらしい。

ま、OSでも上層部分の話だろうけど。


31 :デフォルトの名無しさん:02/06/19 00:16
どんなC/C++コンパイラ使ったんでしょうか

32 :18: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ってコンパイラ出してましたよね。
あれってどういう開発者が使うんでしょうか?_
デバドラ関係?


36 :デフォルトの名無しさん:02/06/19 00:20
>>34
いや………当初、それがウリだったんですが。

37 :ひげぽん:02/06/19 00:21
>>30
C++なら、ある程度はオブジェクト指向でかけるので
C ONLYよりはいいかも。
でも秘蔵のMFCってやだなあ。


38 :ひげぽん:02/06/19 00:22
>>36
やっぱりそうなんですか。
最近なんかの本に書いてあったのを見た記憶があります。

ある程度は成功してるってことですよね。


39 :デフォルトの名無しさん:02/06/19 00:24
俺も、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の設計が理想的とはいえないと本で読んだことがあるし

分散化とか考えたら頭がパンクします。

43 :デフォルトの名無しさん:02/06/19 00:29
>>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があるから便利だね。

48 :デフォルトの名無しさん:02/06/19 00:39
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を勉強した。

53 :デフォルトの名無しさん:02/06/19 02:16
Powers CE ってなんだ?
ググってもそれっぽいのが引っかからないが。

54 :デフォルトの名無しさん:02/06/19 02:17
patroで検索

55 :デフォルトの名無しさん:02/06/19 02:34
さっぱり引っかからん。
直リンくれ。

56 :デフォルトの名無しさん:02/06/19 02:35
ここにも粘着君(>>52)が居たか・・・

57 :ひげぽん:02/06/19 23:07
>>51
ありがとう。
初めて読む486本屋で探してみます。-

58 :ひげぽん:02/06/19 23:09
さてまじめにOSを作ろうとしている(または挫折した人)
お話をぜひ聞かせてください。

59 :デフォルトの名無しさん:02/06/19 23:09
絶版

60 :ひげぽん:02/06/19 23:13
>>59
まじっすか???
むしろ図書館で探すか。

61 :ひげぽん:02/06/19 23:25
atheosちょっと見てみました。
やはり、ある程度はアセンブリが必須なんですかね。
vmware誰か使ったことあるっすか???

62 :デフォルトの名無しさん:02/06/19 23:27
>>59
おいおい。うそつくなよ(藁

63 :ひげぽん:02/06/19 23:38
x86アーキテクチャ入門講座
http://ha3.seikyou.ne.jp/home/Joyit/asm/regs.html

64 :デフォルトの名無しさん:02/06/19 23:49
アセンブラとかの本は需要が無いのか絶版多し。

65 :デフォルトの名無しさん:02/06/19 23:51
便乗質問。
昔あった98テクニカルデータブックとか
IBM PC-ATハードウェアバイブルとか
この手のに相当する資料って今はどっから入手するものなの?

66 :デフォルトの名無しさん:02/06/19 23:54
持ってる香具師からもらうしかないんじゃないの?

67 :ひげぽん:02/06/19 23:54
>>64
そうですね。本当にごく少数の人しか今は使わないですよね。
アセンブラで書く部分はコード的には量は少ないけど
きっと重要なところなんですよね。

68 :デフォルトの名無しさん:02/06/20 00:05
>>66
ドライバ屋なんかが参考にする書籍って売りに出てないのかなぁ。

69 :ひげぽん:02/06/20 00:08
>>68
見つけたらぜひ紹介してください。
68さんもOSを作ることに興味があるんですか・

70 :ひげぽん:02/06/20 00:19
よく見たらアセンブラのスレッドがありますね。
ちょっと今から読んでみます。

71 :デフォルトの名無しさん:02/06/20 00:19
>>69
興味はあるけど時間はない(藁
テクニカルデータブックなら手元にあるから
古い98を買って何か作りたいなーなんて、たまに思うくらい。

72 :デフォルトの名無しさん:02/06/20 00:21
98関連の資料なら
スーパーテクニック、テクニカルデータブック、GDCテクニカルブック、プログラマーズバイブル
あたりが転がってる。
ほしけりゃ捨てメアド書いておいてくれ。


73 :ひげぽん:02/06/20 00:35
>>71
なるほど、確かに時間は無いですな。
会社でこっそりやろうかな。
うちも9821があまってる。すごい重いノートだよ。

74 :デフォルトの名無しさん:02/06/20 00:47
ひげぽんぽんは今までどんなもん作ってきた?

75 :ひげぽん:02/06/20 00:56
N88ベーシックから始まり
C,C++,java,perl, ruby をかじりつつ
今はSEやってます。SEって言ってもほとんどPGですが、
うーん何を作ってきたかといわれると困る
仕事では、CでCGI書いたり、シェル書いたり・・・

javaだとftpクライアントもどきとか・・・
オセロとかも作ったなあ。

76 :デフォルトの名無しさん:02/06/20 00:57
>>72
98は意外とオンラインで資料が手に入ったりするからパスかな。
それほど凝った入れ込み方は今更しないだろうし。
ATコンパチの方が欲しいけど、ないんだよなぁ。

77 :デフォルトの名無しさん:02/06/20 15:28
http://homepage2.nifty.com/nowsmart/nwsos.htm

78 :デフォルトの名無しさん:02/06/20 16:13
>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全体の機能の中で占める、重要さ



81 :デフォルトの名無しさん:02/06/20 21:03
まず気にする部分はブートローダーだけ。
百〜千行程度。
ドライバとかはそれこそデバイスによって様々なので、定量化できない。

82 :ひげぽん:02/06/20 21:06
>>81
なるほど。
ブートローダーの部分ですが、これって一から書くのでしょうか。
ある程度は、既存のものを参考にすればよいのでしょうか?
ブート後の処理も良く分かってないなあ。

どなたか参考URLを教えてください。

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

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

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

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

こんな具合にドライバが直接ハードウェアを操作するのなら
オーバーヘッドは減るが、コードが分散するので量も増える。
また、このような形だと全体制御、エラー処理などの問題も出てくる。
どちらがいいかは状況による。

84 :デフォルトの名無しさん:02/06/20 21:16
ブートローダ、デバドラ、メモリマネージャ、スケジューラ、あたりはアセンブラだな。

85 :デフォルトの名無しさん:02/06/20 21:19
マイクロカーネルで作るんでしょ?
ハードウェアもioサービス等を通して高級言語からいじるべき。


86 :77: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カーネル読んだ人いる?
誰か感想きぼんぬ。

89 :デフォルトの名無しさん:02/06/20 22:27
アプリケーション->サービス->ドライバ(->OS->IOサービス)->ハード

90 :ひげぽん :02/06/20 22:31
>>89
ではOS製作者は、OS,IOサービス,ドライバーを
実装すればよいのでしょうか。

91 :デフォルトの名無しさん:02/06/20 22:33
マジで初心者なんだけど、Cとかで書いた場合、コンパイラはどんなの使うの?

92 :デフォルトの名無しさん:02/06/20 22:33
>>87
> アプリケーション→ドライバ→OS→ハードウェア
> アプリケーション→ドライバ→ハードウェア
> のどちらを採用しているのでしょうか。

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

だと思うが。

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

今出てるインターフェース誌を買って読むべし。結構詳しく載っている。

93 :デフォルトの名無しさん:02/06/20 22:36
>>91
コンパイラは普通の奴。ヘッダファイル/ライブラリが違う。

94 :ひげぽん:02/06/20 22:40
>>91
あ、それ私も知りたい。
まずは環境構築ですよね。


95 :デフォルトの名無しさん:02/06/20 22:44
一番大事なのはリンカ。
自分のOSに合ったバイナリイメージを作らないといけない。
それから、通常は提供されている標準C/C++ライブラリは使用できない。

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

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

96 :デフォルトの名無しさん:02/06/20 22:51
とりあえず立ち読みでもいいから目をとおすべき。

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

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

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

どちらもコンパクトなコードが載ってるので即役立つはず。

97 :92:02/06/20 22:53
>>95
言いたいことはわかるが、ここのレベル考えて書いてる ?
ドライバのダイナミックロードやユーザーモードドライバなんて言うのは
一応OSができてからでもいいと思うぞ。

98 :デフォルトの名無しさん:02/06/20 22:59
レベルのことを言うんならJava方式だと思うが。

99 :デフォルトの名無しさん:02/06/20 23:23
ここってネタスレ?すげー笑えるんだけど。

100 :デフォルトの名無しさん:02/06/20 23:26
DX8SDKどこでダウソ?

101 :ひげぽん:02/06/20 23:39
>>98,99
うう。レベルが低いのは認めますが、
ここは出発点ということで徐々にレベルアップします。
少なくともやる気はある。


102 :デフォルトの名無しさん:02/06/20 23:41
十五歳の誕生日にオペレーティングシステム 第2版買ってもらうことにしました。

103 :デフォルトの名無しさん:02/06/20 23:45
>>100
スレ違い & マルチウザイ。

104 :デフォルトの名無しさん:02/06/20 23:46
>>99
99%ネタスレです。

105 :ひげぽん:02/06/20 23:47
>>102
もし本当に15才ならぜひ、将来良いOSを作ってください。
うーん若いですね

106 :デフォルトの名無しさん:02/06/20 23:48
99=104
暇人

107 :デフォルトの名無しさん:02/06/20 23:51
>>101
>>106 の言う通り、 >>99=>>104 はかまって君だから、無視しとけば
いいよ。

108 :デフォルトの名無しさん:02/06/20 23:51
>>106
オマエモナ。ヒッキー

109 :デフォルトの名無しさん:02/06/20 23:54
スレのレベルが高ければ誰も荒らしたりしないよ
アホがageるから荒らされる

110 :ひげぽん :02/06/21 00:00
>>88
さっき本屋で立ち読みしてきました。
OSを作ろうとするといろいろな事を考えなければいけないこと
があると痛感しました。

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



111 :デフォルトの名無しさん:02/06/21 00:01
いや、nasmがベストかと。
まぁ、漏れはTASM5.0とかでも良いと思うが

112 :デフォルトの名無しさん:02/06/21 00:01
ほんと、低級PGってどこにでもいるんだね(笑

113 :デフォルトの名無しさん:02/06/21 00:01
>>109
> スレのレベルが高ければ誰も荒らしたりしないよ
関係ない。どんなレベルのスレでも荒らされる時は荒らされる。
とにかく、「荒らし」には無視しかない。匿名掲示板の宿命だよ。

114 :デフォルトの名無しさん:02/06/21 00:07
>>112
自分のことだろ
プログラムすら出来ないんでしょ。

115 :デフォルトの名無しさん:02/06/21 00:11
>>114 == >>99
ですか?必死だな(ワラ

116 :ひげぽん :02/06/21 00:11
>>111
ありがとう。
さあて、nasmのドキュメントを読むか(英語)

117 :デフォルトの名無しさん:02/06/21 00:14
コンパイラにgccを採用するならnasmじゃなくてgasにした方が親和性高いかもしれない。
インラインアセンブラでnasm使用できないでしょ?

118 :デフォルトの名無しさん:02/06/21 00:15
>>113
なぜ荒らされるのかを認識しようとしないのは、思考停止してるだけ。
だから荒らされるんだよ。

119 :デフォルトの名無しさん:02/06/21 00:18
もう荒らしの話は終わりに汁

120 :ひげぽん:02/06/21 00:20
>>117
実は開発環境をlinuxと、WindowsXP proどちらにしようか迷っております。
linuxマシンはスペックが低いのでOS実験機(オシャカになってもいい)
そうすると、gasは無理かもしれないです。
でもかなりの利点があるならメインマシンをlinux&XP のデュアルブートにしようかな。


121 :デフォルトの名無しさん:02/06/21 00:21
OS板行けばと思ったのは俺だけかな?

122 :デフォルトの名無しさん:02/06/21 00:22
開発マシンは関係なくて、採用するコンパイラが問題。

123 :デフォルトの名無しさん:02/06/21 00:24
コンパイラなんぞ自分で書けばいい。
ハードの資料と時間と根気が最大の問題。

124 :ひげぽん:02/06/21 00:27
>>122
>>123
すいません、話についていけてません。
gccって、unix系用のコンパイラじゃないんですか?
もちろんここではcygwinは考えないとしての場合ですが。

125 :デフォルトの名無しさん:02/06/21 00:28
>>123
実用レベルのコンパイラが簡単に書けるわけねーだろ!
ゴルァ!

126 :デフォルトの名無しさん:02/06/21 00:30
>>121
OSを作るためにみんなでお勉強スレッド
http://pc.2ch.net/test/read.cgi/os/1020424840/

これが参考になりそうだ

127 :デフォルトの名無しさん:02/06/21 00:30
>>125
てめーの実業務用の実用コンパイラなら幾つも書いてきてますが何か?

128 :デフォルトの名無しさん:02/06/21 00:30
コンパイラを作るスレになりますた

129 :デフォルトの名無しさん:02/06/21 00:32
>>127
自慢するなよ。(w

130 :デフォルトの名無しさん:02/06/21 00:33
>>127
ハイハイ、わかったわかった。一生そう言っててくれ。

131 :デフォルトの名無しさん:02/06/21 00:35
文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
こんなもん自慢になるかっつーの。
そんなことよりハードの資料。
BIOS叩くにしてもそこそこのもんが必要だろ?

132 :125:02/06/21 00:35
>>127
ん?俺はひきこもりだぞモルァ!

133 :ひげぽん:02/06/21 00:36
>>126
使える!!!
今の私には最高のスレッド

134 :デフォルトの名無しさん:02/06/21 00:37
>>124
別にUNIX用ってわけじゃないが。
つーか、こんなレベルでOS書けるんかいな?

135 :デフォルトの名無しさん:02/06/21 00:42
問題はひげぽんが死ぬまでに形になるかだな・・・

136 :デフォルトの名無しさん:02/06/21 00:43
(笑

137 :デフォルトの名無しさん:02/06/21 00:47
>134
Onani-System なら書けるかも

138 :デフォルトの名無しさん:02/06/21 00:47
>>131
> 文法を適度に制限してyacc or 再帰下降で書けば簡単だろうに。
「実用レベル」と言う言葉が見えないのか ? それとも、一般人と定義が違うの
か ? いずれにせよ、スレ違いだからどっか逝ってくれ。

139 :デフォルトの名無しさん:02/06/21 00:49
>>138
待て待て。喧嘩を売ったのは125。俺は「お前はバカか」と言っただけ。
実用レベル云々は色々と反論したくもあるがここでやるつもりはねぇよ。

140 :ひげぽん:02/06/21 00:53
一応5年計画です。
さすがに死ぬまではやらないかと(冗談を真に受けてる)

141 :デフォルトの名無しさん:02/06/21 00:57
とにかくもっとアセンブラやハードウェアについて勉強した方がいいね。
今の知識だと、着手してからがとても大変だと思うよ。
昔は、アセンブラの初歩として「はじめて読む8086」をよく薦められた。
もしどこかで手に入るのなら読んでみるといいかも。

142 :デフォルトの名無しさん:02/06/21 01:00
>>141
オレモテルヨ!
はかにも「初めて読むアセンブラ」もZ80を理解するのによかたよ

143 :ひげぽん:02/06/21 01:00
>>141
確かにハードウェアの専門知識は皆無です。
PC自作したり、RS232CにLEDつないで遊んだ知識は一切役立たず・・・
週末は本探しからはじめます。


144 :デフォルトの名無しさん:02/06/21 01:02
>>139
>>123 付近の話の流れで、唐突に「コンパイラなんぞ自分で書けばいい。」と
言う発言はいかがなものかと。突っ込まれてもしょうがないと思うぞ。

145 :デフォルトの名無しさん:02/06/21 01:04
アセンブラもろくに知らんとOS書くやつがいるんか
いやBASICでOSだっつやつもいるが…
こんなんではブートしてもプロテクトモードにはいるときにBIOS叩きで氏ぬのがオチ

146 :デフォルトの名無しさん:02/06/21 01:05
>>145
これから勉強すれば良いんじゃん。
何を言ってるんだか・・・

147 :145:02/06/21 01:06
せいぜいがんばれよ

148 :ひげぽん:02/06/21 01:07
>>145
OSを作りたいと思う。
→アセンブラが必要と分かる
→アセンブラ勉強する
→CPU等ハードウェアの知識が必要と分かる
→勉強する
→ちょっと作ってみる
→失敗!!
でもその過程が楽しい(少なくとも私は)のでよし!!!!

149 :デフォルトの名無しさん:02/06/21 01:07
>>144
あー、それは済まなかった。申し訳ない。

150 :125:02/06/21 01:12
(´-`).。oO(ひょっとして俺に責任があるのか?)

151 :デフォルトの名無しさん:02/06/21 01:20
コンパイラ云々もたしかに大変だけどそれ以上にc言語で書くなら、
それのライブラリを作るほうが大変という罠。

152 :デフォルトの名無しさん:02/06/21 01:20
割り込みとメモリ管理、タスクディスパッチのハザマで死ぬであろう。


153 :デフォルトの名無しさん:02/06/21 01:22
>>152
それを思うとやっぱりgccしか選択しないなと思う。

154 :デフォルトの名無しさん:02/06/21 01:41
GPLかぁ。。。

155 :デフォルトの名無しさん:02/06/21 01:57
いまどきデバイスドライバがアセンブラってのはどんなOSだよ
vxdのヘッダだけとかじゃねーの?

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

くらいじゃねーの?


156 :デフォルトの名無しさん:02/06/21 02:11
デバイスドライバって言ってもOSのカーネルモード通すんだったら
アセンブラで書かなくてもいいよな。
本当にアセンブラで書かなくてはいけないのは、むしろBIOSだな。

157 :デフォルトの名無しさん:02/06/21 02:12
gccで生成したコードはGPLじゃないよ。
glibcを使わなければいい(どうせ使えない)

158 :デフォルトの名無しさん:02/06/21 02:33
>>157
そうなんだ。それはいいこときた。

159 :デフォルトの名無しさん:02/06/21 02:51
本気でやる気があるのなら、手短に
最初に作るのはローダーといいたいところだけど、もっと簡単に
ハードディスクからブートして画面にメッセージでもだすプログラム作るといいよ。
そのあと、割り込みとメモリ管理をするといいです。
それもいきなりハードディスクを使ったページングとかはせず、
単純に仮想アドレスを実アドレスにマップするのを作ってみるといいです。
そうこうしているうちに、手探りの作り方ってのが分かってくるから、
そしたら、OSの理論本でも見て設計するといいです。
最初はCを使おうとか考えたらダメですよ、オールアセンブラです。
やり方がわかってきたら、全部アセンブラで書くのが面倒になってきますから
そしたら C で書いてみるといいです。
実のところここまでできれば後はたいしたことは無いです、思いのまま設計するよろしいです。


160 :デフォルトの名無しさん:02/06/21 03:02
>>159
HDDはパラメータ周りとか結構めんどくさいんで、
実際に画面が出て動くまでをフロッピーでやることを勧めたいんですが。

161 :デフォルトの名無しさん:02/06/21 03:07
ああ、確かにそうですね。
後86特有のあの変なモードとかセグメントとかも先になれてから
メモリ管理がいいかも知れません。

しかし、86ッテヤダネェ

162 :デフォルトの名無しさん:02/06/21 03:13
ポインタさえ殺せば仮想メモリ管理いらんやろ。
仮想マシンの線で言った方が楽やと思うで。
最近はなんやJavaや.NETやゆーて流行ってるみたいやし。

163 :デフォルトの名無しさん:02/06/21 03:17
>>162
ドシロートはすっこんでろ

164 :デフォルトの名無しさん:02/06/21 03:19
いっそ、最初はP/ECEで試作した方がいいかも。
ハードウェアは単純で、カーネルソースも公開されているし、CPUは
RISC物なので、x86のセグメントみたいな嫌らしさもない。

165 :デフォルトの名無しさん:02/06/21 03:23
>>164
んでもエプソンのチップってイヤになるほどマイナーじゃない?
WonderWitchをさわった方がx86系だし良いんじゃないかな。

166 :デフォルトの名無しさん:02/06/21 03:23
>>163
そらOSは作ったことはないけどやな。
たとえばJavaVMやったら
任意アドレス指定が可能なオペレーションは排除されとったと記憶しとる。
各種の変数は事前に囲い込まれた範囲内でしかアクセスでけへんし
オブジェクト境界を超えるアクセスは全部VM上でチェックが入る。
あれやったら、仮想メモリ管理、ちゅうか、アドレス空間の隔離はせんでも
安全に動くもんが実装できるんとちゃうんか?
ページングの話はまた別な。
これも習作のOSとして大目に見るんやったら
仮想メモリ管理なしで類似品が作れると思うで。
どっか間違うてるか?

167 :デフォルトの名無しさん:02/06/21 03:26
>>162
本質的にVMはOSが発行するメッセージ、割り当てたメモリ,I/Oに対して
アクセスするのでそれ単体では何もでん。
JAVAチップもしかり。




168 :デフォルトの名無しさん:02/06/21 03:31
>>167
VMがCPUそのもんやと思てると?そこまでアホなこと言うかいな。
JavaVMみたいに、あらゆるアクセスが検査対象となる構造やったら、
実行時に動的にアクセスを制限するようなことをせんでも、
JITなりを通す段階で安全な処理に落とし込めるやろっちゅう話やがな。
x86のプロテクトモードやGDTやらLDTやらゲートやら面倒くさそうやからな。
そんなん弄るぐらいやったら実行バイナリを仮想コードで統一しつつ
裏ではJITなんかで調整して基本的な命令しか使わんような
単純な構造にした方がええんちゃうか言うてんねん。
これやったらI/O命令と割り込みぐらいでどうにかなるはずや。
それともこういうことはできへんのんか?

169 :デフォルトの名無しさん:02/06/21 03:31
>>166
>>1が作りたい物を作るのが一番なんだから、
横から口を挟むのはどうかと。


170 :デフォルトの名無しさん:02/06/21 03:31
>>165
手始めにWonderWitchはいいかも、簡単に手に入って
しかも86系アセンブラになれるのにももってこいですね。
あれって確か発売元バンダイでしたっけ?

171 :デフォルトの名無しさん:02/06/21 03:32
>>169
こっちの方が楽ちゃうかぁ、思うてな。
参考程度に聞いたって。>1

172 :デフォルトの名無しさん:02/06/21 03:33
(´-`).。oO(ワンダーウィッチ・・・・まだあったのか。)

173 :デフォルトの名無しさん:02/06/21 03:35
>>172
えっひょっとしてワンダーウィッチ・・・・もう売ってない?


174 :デフォルトの名無しさん:02/06/21 03:37
WonderWitch、まだ売ってるよ。
x86のアセンブラに慣れるには、確かにいいかもしれない。

175 :デフォルトの名無しさん:02/06/21 03:42
WWが終わった後も386の壁486の壁が待ってるからな。

176 :デフォルトの名無しさん:02/06/21 03:46
>>175
壁は286,386だけでしょ、後は大体みんないっしょ

177 :デフォルトの名無しさん:02/06/21 03:59
>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どちらでも良いので教えてください。

180 :デフォルトの名無しさん:02/06/21 21:06
>>179
安全なのは自分で作ることだな。

181 :デフォルトの名無しさん:02/06/21 21:08
>>179
> Cのライブラリ等は何を使えばよいのでしょうか。
Interface 7月号買ってんだったら P.55 から読んでみたらどうよ。

182 :ひげぽん:02/06/21 21:25
>>181
gnuということですか?

183 :デフォルトの名無しさん:02/06/21 22:07
>>182
ぉぃぉぃ

184 :181:02/06/21 22:19
>>182
P.55 に書いてある Chapter1 のタイトルをここに書いてみろよ。
あんた以外は、俺が何を言いたいかわかるはずだ。
(で、どうすればいいかは Interface を見ればわかる。Linux の環境が
あるんなら、まずは書いてある通りやってみればいい。知ってる人には
ちょっと冗長だけど、今までこの手のプログラムを書いたことない人には
なかなかいい記事だと思うよ。)

185 :デフォルトの名無しさん:02/06/22 17:57
モウオワリ?

186 :デフォルトの名無しさん:02/06/22 19:27
ウン、オワリ。

187 :181:02/06/22 21:41
おわりかよ !!

188 :ひげぽん:02/06/22 22:08
え?おわりですか?

189 :デフォルトの名無しさん:02/06/23 03:06
>>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マガジンもブート特集してましたね。



192 :デフォルトの名無しさん:02/06/23 11:20
>>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
まったくの初心者なので、勉強になるっす。

まったく同じ仕組みでつくろうとは思いませんが、
プロセス間通信とか、パイプの実装とか・・・
勉強になりますね。

198 :デフォルトの名無しさん:02/06/23 23:45
タネンバウム(・∀・)イイ!!

199 :ひげぽん:02/06/24 00:09
良スレハケーン

200 : ◆mDa3YTQk :02/06/24 00:17
キャップをつけます。

201 :デフォルトの名無しさん:02/06/24 00:21
OSの魔法使い

202 :デフォルトの名無しさん:02/06/24 00:49
2002 06/18
その日、2ちゃんねるの漢たちが立ち上がった・・・。
最高のOSを作るべく。


できあがたときのことを考えて宣伝に使うフレーズはこんなんでいいか

203 :デフォルトの名無しさん:02/06/24 00:59
開発コード: ひげぽん618 とか

204 :デフォルトの名無しさん:02/06/24 10:31
OS作りたいんだったら、理系の大学へ進学して
NEC・富士通・日立のいずれかの該当部署から内定もらうのが手っ取り早いと思われ。

205 :デフォルトの名無しさん:02/06/24 11:35
>>204
趣味でそこまでできません。

206 :155:02/06/24 15:42
ブートローダはOSの本質的な仕事じゃないな。
grubとかliloとかsyslinuxとかnetbootとかredbootとかmiloとかROMモニタとか
「メモリの特定アドレスにkernel imageをロードする機能」

「そっから動くカーネル」
は別もんだ。

207 :デフォルトの名無しさん:02/06/24 18:24
開発コード:ひげぽん0721

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

>>206
だからなに ?

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

んで、このスレッドには興味持ったのでコテハンで行きます。

210 :デフォルトの名無しさん:02/06/24 21:09
>>208-209
>>206>>155 の発言で ブートローダをOSの一部のように書いたから
それを訂正したってだけだろ。

労力を他の部分に傾けるためにブートローダは既存のものを使うのも良し。
勉強もかねてブートローダからつくるもの良し。

211 :208:02/06/24 21:43
>>210
「ああなるほど、そう言うことか。」って、三日も前の話だし、全然本質
的な話じゃないから正直わかんなかったよ。

212 :ひげぽん:02/06/24 23:16
OSの技術的な話はまだ勉強中です。
ちょっとにぎわってきたのでうれしいです。

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

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

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

213 :デフォルトの名無しさん:02/06/24 23:18
>>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()ってどうやって実現してるんだろ・・・

ヒントくださーい

218 :デフォルトの名無しさん:02/06/24 23:52
>>212
意味不明。
システムコール系って何だ?
低レベルサービスをアセンブラで書いて、
そのインターフェイスをC互換にすると言うこと?

219 :デフォルトの名無しさん:02/06/25 00:02
>>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
日本語気をつけます。
反省・・・

223 :219: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
http://www.tron.org/

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」を考えるならどういう仕様になるのか教えてください。


233 :デフォルトの名無しさん:02/06/25 07:30
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.スルヤント著
をオススメしておきます。私が高校生の頃に読んでた本だし、難易度的にも丁度いいんじゃない?

235 :デフォルトの名無しさん:02/06/25 20:57
>>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の場合、同じセグメントにある関数(ユーザプロセスの関数)を呼び出すのと、
>異なるセグメントにある関数(システムコール)を呼び出すのとは手続きが違います。
同じセグメント、異なるセグメントとは何でしょうか?


239 :デフォルトの名無しさん:02/06/25 21:24
>>238
「はじめて読む486」を参照。

240 :デフォルトの名無しさん:02/06/25 21:28
http://newos.sourceforge.net/

241 :デフォルトの名無しさん:02/06/25 21:29
セグメントって言う言い方誤解を招かないか?
セレクタの方が適切だろ。

242 :デフォルトの名無しさん:02/06/25 23:00
おもしろそうなので一緒に勉強してます。

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

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

よろしくお願いします。

243 :デフォルトの名無しさん:02/06/25 23:07
MBRはブートローダーを保存する領域
ブートローダーは保存されるプログラム

244 :242: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

246 :デフォルトの名無しさん:02/06/26 09:43
x86っつっても、80286、80C86、IA-32で、それぞれ呼び出し時になにが起こるかぜんぜん違うしな。

247 :デフォルトの名無しさん:02/06/26 11:31
>>244
NT/2000ならリソースキットかインストールCDのdskprobe.exeを使ってごらん。

>>243
くだらん。

>>245
知らないなら知らないと言えよ。(w

248 :244:02/06/26 12:35
>>247
ありがとうございます。2000ユーザなので、家に帰ったらやってみます。

>>246
ごもっとも。
あと、英語が少し変です。

249 :デフォルトの名無しさん:02/06/26 16:54
>>247
最初の2行だけにしとけばよかったのにな。

>>248
246へのレスは245へのレスか?
どこが変なのか教えてたも

250 :ウマさんシカさん ◆vBaka42s :02/06/26 22:36
>>244
rawriteあたりでやればいいんじゃないのか?
というかなぜOS板を見ないの?

251 :デフォルトの名無しさん:02/06/26 22:51
>>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の時点でうそ英語
馬鹿丸出しだね。

254 :デフォルトの名無しさん:02/06/27 00:09
鈴木アグリー

255 :デフォルトの名無しさん:02/06/27 00:13
>>253
understoodにするの?
教えてくれ。

256 :デフォルトの名無しさん:02/06/27 00:20
あんでーすてんど

257 :デフォルトの名無しさん:02/06/27 01:35
0000 0001 0000


258 :デフォルトの名無しさん:02/06/27 06:17
>>232
電波だから気にしない方が良い。


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

>>1
第2種情報処理技術者試験くらい受けてからOSに挑戦しろ

259 :デフォルトの名無しさん:02/06/27 06:37
一から勉強しながらOS作ろうっていうのがきついな
minix,linuxを解析したほうが近道だろ
今のレベルでは素人がいきなりオリンピックに参加するようなもの

260 :デフォルトの名無しさん:02/06/27 08:35
>>259
いや、学問に王道なし。

minixとかはOSとはなんぞやComputerとはなんぞや、Architectureとはなんぞや
がわかってからで遅くはない。
むしろ、わかってからならば早く理解できる。
まぁ、>>1はOADGとかも知らないだろうし、OSを組むのは1年早い。

261 :デフォルトの名無しさん:02/06/27 10:25
>>260
そういうのを勉強しながら学ぶのにMinix本は最適なんだけどねー

262 :デフォルトの名無しさん:02/06/27 10:44
なあ。なんで、どうでもいいお説教するやつ多いんだ。
おまえらじいさんか?
どうせ自分じゃ何にもできねーんだろ。
うざいから、「検索しろ」だの「もっと勉強してから」だの言うなよ。

263 :デフォルトの名無しさん:02/06/27 11:10
作りながら学習するのは楽しいぞ
楽しいからプログラミングする
まさに本来の姿

264 :1じゃないけど:02/06/27 11:12
>>258
>第2種情報処理技術者試験くらい受けてからOSに挑戦しろ

必要性を示してください。

265 :デフォルトの名無しさん:02/06/27 13:33
別に2種持ってないとOSがつくれんわけじゃないが、2種取れる程度の知識もないと、
OSの勉強すらままならんだろ。

266 :デフォルトの名無しさん:02/06/27 19:16
あんつーれべるのひくさだ。

267 :264: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
ひげぽんって無職?

275 :デフォルトの名無しさん:02/06/27 22:59
nasm使っておけって

276 :ひげぽん:02/06/27 23:02
>>274
へなちょこSEです。
>>275
出来ればgasを薦めない理由もしくは、NASMを薦める理由
を教えてください。

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

281 :デフォルトの名無しさん:02/06/27 23:50
元々、無駄なスレに無駄なレスをつけて、無駄なレスを返す
>>280や他も馬鹿っぽいよ(^^;ワラ

特に>>280は海馬にカビが生えてる。キモ


282 :デフォルトの名無しさん:02/06/27 23:55
こういうときはおとなしくツレタ!、とか書いておけばいいんですよ。

283 :デフォルトの名無しさん:02/06/28 00:15
マジレスがかっこ悪いというのには反対だけど
コピペにマジレスはさすがにかっこ悪いと思うよ

284 :デフォルトの名無しさん:02/06/28 01:30
>> 279 つくれるからどうというわけでは、ないでしょう。
でもその作る人にとっては、その作る上での技術を実際に体で
覚えられて経験上いいのではないでしょうか?

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




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

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


minixを参考にするのに良い点はx86用OSを作るときの例としてだと思う。
minixがOSだと思うと、x86以外は取っつきにくくなっちゃうか、
後で後悔すると思うな。
あれはOSだがOSはあれではない。
もっと広い視点と腰を据えた覚悟と長期計画が必要だと思うな。マジでやるんなら。
趣味でやるら、まず、コード書いてNETに上げてみな。まずはそれからだと思う。


286 :デフォルトの名無しさん:02/06/28 18:28
>>285
お前は何様なんだ?

287 :デフォルトの名無しさん:02/06/28 18:38
>>285
自信満々みたいだけど何が言いたいのか分からん。
表現力不足なのか分かってないのか。

いまのままじゃオナニー演説。

288 :デフォルトの名無しさん:02/06/28 19:05
プログラマーならカキコでオナニーするんじゃなくて
作品でオナニーすべきだな。

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で十分だ。
きっと作る事に意味があるんだよ。
ゲームだって、しょぼくても作るとたのしいじゃん

293 :デフォルトの名無しさん:02/06/28 21:11
>>291
それがJavaや.NET。   などといってみるテスト。

294 :デフォルトの名無しさん:02/06/28 21:39
>>293
たぶん、それは違う

295 :デフォルトの名無しさん:02/06/28 21:43
>>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.

298 :デフォルトの名無しさん:02/06/28 23:13
>>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のドライバとかも作れる?

304 :デフォルトの名無しさん:02/06/29 02:53
まあ煽りはほっときましょう
どこのスレにも蛆のようにわいてくるんだから。

305 :デフォルトの名無しさん:02/06/29 03:01
>>302
そんなあなたに1394

306 :デフォルトの名無しさん:02/06/29 03:03
PCMCIAはPCIやISAをいじった人なら全然難しくないよ
というかそのあたりを学ぶ過程で必ず
PCMCIAは難しくないというのを知るし。
1394は手元に資料が何も無いんでパス。
つーか流行ると思わなかったから何も勉強してないし・・・

307 :デフォルトの名無しさん:02/06/29 03:43
めちゃくちゃおもしれーじゃねーか
c++の勉強してんのにハードの勉強させんなよ(笑)

俺もOSつくりてー
でもまずはc++(笑)
23か、若いなぁ...俺今18だけど23でそれできるかなぁ...
頑張ってくださいsageながら見守ります

308 :デフォルトの名無しさん:02/06/29 03:46
>>306
デバイスドライバの作り方の説明って、要約すると
「init と open と close 作りなさい」って感じじゃん?それはまあ分かるんよ。
でも、実際に目の前にPCカードが一枚あってそのドライバがネットには
いくら探しても無くて、自分で作るより他に手は無いってなったときに、
具体的にどうやってその init やら open やらを作ればいいの?
当然メーカーのウェブページに細かい仕様が載ってるわけでもなし、
どのIOポート(でいいのかな?)にどんなデータ送るとどんな風に反応するか
分からなくて、、、。
そういう情報はどっから手に入れる?

309 :デフォルトの名無しさん:02/06/29 04:05
基本的にボードメーカは何も知らないフリをするから要注意。
すべてチップから想像するって感じ。
まず、とりあえずダメ元でメーカに電話。
平行してgoogleで全言語で検索。(日本語には情報はまず無い)
さらに似たようなチップを使ってるデバイスの
Linux(*BSD)のソースを見る。で、使えそうなら丸パクリ。
月刊インターフェイスのバックナンバーは捨てずにとっとく。

310 :デフォルトの名無しさん:02/06/29 04:09
WinのドライバはよくわからんけどLinuxのドライバは
作りがバカみたいに単純(だから弊害も多いけど)。
NIC関連のソースはひじょーに勉強になったね。

311 :デフォルトの名無しさん:02/06/29 04:11
って、OSからかけ離れてるな・・・
OSの華はやっぱりスケジューリングとメモリ管理だよね。
ファイルシステムも面白いけど、2の次だよね。

312 :デフォルトの名無しさん:02/06/29 04:24
>>309
そっか。やっぱドライバ作る奴ぁすげーな。俺にはとても出来そうにない。

313 :デフォルトの名無しさん:02/06/29 04:38
グラフィックスもだろう

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プログラム"表示させるのにファイルシステムを
作らなきゃダメなんですか?

318 :デフォルトの名無しさん:02/06/29 14:26
CSH読み込んでLBA算出すればファイルシステム何ぞイラン。

319 :デフォルトの名無しさん:02/06/29 14:40
じゃあみんなで手分けしてやろうぜ。漏れ helloworld担当でいいすか?(汗

320 :デフォルトの名無しさん:02/06/29 15:50
javaで書けない部分とはアセンブラオンリーの部分を除いて具体的にどこなのだ。

321 :デフォルトの名無しさん:02/06/29 17:02
なぜそんなにJAVA、JAVA言うんだい?

322 :デフォルトの名無しさん:02/06/29 17:41
javavm

323 :デフォルトの名無しさん:02/06/29 22:02
>>291
ハードウェアってどの範囲を指してんだ ? プロセッサの種別か ? 使ってるバス
のアーキテクチュアか ? ここら辺を特定しないで...
> ハードウェアの違いを吸収し、共通の環境を提供するのが真のOSである。
なんて言ってる奴は、多分真の厨房だろうな。
そう言う目的のOSと言うものもあるだろうし、ちょっとしたハードウェアの違い
を吸収すると言う目的は理解できるけど、ちゃんとやろうとすると苦労多くして益
なしになるのがオチ。極端な話、スーパーコンピュータから携帯電話まで同じOS
が走ると思う ? (そりゃ極端過ぎるよと言うかも知れんが、J○va なんてそれに
近いことほざいてたんだから。UCSD P-Machine の時代から誰もが考えて、誰も
成功していない課題だよ。) それに多くの場合、そう言うハードウェアの違いを
吸収するのはOSじゃなくてデバイスドライバ。だから、対象ハードウェアを増
やすには基本的に人海戦術しかないよ。はっきり言ってそんなことに労力を使う
のは、無駄だし「ひげぽん」が大金持ちでもない限りむり。普通のPCできちん
と動くOSを作るべし。

324 :デフォルトの名無しさん:02/06/29 22:13
そうそう、理想論だけで現実的な線での妥協と言う物を知らないのが困る。

325 :デフォルトの名無しさん:02/06/29 22:17
x86 AT が基準でイイがあまりべったりだと移植性に乏しくなるってことじゃん。

実際に対応するかどうかは別問題。

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

>>323
まぁ、パフォーマンスは激悪になるだろうね。
これは仕方ないと思う。
だけど、プログラムやOSの移植性は抜群に良くなる。

327 :デフォルトの名無しさん:02/06/29 22:22
>>323
スーパーコンピュータから携帯電話まで、同じライブラリが使えると嬉しいな。(w
一回コンパイルしとけば依存関係を気にしなくていい。

328 :327:02/06/29 22:27
まぁ、OSと言うよりVMに近いかな。
OSとVMを統合して一歩進めた形だな。究極のOS環境。

329 :デフォルトの名無しさん:02/06/29 22:44
>>328
そんなもん、ハードウェアが一つの規格に統一されれるほうが
利用者(プログラマ)側としては究極だろ。

330 :327:02/06/29 23:02
>>329
統一されるわけねーだろ。(w


331 :デフォルトの名無しさん:02/06/29 23:04
>>327
いったいそれをどのような目的のために使うというのだ。

PCにつまれるx86系CPUにとって得意な処理もあれば苦手な処理もある。
あとROM,RAM等のハード資源を無視して強引にOSを作ってもまるで意味が無い。


332 :デフォルトの名無しさん:02/06/29 23:08
>>330
それを言ったらOSだって統一されるわけねーし、
実装依存で余計に苦しむ場面も多々出てくるよ。

333 :327:02/06/29 23:08
ハードウェアってのはどうしても、物理世界の壁に直面する。
電源容量、ノイズ、媒体特性、製造コスト、こういうのがある限り、ハードウェア
を統一しようというのは無理。
だから、そのために、OSと言う物が存在している。
だけど、今のOSは、特定のCPUに依存しがち。
だから、CPU依存をできるだけ廃したOSがあれば、かなり良いと思う。
パフォーマンスは多少悪くなっても、まぁ、最近のCPU性能ならOld Pentiumクラス
で動かしたWindowsと同等の性能程度で実現可能だろう。
リアルタイム性も持たせれば、クリティカルな処理以外は全く問題なくなる。
クリティカルな処理は、Network経由でCPUサーバが処理するようにするとか、
分散オブジェクトをサポートすればいい。


334 :327:02/06/29 23:12
>>331
まぁ、どうだろ。
初歩的な関数から作ってみて、徐々に拡張してみては。


335 :327:02/06/29 23:13
目的は・・・作者次第じゃねーの?

336 :327:02/06/29 23:20
>>332
OSは統一されるべき。
だけど、アプリケーションソフトは統一されるべきではない。

基本は統一されるべきだが、応用は自由に発展すべき。


337 :デフォルトの名無しさん:02/06/29 23:29
>>336
なんで ? OSだって単なるプログラムだよ。「バカッ速いけど、メモリー保護な
んてかったるくってやってられねーよ。」というOSや、ひたすらユーザーイン
ターフェースに凝りまくるOS。「ハードが死んでも、俺は実行を続けるぜ。」
と言うフォールトレランスなOS。いろいろあっていいんじゃないの ?
なんか、OSを特別なプログラムみたいに思ってない ?

338 :デフォルトの名無しさん:02/06/29 23:54
じゃあOSつくるよかライブラリとかクラスライブラリとか
環境とか作った方が手っ取り早いね。

339 :デフォルトの名無しさん:02/06/30 00:25
「ハードが死んでも、俺は実行を続けるぜ。」

カコ(・∀・)イイ!!

340 :デフォルトの名無しさん:02/06/30 00:29
OSを"単なる"プログラムって言ってのけるあたり厨入ってるな。
明らかに特別なプログラムだろ?

341 :デフォルトの名無しさん:02/06/30 00:35
>>340
日本語勉強してから物言え在日

342 :デフォルトの名無しさん:02/06/30 00:41
>>340
>>337 の主張は「いろいろあっていいんじゃないの?」って部分なんだが、、
どうでもいい所にちょっかいだしてどうするんだ?

343 :デフォルトの名無しさん:02/06/30 00:52
>>341,342
そんなことでageんなよ…
ひげぽん氏はどうした?

344 :デフォルトの名無しさん:02/06/30 01:04
まぁ、色々バージョンがあるのは良いんだけど、このOSでは文字列の扱いがまちまち
だとか、基本的なファンクションコールの呼び方がまちまちだとか、プログラマ泣かせ
の状況は、本来OSという存在を作った意図から外れてる。
BIOSと何ら変わらないよ。
この状況で良いんだったら、CPUベンダかチップセットベンダがROM焼きなり、
ハードコーディングして出せば良いんだ。OSなんて要らないね。

と言ってみる。

345 :デフォルトの名無しさん:02/06/30 01:14
マイコン用のOSってどうよ?HOSとか

346 :デフォルトの名無しさん:02/06/30 01:15
いや、もう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言語でかけばそれをどんな環境でも
その環境でコンパイルすれば使えるって入門書に書いてあったのですが
どうですか?


350 :デフォルトの名無しさん:02/06/30 01:18
コンパイラがあればな

351 :デフォルトの名無しさん:02/06/30 01:22
>>349
コンパイラが存在するのと、
プログラムで使ったライブラリ関数が全く同じ外部仕様で提供されていること。
他にも、ビッグインディアン/リトルインディアンの違いでハマったり、
intのサイズが違ったり、数えればキリがない。

そんなえーかげんなことを書いている本は捨てちゃいなさい。

352 :デフォルトの名無しさん:02/06/30 01:23
>>347
そうだね。このスレ中途半端な知識の展覧会って感じだな。
どんなOSがお望みなんだい?OSの設計はそれからだろ?
このスレまだ何も生んでないな…

353 :デフォルトの名無しさん:02/06/30 01:25
ライブラリとかもっと上の層で対応した方が楽だし速いし柔軟じゃん。

なぜわざわざ一番下から…

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


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

とりあえず『どういうのが欲しいのか』が無いとね。


355 :デフォルトの名無しさん:02/06/30 01:34
>>344
文字列の扱いぐらいCの標準関数でも十分汎用性があるが。

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




356 :デフォルトの名無しさん:02/06/30 01:38
>>353
Just for fun.


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


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


言語レベルでは仕様までは規定してないよ。
システム環境を規定しているのは実質的にOS。


358 :デフォルトの名無しさん:02/06/30 01:43
あ〜あまた始まった…

359 :デフォルトの名無しさん:02/06/30 01:49
ノイマン型のコンピュータの講釈をするのは知識不足でアレだけど、
基礎的な事に限って言えば、処理装置と記憶装置等の5大装置があれば良い。

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

そういうことなんだよ。

360 :デフォルトの名無しさん:02/06/30 01:49
ひげぽん氏よ、もう少し方向性を明確にしたらどうだい?
でないと、不明瞭なまま話がどんどん広がってめちゃくちゃになってしまうよ

361 :デフォルトの名無しさん:02/06/30 01:53
>>357
おいおい、それを実現するのはOSじゃないよ。
普通は言語サブセットだったり、他のOS配下にあるモジュールだって。

362 :デフォルトの名無しさん:02/06/30 01:54
>>360
あのさぁ、おまえらが勝手に持ち上げているだけで、
ひげぽんは「とりあえず」習作としてOSを作って「みたい」というだけだろ
いきなり仕様がどうだって話してもしょうがない。


363 :デフォルトの名無しさん:02/06/30 01:56
>>357
あんたが言っているのは<stdio.h>。
俺が言ってるのは<string.h>。
printf等は出力が絡むのでOSのwiteを使うことになる。
文字列の連結、評価であれば問題ない。
OSが無くても使える。実際使っている。
あとmath.hもつかえる。

364 :242:02/06/30 02:02
ひげぽん氏は、いろいろな意味で偉いな。
がんばってくれ。

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

あ、特に返レスは不要だけどね。

365 :デフォルトの名無しさん:02/06/30 02:03
>>361
おいおい。
OSの定義わかって話してる?

あんたが言ってるのはカーネルだよ。


366 :デフォルトの名無しさん:02/06/30 02:07
>>357
内部表現と外部表現の違いについて小一時間勉強してこい

367 :デフォルトの名無しさん:02/06/30 02:07
>>363
OSの話してるの。

別に、C言語の仕様じゃ文字列の扱いについて規定してない。
”あ”が文字コードの何番かであるかも規定してない。


368 :デフォルトの名無しさん:02/06/30 02:11
OS非標準のコンソールドライバかもしれん(w

369 :デフォルトの名無しさん:02/06/30 02:11
>>366
それは関係ないな。
文字列のテーブルを管理してるのはOS。C言語じゃない。

OSの基礎を小一時間勉強しろよ。(w


370 :デフォルトの名無しさん:02/06/30 02:12
http://www.reactos.com/

371 :デフォルトの名無しさん:02/06/30 02:13
で、1はx86用カーネル組みたいの?


372 :デフォルトの名無しさん:02/06/30 02:13
>>369
だから、文字列ってなんだよ?
パスカル文字列とか、Cの文字列とか
それこそ、アプリケーション定義による独自の文字列とかがあって、
OSが規定するべき物じゃない。

373 ::02/06/30 02:14
OSよりもオープンソースのゲームって出来ない?

374 :372:02/06/30 02:15
>”あ”が文字コードの何番かであるかも規定してない

この場合、OSが規定しているのは文字列ではなく、キャラクタセットじゃん。


375 :デフォルトの名無しさん:02/06/30 02:16
どんな文字でもゴリゴリ描いちまえば俺の勝ち

376 :デフォルトの名無しさん:02/06/30 02:18
>>372
ああ。文字、文字。


377 :デフォルトの名無しさん:02/06/30 02:18
DOSはキャラクターセットの定義と$で終わる文字列のコンソール出力のファンクションリクエストを提供していますが。

378 :デフォルトの名無しさん:02/06/30 02:19
>>734
キャラクタセット=文字セット


379 :デフォルトの名無しさん:02/06/30 02:20
>>373
nethackとかそうじゃないっけ?

380 :372:02/06/30 02:20
>>378
文字セットでも良いけど、文字セットは文字列じゃないぞ

381 :デフォルトの名無しさん:02/06/30 02:21
上の言い争いが全部自作自演だたら(・∀・)ワラエル!!

382 :デフォルトの名無しさん:02/06/30 02:24
拘泥

383 :デフォルトの名無しさん:02/06/30 02:25
>>367
そんな事ぐらい判っているが。

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


384 :デフォルトの名無しさん:02/06/30 02:26
なんかOSとは「どうあるべき」っていう人と
「どうやって作るの」っていう人が戦ったるみたい。

個人的には、ここで必要なのは「どうやって作るの」の意見が重要そうな気がする・・・


385 :デフォルトの名無しさん:02/06/30 02:38
>>383
あ? 標準がShift_JISだったUNIXもあるし、最近だとUTF-8つーこともあるが?
インストール時に選択できるとかな。

386 :デフォルトの名無しさん:02/06/30 02:39
>>252 のことを x86 でやろうとしたら、「バイナリ実行イメージ」てのはどうやって作るんでつか?
NE とか PE、MZ、ELF じゃダメっすよね?いわゆる com 形式でいいんでつか?

387 :デフォルトの名無しさん:02/06/30 02:44
COM形式で良い。
16bitコンパイラとかで実行ファイルを作り、
exe2binとかでバイナリイメージにして書き込む。
プロテクトモードへの移行はローダーがやってもいいし、お好きにどうぞ。

388 :デフォルトの名無しさん:02/06/30 02:50
通りすがりで申し訳ないが、
なんでOSのスレで文字列とかで争ってるんだろう・・・?

ちなみに俺は >>311 に同意。
タスク(プロセス)をどうやって実現しているか、というのは
なかなか面白いと思う。

389 :デフォルトの名無しさん:02/06/30 02:58
>>387 thx 今度やってみます。
あと、全くライブラリ使っていなければオブジェクトフェイルのままでもOKでつか?

390 :デフォルトの名無しさん:02/06/30 03:00
>>389
ダメ。
オブジェクトファイルが実行可能イメージである保証はないし。

391 :デフォルトの名無しさん:02/06/30 03:07
>>390 そうでしたか、、ども。

392 :デフォルトの名無しさん:02/06/30 03:12
32bitコンパイラはつかえないんでつか?

393 :デフォルトの名無しさん:02/06/30 03:22
使えない

394 :デフォルトの名無しさん:02/06/30 04:37
昔、S-OSというOSモドキがあったの覚えてます?

あれすごく面白かったよね

395 :デフォルトの名無しさん:02/06/30 04:56
それじゃあ32bitOSはどうやって動いてるんですか?

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



はっ、これが「ぶーとしーくぇんす」というやつでは・・・

396 :デフォルトの名無しさん:02/06/30 05:04
>>395


397 :デフォルトの名無しさん:02/06/30 05:50
>>394
Oh!MZ?だっけ?

398 :デフォルトの名無しさん:02/06/30 11:24
>>340
> 明らかに特別なプログラムだろ?
素人さんかな ? だったら、黙ってた方がいいよ。

399 :デフォルトの名無しさん:02/06/30 11:44
>>398
そんなの蒸し返すなよ...

400 :デフォルトの名無しさん:02/06/30 12:25
>>395
x86の場合、16bitのモードから32bitモードに切り替えるんじゃなかったっけ?
途中で。DOSでもWindowsでも動くようになってるはず。
リアルモードとか仮想86モードとかそういう複雑な構成だった気がする。
元々、x86って、MS製OSを前提にしてる設計だからなぁ。
WINTEL同盟以降、MSの要求を受けてCPU設計してるらしいし。


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



401 :デフォルトの名無しさん:02/06/30 12:45
32bitリアルモードってなに?

402 :デフォルトの名無しさん:02/06/30 12:54
(・∀・)シラン

403 :デフォルトの名無しさん:02/06/30 13:04
protected: (・∀・)mode!!

404 :デフォルトの名無しさん:02/06/30 13:20
何でプロテクトやねん!!


405 :デフォルトの名無しさん:02/06/30 13:34
(・∀・)シラン

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と、どっちが良い?


413 :デフォルトの名無しさん:02/06/30 15:08
安定してて数百日はもつOS

414 :デフォルトの名無しさん:02/06/30 15:10
>>411
なぜそこでlinuxが出てくるのか小一時間

415 :デフォルトの名無しさん:02/06/30 15:11
49日毎に確実に落ちるOSと、うまくいけば数百日持つけどハード
が何も使えないOS、どちらが良い?


416 :デフォルトの名無しさん:02/06/30 15:12
>>413
FreeBSDなら98日という記録をマークすますた。


417 :デフォルトの名無しさん:02/06/30 15:13
>>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
・・・

419 :デフォルトの名無しさん:02/06/30 15:15
>>415
49日があるのはWindows95だけだっけ?
NT系は大丈夫だっけ?
どちらにしろ9x系はだめだね。
NT系がいいよ。2000ならハードもかなり使えるし。

420 :デフォルトの名無しさん:02/06/30 15:18
DOSはマイクロカーネル

421 :デフォルトの名無しさん:02/06/30 15:21
ケンタッキーフライドチキンを食いたくなった。

422 :デフォルトの名無しさん:02/06/30 15:21
>>419
カーネル保護されてねーOSが49日持つかよ。
どうせ、PRO串とかDNSとかWINSとかファイルサーバとか限定用途なんだろ?

これくらい一台のPentium PCで出来るはずの事だぞ。
「おい!サーバが、サーバが盗まれたぞ!」
「一台にまとめたんです。何でもできるんですよ。」


423 :デフォルトの名無しさん:02/06/30 15:23
>>422
49日の意味知らないだろ。

424 :422:02/06/30 15:30
>>423
起動合計時間処理がどうたらとか聞いたなぁ。
興味ないんで突っ込まなかったが。

第一、Windows95系で49日持たせる用途なんてねーし。(w


425 :デフォルトの名無しさん:02/06/30 15:31
NT系で十分

426 :422:02/06/30 15:36
49day= 1176 hour = 70560 minute = 4233600 second = 4,233,600,000 ms

つー事かい?

427 :デフォルトの名無しさん:02/06/30 15:41
人間はOSですか?

428 :デフォルトの名無しさん:02/06/30 15:58
win95はパッチがあるよ>49日

パッチ当てても49日も動かさないけど(w

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

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

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

さあ頑張ってHelloWorld 書くぞ。




430 :デフォルトの名無しさん:02/06/30 16:25
>>422
> カーネル保護されてねーOSが49日持つかよ。

(゚д゚)ハァ?

431 :デフォルトの名無しさん:02/06/30 16:31
初めて読む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:

実行も成功!

どなたかアセンブリ言語の入門に
最適なサイトを紹介していただけませんか?


434 :デフォルトの名無しさん:02/06/30 18:02
アセンブラの入門サイト。

http://www.d1.dion.ne.jp/~ecb/assembler/assembler00.html
http://www.geocities.co.jp/SiliconValley/9979/asmhead.html

435 :ひげぽん:02/06/30 18:21
>>432
入れ違いになっちゃいましたね。
BIOS呼び出しとVRAMへの直接書き込みどちらが、
入門者向きでしょうか?
また、メジャーなOSはどちらを選択しているのでしょうか?


436 :デフォルトの名無しさん:02/06/30 18:23
>>435
OSを作るなら当然前者ではありえない。
ただ、前者を使ったモジュールもあるべき。
最初は前者で書いて、あとから後者を追加すればいい。

437 :俺様のブックマーク:02/06/30 18:24
http://www.capricorn.cse.kyutech.ac.jp/~tate/tako/80x86.html
http://hp.vector.co.jp/authors/VA003720/lpproj/int10h/int10h.htm
http://ha3.seikyou.ne.jp/home/Joyit/asm/x86arc.html
http://www.geocities.co.jp/SiliconValley-PaloAlto/5989/programming.html

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で実践する力がまだありません・・・
もっと勉強しないと。


440 :デフォルトの名無しさん:02/06/30 19:17
ここで5年間問いつづけけながらOS作る気か。
くだらん質問する暇があったらまず本を読め
100冊読んでから出直せ。
ネタにしてもつまらん。

441 :デフォルトの名無しさん:02/06/30 19:21
FDベースでIPLを書いてブートさせてBIOSを一通り叩くところまで行けば
後は書籍と試行錯誤のセルフラーニングでどうにかなるだろ。
そこまではおっかなびっくりで質問が多くなるのも無理ないと思うよ。

442 :デフォルトの名無しさん:02/06/30 19:24
>>440
そんな駄目レスを5年間続けながら
無駄に人生を送るよりは良いんじゃない?
本を読めって?
それはお前だろ

443 :デフォルトの名無しさん:02/06/30 19:28
>>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がオススメ。
ソースがべらぼうに読みやすい。

447 :デフォルトの名無しさん:02/06/30 20:20
>>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
は無視していきましょう。

450 :デフォルトの名無しさん:02/06/30 20:43
>>1
は無視していきましょう。

451 :デフォルトの名無しさん:02/06/30 20:45
447=450
はきっと寂しいんだよ。
みんな相手してあげて。

452 :457(!=450):02/06/30 20:52
つか、まじめにスレ読もうとしたおれから言わせてもらうと、
うざいんですけど。

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

なめとるよ。

453 :デフォルトの名無しさん:02/06/30 20:55
>>452
ひげぽんが結構教えて君なのは確かだな。
が、指摘された参考図書に実際に取り組んでいるし
テストコードも書いたりしているから前向きではある。
もうちょっとなま暖かい目で見守ってやっていい。

454 :デフォルトの名無しさん:02/06/30 20:57
457??

455 :デフォルトの名無しさん:02/06/30 20:59
発言予告だろ、とマジレスの振りをしてみるテスト。

456 :デフォルトの名無しさん:02/06/30 21:03
>>453
教えて君ていうか自作自演君では...

457 :デフォルトの名無しさん:02/06/30 21:05
ひげぽん結構がんばってるじゃん。
よく見ると質問もWebで検索して見つかる種類ではない場合が多い
と思うんだけど。
>>252
とかそんな感じじゃん。
勉強した上で出てきた疑問質問なら良いと思うよ。




458 :デフォルトの名無しさん:02/06/30 21:08
linuxとかのソースとか。

459 :デフォルトの名無しさん:02/06/30 21:18
>>457
知ってる事しか質問してないように見える.

460 :ひげぽん:02/06/30 21:27
私の質問と、質問の仕方によりご迷惑をおかけいたしております。

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

どうぞよろしくお願いいたします。


461 :デフォルトの名無しさん:02/06/30 21:44
>>460
あまり気にしなくていいと思ワレ
気にせず、いいOSをツクテクレ

462 :デフォルトの名無しさん:02/06/30 22:08
>>452
ウザイと思ったら、来ないでね。言いたいのは、ただそれだけ。

463 :ひげぽん:02/06/30 22:24
>>446
446さん。
遅くなりましたが、ありがとうございます。
実際にSunriseOS http://www.geocities.com/sunriseos/
フロッピーからブートしてみました。

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



464 :デフォルトの名無しさん:02/06/30 22:28
>>460
ココはOSを作ろうとする人のための質問スレなんだから何でも聞いて良いんじゃない?
オープンに何でも話そうよ。

465 :デフォルトの名無しさん:02/06/30 22:29
文字出力するだけでもVGAを叩かなくちゃいけないんですか?

466 :デフォルトの名無しさん:02/06/30 23:04
ひげぽんが出てこないと妄想君が議論始めるから
ひげぽんは気軽に出てくるように。

467 :デフォルトの名無しさん:02/06/30 23:24
たまに出てきてね

468 :デフォルトの名無しさん:02/07/01 00:57
うん、次は4年後だね

469 :デフォルトの名無しさん:02/07/01 01:11
>>465
BIOS叩いてもできるけど結局同じこと。

470 :デフォルトの名無しさん:02/07/01 03:13
http://ise-city.no-ip.com/~foo/
↑これひげぽん?

471 :デフォルトの名無しさん:02/07/01 03:35
>>436 を読むとBIOSを使うのはあまり良くないようだけど何故なの?

472 :デフォルトの名無しさん:02/07/01 03:44
>>471
PCのBIOSはプロテクトモードから呼び出せないし再入可能でもない。
リアルモードで動くシングルタスクのOS以外からは使い物にならんよ。

473 :デフォルトの名無しさん:02/07/01 04:23
>>472
目から鱗が落ちますた。

474 :デフォルトの名無しさん:02/07/01 06:05
>>472
ちょっとまて。
そうかといって本格的にOS作り始めたとき山のようにドライバ書かなくちゃならなくなるんじゃ?
BIOS叩いてやれば少なくともドライバがないから画面真っ黒とかいうことにはならんと思うが。

475 :デフォルトの名無しさん:02/07/01 07:03
なにをいまさら

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


482 :デフォルトの名無しさん:02/07/01 22:13
大学で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
良いリファレンスを探さねばと、痛感しております。
もう英語でもいいから、いいところ無いかなあ。

487 :デフォルトの名無しさん:02/07/02 00:16
スタックはss:spになる。
それだけだろ?

488 :デフォルトの名無しさん:02/07/02 00:30
>>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
うーん、ひげぴん、がんばってるなぁ

492 :デフォルトの名無しさん:02/07/02 01:25
一般的に、
i++ ; // iに1足す。
みたいなコメントは、かな〜り逝ってよしです。

493 :デフォルトの名無しさん:02/07/02 01:29
とりあえず、アセンブラ初心者はそれで良いんじゃないの?
レジスタの名前は決まっちゃってるんだし、コメントがあっても邪魔じゃないだろ

494 :デフォルトの名無しさん:02/07/02 01:38
アセンブラはそれこそ

mov ax,0x9000
mov ss,ax

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

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

みたいに、その動作単位でコメントを入れると良いかも。

495 :デフォルトの名無しさん:02/07/02 01:44
0x9000 って数には何か意味がある? 単にメモリの後の方って事?

496 :デフォルトの名無しさん:02/07/02 07:28
>>495
ss:spが9000:0000なのでスタックは9000:ffffから使われる。
つまり640KBのケツ。

497 :デフォルトの名無しさん:02/07/02 10:31
ページ違反で落ちないの?

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が失敗している間はずっとループする???



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

int13hでつかってるんだろ。

501 :デフォルトの名無しさん:02/07/03 00:08
>>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 グラフィックフォント)


504 :500: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出来るようになってるとこが見つかると思う。

509 :デフォルトの名無しさん:02/07/03 06:43
>>507 >>508
ひげぽんさんじゃないけど、ありがとう。
このスレは勉強になります。

510 :デフォルトの名無しさん:02/07/03 09:56
はじめて読む486のサポートページ
念のため。

http://www.ascii.co.jp/books/support/apc/4-7561-0213-1.html

511 :デフォルトの名無しさん:02/07/03 10:48
調子はどうだひげぽん
ローダくらいはできたか

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
ひげぽんあんたはすごいよ。
まじで。


521 :デフォルトの名無しさん:02/07/03 23:06
>>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によってはブートストラップローダが
>実行されませんし、パーティションテーブルも読み込まれません。
>つまりこのマスターブートレコードが正当なものであることを保証する署名(シグニチャ)です。


524 :デフォルトの名無しさん:02/07/04 23:44
>>823はひげぽん以下という罠。

525 :デフォルトの名無しさん:02/07/04 23:45
>>523
× >>823

526 :デフォルトの名無しさん:02/07/04 23:47
>>524
え?どういうこと

527 :デフォルトの名無しさん:02/07/04 23:51
>>526
お前、すぐ上の >>522 ぐらいみろよ。

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

バカ丸出しだぞ。

528 :ひげぽん:02/07/05 00:08
>>523
ありがとう。
詳しい説明たすかります。

529 :デフォルトの名無しさん:02/07/05 00:47
だんだんとひげぽんが成長するにつれ、
疑問に答えられるやつがいなくなってきたね。
オレモナー

530 :デフォルトの名無しさん:02/07/05 01:02
>>90
MS-DOSみたいなのを作ればいいんじゃないかな。
なんか、話が発展しすぎてるけど。GUIとかJAVAは当分先だろう。
個人的には、GPLなLinuxよりもBSDをベースにして欲しい。
フロッピー1枚に収まるBSDとか探して、ソース見てみれば?
CUIで低機能でも、個人が作ったOSならば是非とも触ってみたい。

531 :530:02/07/05 01:04
なんじゃこりゃ。
こんなにレスあったんか。
鬱だ・・・氏んできます。

532 :デフォルトの名無しさん:02/07/05 01:36
ひげぽん以外を応援あげ。

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

性格がゆがんでて、怠惰で、頭の悪い2チャンネラの底力を見せてみろ。

533 :デフォルトの名無しさん:02/07/05 01:43
(゚∀゚)ま、ひげぽんが今作ってるのは ブッ茶けて言うと
たんなるブートローだだしねぇ。応援はするけど。OSじゃないよね.

534 :デフォルトの名無しさん:02/07/05 01:46
>>532
頭が悪いのはあなただけです。

535 :デフォルトの名無しさん:02/07/05 02:23
オレ質問いいっすか?>>514 なんだけど、一番最初で、割り込みを禁止して
ss:sp を設定したら、またすぐ割り込み許可してるじゃん。
でも、まだ、割り込みベクタを初期化してるわけでもないし、
割り込みが発生したときに実行されるべきルーチンもロードされてないわけじゃん。
そんな状況で割り込み許可なんてしちゃって良いの?
そんなとき割り込みが発生したらどうなるの?

あと >>515 でひげぽんは retf の説明を「呼び出し元に戻る」と書いているけど
本当はそうじゃないのは分かってるよね? いや念のため確認したかっただけっす。

536 :デフォルトの名無しさん:02/07/05 04:22
>535
あれ?リアルモードの割り込みベクタは、0:0〜0:1000までに存在してて
ベクタ初期化はBIOSがやってくれてて、ルーチンも、UMAのどっかに
BIOS ROMとして用意されていたはず。
#でないとint13hとか、int 09hとかで大問題になるはず……

537 :デフォルトの名無しさん:02/07/05 04:22
まちがい。0:0〜0:400

538 :まぁ、どうでも良いけど:02/07/05 04:41
>>533
おれは、だから仕様をと、、、


539 :デフォルトの名無しさん:02/07/05 05:54
>>535
ブートローダに制御が渡る前にBIOSが設定してる。

540 :デフォルトの名無しさん:02/07/05 06:50
>>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さまさまですね


543 :デフォルトの名無しさん:02/07/05 12:00
>>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 で呼び出されているのは何でしょうか?


546 :デフォルトの名無しさん:02/07/05 12:50
スタックに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はどのレジスタ(スタック)を参照してそのアドレスに飛ぶのでしょうか?
それ以外のレジスタは、とんだ先で実行されるコードで参照されるためのものでしょうか?

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

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




548 :デフォルトの名無しさん:02/07/05 13:38
retfだけじゃなくてretn(ret)もスタックの一番上から
アドレスを取り出してそこにジャンプする命令

549 :デフォルトの名無しさん:02/07/05 13:42
>>544
なんでこのページは第7章しかないの?
はじめから見てみたい。
目次の場所教えて。

550 :デフォルトの名無しさん:02/07/05 13:45
archive.orgへ逝け

551 :ひげぽん:02/07/05 16:42
そろそろ自分でソースを書きそうなのですが
アセンブラのソースって、どういうインデントが良いのかなあ。
コメントは、日本語英語どっちがいいんだろう。
PJ名(仮称)はどうしよう。

552 :デフォルトの名無しさん:02/07/05 17:46
>コメントは、日本語英語どっちがいいんだろう。
本気なら英語のほうが良い。
でも2chでは日本語のほうが良いかも。

PJ名は、2chとかどうよ?

553 :デフォルトの名無しさん:02/07/05 18:03
>>552 本気なら英語のほうが良い。
根拠は?

554 :デフォルトの名無しさん:02/07/05 18:05
日本人以外の奴等とオープンソースで開発するならばという意味です。
英語圏のやつらでなくても、日本語よりはましかと・・・

555 :デフォルトの名無しさん:02/07/05 18:20
英語のほうがいいかも。
今のところひげぽんは本気っぽいからね。
プログラム板の猛者も、立ち上がるかもしれん。

PJ名(仮称) higeponOSでいいんじゃない?

556 :デフォルトの名無しさん:02/07/05 18:47
はっきり言ってガイジンと開発はだめすぎ
クズOSじゃガイジンは見向きもしないし、
良いOSになりそうだったらそれは日本人の手柄でありたいと思うがどうよ?

557 :デフォルトの名無しさん:02/07/05 18:59
英語のメリット
日本人以外のやつにとって敷居が低くなる
英語のデメリット
日本人にとって読みにくい。
いんちき英語コメントになる可能性がある。

日本語のメリット
日本人にとって非常に読みやすい。
日本語のデメリット
日本語はマイナー言語である。


558 :デフォルトの名無しさん:02/07/05 19:16
技術以外の話題になるとみんなとたんに元気になるね。

559 :デフォルトの名無しさん:02/07/05 19:16
いいじゃん。
少しでも貢献したいんだよ。
純粋に。

560 :ひげぽん:02/07/05 19:31
アセンブラのインデントはemacsのasm-modeに準じることにしました

コメントは、どうしましょう。
一応良いOSを作るつもりなので、
英語のほうが良いのでしょうか?


561 :デフォルトの名無しさん:02/07/05 19:41
つもりって…
死ぬほど無謀だな

562 :デフォルトの名無しさん:02/07/05 19:46
ひげぽん期待age!
2ch発信のOSをつくれり。

563 :デフォルトの名無しさん:02/07/05 20:14
オープンソースにしてsourceforgeにプロジェクト登録はどうか?
ttp://sourceforge.jp/

容量無制限かつcgi可のHPスペースとか、MLとかが無料で利用できるし、
何よりも新規プロジェクトに飢えてるから、本家よりも軽快だし。

564 :デフォルトの名無しさん:02/07/05 20:27
>>559
単にブートローダーの話がつまらないだけだと思われ。

アプリケーションプログラマには関係ないし。

565 :デフォルトの名無しさん:02/07/05 20:29
日本語はUTF-8だのSJISだのEUCだのの変換が面倒かもな。


566 :デフォルトの名無しさん:02/07/05 20:32
せっかくだからUCS4ネイティブで行きましょう。

567 :ひげぽん:02/07/05 20:35
>>565
コメントは英語で行くことにしました。
いんちき英語にならぬよう祈るのみです。

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

>>563
それは良いかもしれませんね。
骨格部分が出来て公開できる段階になったら
sourceforgeにいくかも!!

568 :デフォルトの名無しさん:02/07/05 20:44
ttp://sourceforge.jp/projects/hos/
こんな感じ?こっちは組み込みOSだけど。

569 :デフォルトの名無しさん:02/07/05 20:45
OSのデベロッパーってすごいな

570 :ひげぽん:02/07/05 21:34
>>568
見てみました。
なんだか見ているだけでやる気が出てきます(笑)
やはり複数人で開発すると楽しそうですね。


571 :デフォルトの名無しさん:02/07/05 23:08
>>568
HOSって、パトレイバーか?(w

572 :デフォルトの名無しさん:02/07/06 03:44
>>571
作者がファンだから、あやかってるらしい。

573 :デフォルトの名無しさん:02/07/06 06:32
http://lkh.linux.or.jp/24kernel/source/html4/boot.html

574 :デフォルトの名無しさん:02/07/06 06:40
>>573
俺はあんたを愛してしまいそうだ。

575 :デフォルトの名無しさん:02/07/06 07:06
お前らUNIX Magazine 7月号の特集は読みましたか?
なかなか、参考になるぞ。















っと言おうと思ったが、>>573 の方が詳しい罠

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

ページ数を3倍増くらいしてがむばってほしい。>>白崎さん
って、2チャンなんか見てないかな。

577 :ひげぽん:02/07/06 13:30
>>573
貴重な情報サンクス!
ブート部はgasで書かれているようですが、
参考になります。

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



578 :デフォルトの名無しさん:02/07/06 15:54
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等お詳しそうですね。
今後もアドバイス頂けるとうれしいです。


580 :578: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  


585 :デフォルトの名無しさん:02/07/06 22:36
>>584
'Hello!' の後ろに、00h がないからじゃないの ? アセンブラは、C みた
いに "ABC" で 00h は付加してくれないよ。
Intel 系のアセンブラは良くわかんないけど...
msg db 'Hello!', 00h
とか書けばいいのでは ?

586 :デフォルトの名無しさん:02/07/06 22:41
>>584
msg db 'Hello!' を
msg db 'Hello!$'
cmp al, 0 を
cmp al ,'$' にしてみては?

587 :586: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!!
これで結構すっきりかけたと思います。

590 :585:02/07/06 23:11
>>586
なんか懐かしい。そう言えば、Intel 系って文字列のターミネータが何故
か '$' だったよね。Motorola 派 (流派かよ!!) としては、結構不思議
でした。

>>589
ひげんぽん一歩前進、おめでとう。俺がついていけるのは、このあたりま
でだけど、がむばってね。

591 :ひげぽん:02/07/07 00:07
>>585
本当にありがとう。
おかげさまで、ちょっとだけ前に進みました。

次の目標は、
フロッピーの最初の512byte以降のプログラムを読み込めるように
することです。

592 :デフォルトの名無しさん:02/07/07 00:15
>>590
文字列のターミネータが$なのはMS-DOSのシステムコールの仕様。

このスレ見てたらなんか作りたくなってきた…(w

593 :ひげぽん:02/07/07 00:26
>>592
>このスレ見てたらなんか作りたくなってきた…(w
作りましょう。
ぜひ・・・


594 :デフォルトの名無しさん:02/07/07 01:24
ひげぽん期待age
有言実行すばらしい。

595 :デフォルトの名無しさん:02/07/07 02:00
ひげぽん素晴らしい。
漏れもOSとまではいかないでもハードウェアとアセンブラの勉強を
兼ねてOSもどきを作ろうとか思ってたけどまだ、何もはじめてない…
水戸黄門の歌みたいだ…♪後から来たのに追い越され〜
鬱…

596 :590:02/07/07 07:41
>>592
ちょっと惜しい。CP/M からだよ。固定文字列なら、いいんだけどカーソル位置
指定なんかで動的に文字列生成する時に、たまたま '$' が生成されてはまった
事あり。
と言うように、優れていない仕様でもとにかく具体的に動くものがあるとなんか
萌える。そう言う意味で、>>588 みたいにソースを適時出すのはいいことだと
思う。ひげぽんがむば。

597 :592:02/07/07 08:15
>>596
Intel系って80系も含めて言ってたわけね。
なんかアホみたいだ、俺。

ってことで、mingw32とnasmをインストール。

598 :592: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に設定しているのですが、
これは絶対必要な処理なのでしょうか?



600 :デフォルトの名無しさん:02/07/07 12:17
7c0h:startはseg:offの形式だっつーの。


601 :デフォルトの名無しさん:02/07/07 12:18
cs=dsとはコードとデータが同一セグメントにあると言うこと。
vcのリンカ設定で言うなら、/merge:.data=.textってことサ

602 :ひげぽん:02/07/07 12:26
ありがとうございます。

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

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


該当部分をコメントアウトすると、実行しても文字列が
表示されませんでした。

603 :デフォルトの名無しさん:02/07/07 13:44
>>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
いんたーふぇーすかってこよ

605 :デフォルトの名無しさん:02/07/07 14:22
org 0
jmp 0x07c0よりも
org 0x7c00としたほうがds,esにcsをセットしなくてよくてお徳なんじゃないですか?

606 :デフォルトの名無しさん:02/07/07 14:33
そんなことはない。
raw binaryの実行イメージだから、セグメントの設定は行ってくれない。

607 :デフォルトの名無しさん:02/07/07 15:08
そうなんですか?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を指定するセグメントの先頭にブートプログラムが
ロードされているかが分からないです。

609 :デフォルトの名無しさん:02/07/07 16:27
ロードされる物理メモリの場所は一定。

far jmpではCSの値も変更できるから、07c0:0000にロードされると見ることが出来るわけ。
07c0:0000 と 0000:7c00は物理的には同じアドレスを指してるってコトをよぉく理解しよう。

610 :ひげぽん:02/07/07 16:40
>>609さん
ありがとう。
少ない頭で、ただいま考え中です。

611 :609: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さんのおかげで分かってきました。

613 :609: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です。



617 :デフォルトの名無しさん:02/07/07 17:24
すいません。まだ分からない奴がいるんですが、

>>605 に関連して

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

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

あと、
jmp offset
は相対アドレスのジャンプで、
jmp segment:offset
は絶対アドレスのジャンブって事ですか?

618 :デフォルトの名無しさん:02/07/07 17:27
>>616
それは取り敢えずリアルモードのまま?

619 :デフォルトの名無しさん:02/07/07 17:28
>>616
まだプロテクトモードに入ってないから、
32bitコンパイラは使えないよ。

16bitコンパイラでバイナリを生成した後にexe2bin汁。
MSのexe2binは.com形式のためにorg100扱いで実行ファイルを生成した鴨

620 :デフォルトの名無しさん:02/07/07 17:29
>>617
yep

621 :609: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のつなぎの部分とかが全然分かっていない状態です。
どういう環境で、どういう手順を踏んだら良いかすら分かっていないです。

623 :デフォルトの名無しさん:02/07/07 17:34
アセンブラとCの繋ぎなんて関係ない。
メモリ上にロードしてエントリポイントのアドレスへjmpするだけだから。
#場合によっては環境の設定をしてから。


624 :ひげぽん:02/07/07 17:41
Cでソースを書く(インラインアセンブラを含む??)
→どのライブラリ、関数が使用可能かということが分からない

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

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

もう分からないこと尽くしです、
どなたか、取っ掛かりだけでも教えてもらえないでしょうか?

625 :デフォルトの名無しさん:02/07/07 17:45
1 コンパイラ依存だし、ライブラリのソースが無い物の場合、
 自分で調べられないなら全部作る必要がある。
 まぁ、string.hくらいは使えるかもね

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

2 ディスクに書き込んでも良いし、ファイルシステムに保存しても良いけど、
 後者の場合は自前で読み込むか、FSサブシステムをロードしておく必要がある。


626 :デフォルトの名無しさん:02/07/07 17:46
ていうか、ローダーの時点でさっさとプロテクトモードに移行して、
そこから実行するのが吉かと。

627 :609:02/07/07 17:48
果たしてあれだけの処理が512バイトに収まるかという問題も有る気が…

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

確かexe2binしたプログラムのエントリポイントは普通0だった気がするから、
セグメントの先頭に配置してやれば動くはず。

628 :デフォルトの名無しさん:02/07/07 17:49
>>627
MS-DOSの.com形式は256バイトのPSP領域を勝手にOSが用意するから、
ORG 100hのバイナリが生成されたと思うけど?

629 :デフォルトの名無しさん:02/07/07 17:52
別に32bitコンパイラでも使う即値が16bit以下ならリアルモードでも動かせるんじゃなかったっけ?

630 :609: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 に入り切らない場合は
絶対アドレスジャンプの命令に置き換わっていた気がしますが、、


633 :609:02/07/07 18:19
>>632
ザッツライトです(汗
私の言っていることが不正確でした。

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

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

(知ったかぶり口調は自制するです…スマソ

634 :デフォルトの名無しさん:02/07/07 18:33
おいおい。
ひげぽんがしらぬまにまた成長している・・・



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

リアルモードでプリフィックスなしではこうなるはず。

636 :デフォルトの名無しさん:02/07/08 00:29
おれも知りたいコンパイラ。

637 :ひげぽん:02/07/08 00:48
OS開発環境を整えるページを見つけました。
http://www.osdev.org/developers/guide01/

ただし、gccとnasmの組み合わせが多いですね。
Windows環境でいけるのが、みつからない・・・

638 :デフォルトの名無しさん:02/07/08 01:03
もちろんこれから作るOSは操作でわからないことがあると
幼女声で答えてくれたり気紛れな態度を取ってくれる萌えOSなんだろうな?


639 :デフォルトの名無しさん:02/07/08 01:11
>>638
ひげぽんが喋ります

640 :デフォルトの名無しさん:02/07/08 01:29
>>639
それは萌え(w

それ以前に喋らすためにはサウンドドライバ書かなきゃいかんだろ
昔のソフトみたいにBEEPで喋らすのもありだが(藁

641 :FreeDOS教徒:02/07/08 01:50
ひげぽんたん‥‥‥ハァハァ(ぉ

642 :592:02/07/08 02:10
>>637
gcc(mingw32)もnasmもWin32で動くぞ。

643 :デフォルトの名無しさん:02/07/08 02:52
>>637
いくらひげぽんOSがいいものになっても、それを自分でコンパイルするには、
VCとか他の有料アプリを購入しなければ行けないとなればオレ的に萎え〜です。
gccとnasmは萌え〜。

644 :デフォルトの名無しさん:02/07/08 10:47
mingwinってどうやって使うの?
使い方がいまいち分かんない。

645 :デフォルトの名無しさん:02/07/08 12:02
そもそもそれ何?

646 :デフォルトの名無しさん:02/07/08 15:56
MingW32の間違いでした。



MingW32は発音できないから、ミングウィンか、ミングイン、の方が言いやすいなぁ。(ぼそ)
みんぐwは尻切れっぽい感じが・・・。(ぼそぼそ)


647 :645:02/07/08 17:23
いや、だからさ、そのMingW32って何なのさ。
おせーて、おせーて、おせーてよ。

648 :デフォルトの名無しさん:02/07/08 17:26

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

あーあ。オッチーにも愛の手(やさしい説明)を。

649 :デフォルトの名無しさん:02/07/08 17:36
ム板でスレ建てるコテハンに優秀な奴はいないと思ってたけどそうでもないんだな
とひげぽんを見てふと思ひ

650 :デフォルトの名無しさん:02/07/08 18:03
>>649
しかもよく読めば単発質問な。

651 :デフォルトの名無しさん:02/07/08 18:15
> ム板でスレ建てるコテハンに優秀な奴はいない
誤解だな。正確には
「ム板で単発質問でスレ建てるコテハンに優秀な奴はいない」だ

ここの1は単発質問をしていないので上記の条件には当てはまらない。

652 :デフォルトの名無しさん:02/07/08 18:27
>>648
どこが分からない?

653 :デフォルトの名無しさん:02/07/08 19:54
FreeDOS教徒たんの開発環境ってどんな感じょ?

654 :デフォルトの名無しさん:02/07/08 20:34
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。


656 :655:02/07/08 22:12
【追加説明】

MinGW: Minimalist GNU For Windows

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

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

657 :デフォルトの名無しさん:02/07/08 22:19
SJIS通らないよ。

それから、gcc3.1系をばらで落とした方が良いかも知れない

658 :デフォルトの名無しさん:02/07/08 22:30
>>656
UNIXでコンパイルすればUNIXでWin32のコードを吐くクロスコンパイラになる。

>>657
別に通らないってことはないだろ。
ただ、特にSJIS対応してないから
// ソ
とか
// 表
とか2バイト目に '\' が入ってると楽しいことになるだけで。

659 :デフォルトの名無しさん:02/07/08 22:41
>>658
そういうのは通らないというのだ

660 :デフォルトの名無しさん:02/07/08 23:05
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
Latest MinGW-1.0 Snapshot
を解凍して、DOSプロンプトから実行したら動いたよ。


661 :デフォルトの名無しさん:02/07/08 23:16
1.0Snapって2.9.4じゃなかった?
3.1落とせって

662 :デフォルトの名無しさん:02/07/08 23:26
ああ。ソースフォージに行けばいいのね。最新はここか。
http://sourceforge.net/projects/mingw/

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

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

CVSもどういう事なんだか良くわかんないし、死にそう。
CVS超わかんねーよ。ヽ( `Д)ノウワァァァァン
ソースフォージどうなってんだよ。ヽ( `Д)ノウワァァァァン


663 :デフォルトの名無しさん:02/07/08 23:28
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
----------------
んじゃ、ひげたんこれからもガムバテネ。

664 :デフォルトの名無しさん:02/07/08 23:32
>>662
httpリクエストのAccept-Languageヘッダ見てるだけだと思うが。

665 :デフォルトの名無しさん:02/07/08 23:39
http://prdownloads.sourceforge.net/mingw/bunutils-2_12_90-20020518-1.tar.gz?download
http://prdownloads.sourceforge.net/mingw/gcc-3_1-core-20020516-1.tar.gz?download
http://prdownloads.sourceforge.net/mingw/make-3.79.1-20010722.tar.gz?download
http://prdownloads.sourceforge.net/mingw/gdb-5.1.1-1-mingw.tar.gz?download
http://prdownloads.sourceforge.net/mingw/mingw-runtime-2.0.tar.gz?download
http://prdownloads.sourceforge.net/mingw/w32api-1.5.tar.gz?download

これだけ落とせ。
Ada/Pascalも欲しければどうぞ

666 :デフォルトの名無しさん:02/07/08 23:46
とりあえず、スナップショットが実行可能形式配付ファイルだと思われる事は解った。
最新版は1.0.8。
386、586、686、って分かれてるな。最適化済みの実行ファイルって事か。
なんかexeっぽいけど何だ?インストールプログラムかな?

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


667 :666:02/07/08 23:51
>>665
どうもありがとう。

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



668 :デフォルトの名無しさん:02/07/08 23:53
gcc-coreはc/c++コンパイラも含んでる

669 :ひげぽん:02/07/08 23:54
なんだか盛り上がって来てうれしいですね。

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

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

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

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

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




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

これらの混在環境って良いのか?
バージョンで混乱したりしないのかな?

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

ちなみにNASM&BochsはWin版を使ってます。


672 :666:02/07/09 00:08
あり?良いのか。

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

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

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



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

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

でもなんだか前より増してやる気が出てきた!
会社でこそっとやろう。。。


674 :デフォルトの名無しさん:02/07/09 01:23
djgppって32bit DOS extender搭載したDOS用のコンパイラじゃないの?


675 :デフォルトの名無しさん:02/07/09 03:41
DOSエクステンダ用のコンパイラなら、
TOWNS用にHigh-Cなんてのを持ってたなぁ....
今はどこかへ行ってしまったが。

676 :デフォルトの名無しさん:02/07/09 03:44
メディア、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
のようなものを使っていた。

680 :デフォルトの名無しさん:02/07/09 23:22
>>679
(・∀・)ソレダ!!

681 :デフォルトの名無しさん:02/07/10 00:04
ちょっと分かった。
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コールってことになるかな。

685 :684:02/07/10 00:51
死ぬほどミスった。>>683他スマソ

686 :デフォルトの名無しさん:02/07/10 00:56
>>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 部分だけ
書き換えれば良くなるでしょ?

688 :デフォルトの名無しさん:02/07/10 01:01
>>686
つまり、普通にコンパイルしたんではスタートアップルーチンがあるから
上手く行かないって言いたい?

689 :デフォルトの名無しさん:02/07/10 17:55
あれ?スタートアップルーチンってリンカがつけるもんじゃなかったっけ?

690 :デフォルトの名無しさん:02/07/10 17:58
違う

691 :デフォルトの名無しさん:02/07/10 17:59
正確に言うとエントリポイント(スタートアップルーチン)を含んだ
オブジェクトファイルやライブラリを、大抵のリンカが暗黙の内にリンクしているだけで、
それを回避するオプションが付いているはず

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
ひげぽんさん、サイト作ろうよ


700 :デフォルトの名無しさん:02/07/10 22:00
プロテクトモードに移行したあとの次の命令で、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回目の割り込みは発生しちゃだめって事らしいヨ

702 :デフォルトの名無しさん:02/07/10 22:15
>>700
それ俺もなった。で試行錯誤の結果やっと上手くいった。
それ貼るからちょっと待ってて。

703 :デフォルトの名無しさん:02/07/10 22:38
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
; -------------------- 大きすぎて一度に書き込めないので一度ここで切る。


704 :デフォルトの名無しさん:02/07/10 22:39
>>703 の続き
3rd exception を発生させずにプロテクトモードに移行できたバージョン 2/2
------------
bits32

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

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

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

hang:
jmphang

printmov[edi],al
addedi,2
ret
times512-($-$$)db 0


705 :703=704:02/07/10 22:40
ごめんタブが消えた、、、

706 :デフォルトの名無しさん:02/07/10 22:59
>>705
どうもありがとうございました。これから格闘してみます。
ここまではなんとかなりましたが、ここからが厳しいところですね。
頑張りたいと思います

707 :ひげぽん:02/07/10 23:01
>>703>>704
ありがとう!!
先を越されてしまってくやしいっす。
勉強不足です。反省。


708 :デフォルトの名無しさん:02/07/11 00:46
少なくとも3人は出来るやつがいる模様。(ひげぽんも含む)
お前ら全員で2ch OS作ってください。


709 :デフォルトの名無しさん:02/07/11 00:56
もちろん 2ch 運営に最適化されたOSということで (w

710 :デフォルトの名無しさん:02/07/11 01:08
運営ですか!!!

711 :デフォルトの名無しさん:02/07/11 01:15
作っても夜勤が採用しないワナ。

712 :デフォルトの名無しさん:02/07/11 01:18
説得汁。

713 :デフォルトの名無しさん:02/07/11 01:21
作れないうちから心配するなアフ

714 :デフォルトの名無しさん:02/07/11 01:24
> 704
> movesp,0x1000 ; ここが 0 だとなぜかエラー
0だとスタックに積んだとたんに逝っちゃうよ。


715 :デフォルトの名無しさん:02/07/11 01:33
無事動きましたー。csが1000ならアドレスは10000だということを忘れてました。
こんにちはプロテクトモード

716 :デフォルトの名無しさん:02/07/11 02:12
割り込みについて調べていたらこんなページをみつけました。
ttp://poli.cs.vsb.cz/misc/rbint/ix/index.html


717 :デフォルトの名無しさん:02/07/11 03:32
>>716
>>507-508
確か、ベクターにwinhelp版があったはず。

718 :デフォルトの名無しさん:02/07/11 12:48
とりあえず、2ndローダでプロテクトモードに切り替えるところまで成功。
PE形式のカーネルのロードは面倒そうだ…。

719 :デフォルトの名無しさん:02/07/11 13:45
皆さんブートローダの次のステップをどのようにする予定ですか?

720 :デフォルトの名無しさん:02/07/11 17:50
メモリマネージャとタスクマネージャ

721 :デフォルトの名無しさん:02/07/11 18:35
文字出力、ファイルIO、プロセス終了のファンクションリクエストくらいあれば、とりあえずいろいろ動かせる。

722 :デフォルトの名無しさん:02/07/11 18:44
>>720
いきなりは無理では。

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

ブートローダ

カーネル

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

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

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

723 :722:02/07/11 18:56
>>721
あ、かぶった。

>>722をちょい訂正。

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

名前が逆じゃん、出力がOutputで入力がInputね。

724 :デフォルトの名無しさん:02/07/11 19:12
ネイティブな開発はよくわからんが
システムコールの設計は慎重にやってくれよp

725 :デフォルトの名無しさん:02/07/11 19:39
>>724
なんで?

726 :722:02/07/11 19:48
>>724
別に>>722のシステムコールを最後までそのまま使えって意味じゃないよ。
あくまで暫定的なもの。ファイルシステムがなければ、openやread、write、
close等のファイルに関するシステムコールなんて作れないでしょ?ファイル
システムやメモリマネージャが出来たら、そのときシステムコールを作り
直せばいい。

727 :デフォルトの名無しさん:02/07/11 19:57
実務開発で言うなら、いわば技術検証(と言う名のお勉強)でしょ?
まだ設計に入る段階じゃないと思われ。
勿論、先に設計が来る方が良いけど、未経験なんだから良いんじゃないの?

728 :724:02/07/11 21:16
だよねーテヘヘぼくちゃん先走っちゃったアハハ

729 :ひげぽん:02/07/11 22:58
そのうちlibcを採用しようかと・・・


730 :718:02/07/12 01:18
libcなら組込向けのnewlibが扱いやすいかも。

http://sources.redhat.com/newlib/

731 :718:02/07/12 01:27
OSに依存しないドライバインターフェース…らしい。

Uniform Driver Interface
http://www.projectudi.org/


732 :718: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/


733 :デフォルトの名無しさん:02/07/12 03:41
いま、 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 ポートアクセスがあったらまずい気がするなぁと感じるけど
それであってる?

734 :718: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割り込みハンドラでグラフィックコントローラを叩く可能性を考えてるのかと。

735 :デフォルトの名無しさん:02/07/12 09:03
>>722
かなり賛成。ちょうど良い目標ダネ。
ただちょっと分からなかったんだけど >>722 の 5 はマルチタスクを
想定しているの? オレはシングルタスクで call とか jmp 使えば
いいと思うんだけど。
あとバイナリを展開ってどの程度のこと考えてる?
オレは実行イメージそのままで良いと思ってる。(固定アドレスに置くんだから)
あと、 >>722 では触れられてないけど、VRAMとか IOポートにアクセスするのは

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

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

という段階を踏んだ方が良さそう。
で確認なんだけど step 2では、ソフトウェア割り込み使えばいいんだっけ?
そして割り込みを発生させる関数をスタティックリンクすればOK?

736 :デフォルトの名無しさん:02/07/12 10:45
>>735
システムコールの呼び出しにはコールゲートかトラップゲートを使うかと。


737 :riarutyuubou:02/07/12 18:12
きょう始めてよむ486が届いた
7月11日に発送してもらったんだけど、はじめて読む486の12刷発行が
7月11日だった。(わら
はじめて読む8086の方がまだだ、本来こっちの方が先に届いてほしいんだが。

738 :デフォルトの名無しさん:02/07/12 19:25
そんなに売れてるのか… > はじめて読む

折れもリア厨のころに買って読んで、サンプル必死に打ってた気がする。
8086の方は英語がOKなら、上でガイシュツのInterrupt Listとかで十分間に合う。はず。

739 :manko_chinko==737 ◆c2rpKRNM :02/07/12 19:43
>>738
どうも
僕は英語駄目なんで(英検三級がやっととれたレベル)、日本国内で日本語を使用した
86系アセンブラの解説ページで勉強しようと思うのですが、、、


740 :manko_chinko==737 ◆c2rpKRNM :02/07/12 19:51
始めて読む8086の注文はキャンセルしました


741 :FreeDOS教徒:02/07/12 20:23
超亀レスですごめんなさい。

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

>>654
あとsuppl.zipが要るかも。ソースの\supplに説明があるはず。

742 :653:02/07/12 20:31
オールアセンブラ Σヽ(´i i`)ノ ぬりがとう

743 :デフォルトの名無しさん:02/07/12 23:13
C言語から呼び出すときのアセンブラのコードで
破壊していいレジスタはどれ?
eax,edx は戻り値に使われるから分かるけど、他のは?

ぐぐったら windows での話は出てきたけど、これってコンパイラ依存の
話だからgcc なら別だよな?

744 :デフォルトの名無しさん:02/07/12 23:21
そんなもん、gccで関数をasm出力すれば
わかるだろうに。

745 :デフォルトの名無しさん:02/07/12 23:25
edi

746 :654:02/07/13 22:45
>>741
Thank you.
これから調べてみます

747 :デフォルトの名無しさん:02/07/13 23:12
プロテクトモードでjmpするとエラーになってしまう...なんでだー

748 :FreeDOS教徒: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


753 :デフォルトの名無しさん:02/07/13 23:49
>>749
gdt08のセグメントベースは10000hにしてみてはどうでしょうか?
違うかな

754 :デフォルトの名無しさん:02/07/13 23:55
>>747
は既に解決してますか?まだなら俺にちょっと心当たりがあります。
もしかして、cs を 08h とかそう言うGDTRで設定したセグメントにする前の段階の話じゃないですか?

755 :デフォルトの名無しさん:02/07/14 00:02
>>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
があります。

758 :デフォルトの名無しさん:02/07/14 00:08
ひげぽんまだ寝るなよ。あとで、アドバイスすっから。

759 :747&753:02/07/14 00:10
>>754
それが設定した後なんです。
それと753に書いたの間違えました。
dw set_cs_desc1+1000h
は+10000hではないでしょうか?

760 :ひげぽん:02/07/14 00:11
>>758
ありがとうございます。
お待ちしております。
よろしくです。

761 :デフォルトの名無しさん:02/07/14 00:17
>>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
↑ここの部分はどうなってた?

762 :デフォルトの名無しさん:02/07/14 00:23
まとめると、多分こう言うことだ。
エラーのとき CSが1000hになっているってことは、
コードはリニアアドレスで 10000h に置いたってことだ。
だから、
dw set_cs_desc1 + 1000h
ここは、
dw set_cs_desc1 + 10000h
にしなければ行けない。(リニアアドレスを書かなければ行けないから)

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

結論もっと低いアドレスに置くべき。

763 :デフォルトの名無しさん:02/07/14 00:30
おいっ!寝たのかよ!!レスしろよ。

あと32ビットモードになったら bits 32 にしないとだめだよ。

764 :デフォルトの名無しさん:02/07/14 00:34
ちっ、寝ちまったか。
------------
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
入れ違いです。すいません。


768 :747:02/07/14 00:43
調べるてみると
label:
jmp label
はだめで
jmp label
label:
はエラーなしでした。
>>765
もし1000hなら
dd gdt0+1000h*16
の*16hがいらないのではないでしょうか?

769 :デフォルトの名無しさん:02/07/14 00:44
ひげぽん(・∀・)オキテタ!!

>>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
としてみましたがだめでした。

774 :デフォルトの名無しさん:02/07/14 00:59
>>772
それなら、リニアアドレスでは10000hになるのは分かる?
そして、flush_q1 の後のジャンプの場所指定で書かなければいけないのはリニアアドレス。
(なぜならもうプロテクトモードなんだし、08 のコードセグメントのベースが0に成っているから)

775 :デフォルトの名無しさん:02/07/14 01:01
>>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

うーんどこが悪いかが分からない。
もう少しねばってみます。

779 :デフォルトの名無しさん:02/07/14 01:12
flush_q1 では実はまだ32bit モードじゃないらしいんだよ。
おれも詳しくは分からないけどプロテクトモードだけど16bit モードってのがあるらしい。
(bochs のソースを見てそう思った)
本当に32bit モードに成るのは CS が 08 に成ってから。
だから、それだとbits32を置く場所がちょっと違う。


780 :ひげぽん:02/07/14 01:15
>>779
ありがとうございます。
bits 32の場所を変えてみましたが、だめでした。
>>704(プロテクトモード移行成功)も同じ場所だったので
今回のエラーの直接の原因ではないかもしれません。

781 :デフォルトの名無しさん:02/07/14 01:19
>>780 了解。
じゃあ、エラーが起きてる IP=0x003b のところはソースでいうどこにあたる?

782 :ひげぽん:02/07/14 01:25
>>781さん
IPってオフセットアドレスですよね?
ソースのどの部分が該当するかを調べるには
どうしたらよいのでしょうか

質問ばかりで申し訳ないです。


783 :デフォルトの名無しさん:02/07/14 01:26
>>782
デバッガある?

784 :ひげぽん:02/07/14 01:35
>>783
DJGPPにgdb.exeがついてきていましたが
これでよいですか?
使ったことがないのですが、これで出来るなら
明日にでも勉強いたします。


785 :デフォルトの名無しさん:02/07/14 01:38
gdbで、いいかどうかはちょっと分からない。
ベクターとかにありそうなMS-DOS用のcomファイルを調べられるの使うのが良い。
あとは、nasm の -l オプションかな。

786 :ひげぽん:02/07/14 01:41
遅くまでありがとうございます。
実行しながらデバッグするのでしょうか?
それだとBochsの機能でなにかあるのかなあ。

787 :デフォルトの名無しさん:02/07/14 01:45
もしかしたら bochs にそういう機能があるかもしれないけど俺は分からん。
つうか、今はどこでエラーが起きたのか分かれば良いんだから、
実行しながらデバグなんてしなくて良いよ。
-l は試した? 結局 3b ってどこなのさっ!!


788 :747:02/07/14 01:47
なにも変更してないのに突然エラーなくなりました。わけわからん。
相談に乗っていただいた方どうもありがとうございました。

789 :デフォルトの名無しさん:02/07/14 01:49
>>747
おめでと。役に立てなくてゴメン。
またなんかあったら聞いてね。今度こそ役立つアドバイスするカラ

790 :747: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は発生しませんでした。

793 :デフォルトの名無しさん:02/07/14 13:13
今でも死ぬときのIPは 3bなの?

794 :ひげぽん:02/07/14 13:16
ええ。
3bです。こんな感じです。
00000195256i[CPU ] | EIP=0000003b (0000003b)


795 :デフォルトの名無しさん:02/07/14 13:18
>>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
板を汚して申し訳ありません。
現状は上記の通りです。

801 :デフォルトの名無しさん:02/07/14 13:32
もしかして>>791は1stブートのやつじゃ、、

802 :ひげぽん:02/07/14 13:35
>>801さん。
ええその通りです。
BIOS経由で文字列出力する部分です。
nasmでアセンブルするときはひとつにまとめるので
リストもfirst boot, second bootもあわせたものになっています。



803 :デフォルトの名無しさん:02/07/14 13:37
>>802
Σ(゚д゚lll)ガーン もっと考えれ。
second boot の先頭を 0 として 3b がどこかを調べなきゃ意味ないだろ。

804 :795: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
もっと考えます。
いま、とりあえず垢をとっています。


806 :デフォルトの名無しさん:02/07/14 13:47
もしかしてひげぽんは
1st-boot と 2nd-boot くっつけてアセンブルしない?
別々にアセンブルしてからくっつけた方が良いかも

807 :795:02/07/14 13:54
あと、ベースアドレスが00010000h、リミットが0000FFFFhで16ビットのセレクタを用意して、
そっちで作業した方が楽だと思われ。
ベースアドレスが00000000hのセレクタに切り替えると、オフセット計算が面倒なことになる。

808 :デフォルトの名無しさん:02/07/14 14:04
>>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 とかつかって二つをくっつける。
これで上手く行くはず。


809 :795:02/07/14 14:12
>>808
>>696でes:bxが1000:0000だからリニアアドレスは00010000hだって。

810 :デフォルトの名無しさん:02/07/14 14:13
>>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さんのおっしゃる通りになってました。
今から別々にアセンブルを試してみます。

812 :809:02/07/14 14:35
>>810
 ∧||∧
(  ⌒ ヽ
 ∪  ノ >>773で変更してたのね…
  ∪∪


813 :デフォルトの名無しさん:02/07/14 14:37
ドマイ。オフセットをWORDに入れなきゃだから。
>>807みたいな手もあるけど、、、、。

814 :ひげぽん:02/07/14 14:39
ひげぽんです。
皆さんありがとうございます。
別々アセンブルでも同じIPでエラーが起きてしまいました。

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

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




815 :デフォルトの名無しさん:02/07/14 14:40
>>814
そっか。自信あったんだけどダメだったか。
ソース公開を待つことにするよ。

816 :デフォルトの名無しさん:02/07/14 14:53
あれ?やっぱできるじゃん。
俺、ひげぽんの >>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にしました。


819 :デフォルトの名無しさん:02/07/14 18:23
>>818
もちろんアセンブラで書いたんですよね?

820 :ひげぽん:02/07/14 18:30
>>818
私の腕前では無理です(笑)


821 :デフォルトの名無しさん:02/07/14 18:46
>>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)

823 :821: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]はアセンブル時にエラーになってしまいました。



826 :821: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]。

827 :821:02/07/14 19:31
> gdtrの指すアドレスは0100:0015。
> 実効アドレスは00000115h。

嘘書くなよ、俺。
00001015hが正解。

828 :821: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を本気で作ろうと考えている人たち
一緒にがんばりましょう。


833 :デフォルトの名無しさん:02/07/14 20:07
ひげぽんまだいる?もう少し補足がある。

834 :ひげぽん:02/07/14 20:08
>>833
います。

835 :833:02/07/14 20:19
ごみん。間違い。>>833 は忘れて。

836 :ひげぽん:02/07/14 20:28
>>835
了解です。

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

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

どなたかかっこいい名前ありませんか?


837 :デフォルトの名無しさん:02/07/14 20:30
higepos

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



839 :デフォルトの名無しさん:02/07/14 20:35
ヒゲポソ

840 :=・ :02/07/14 20:36
まんこ

841 :ひげぽん:02/07/14 20:37
>>839
あ!半角カタカナにして、2chであることを考慮すると
読めるってことですね。
良い名前随時募集中!!

842 :デフォルトの名無しさん:02/07/14 20:44
2chOS

843 :デフォルトの名無しさん:02/07/14 20:52
2ちゃんどうず

844 :ひげぽん:02/07/14 20:56
>>842
>2chOS
見た目は非常に良いですね。
にちゃんおーえす?
にこす?

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

OSASK,nwsosもそれぞれ読み方が良く分からないです。
引き続き募集!


845 :FreeDOS教徒:02/07/14 21:18
OSASK -> おさすく/おーえすあすく
NWSOS -> なうえすおーえす‥‥と呼んでいる

しっかし、いい名前っていうと思いつかんなぁ

846 :デフォルトの名無しさん:02/07/14 21:19
GATES FREE

847 :ひげぽん:02/07/14 21:22
>>845
>OSASK -> おさすく/おーえすあすく
>NWSOS -> なうえすおーえす‥‥と呼んでいる
なるほど。
おさすくかあー

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

>>846
>GATES FREE
ストレートですね。
受けは良いかもしれませんが・・・
これって、門が開いている(だれでもいいよ)
っていう意味にも取れるのかな?
→英語得意な方

848 :デフォルトの名無しさん:02/07/14 21:22
OSの特徴がはっきりしないんじゃ
名前の付けようがないだろ。
プロジェクト名ならhigeposでもかまわん。

849 :デフォルトの名無しさん:02/07/14 21:24
超ひげぽん 

850 :ひげぽん:02/07/14 21:31
>>848
>OSの特徴がはっきりしないんじゃ
>名前の付けようがないだろ。
>プロジェクト名ならhigeposでもかまわん。
ちょっとこの案に傾いてきた。
でも、ひげ生えてないんだよね。全然・・・
名前変えようかな・・・

851 :デフォルトの名無しさん:02/07/14 21:31
よし、かっちょいい名前考えてやるから本名晒せ。

852 :ひげぽん:02/07/14 21:41
PJ名(仮称):higeposに決定!!!

しました。
今後ともよろしくお願いいたします。

853 :837:02/07/14 21:42
ホントに採用されるとは思わなかった (w

854 :ひげぽん:02/07/14 21:47
>>853
おめでとうございます???
名付け親ですね。

855 :デフォルトの名無しさん:02/07/14 21:59
ひげぽんプロテクトモード到達
      &
higeposプロジェクト開始

まとめてage

856 :FreeDOS教徒: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から呼べればよいんだよね。
がんばろう。

859 :デフォルトの名無しさん:02/07/14 23:30
ひげぽんがCからアセンブラの関数を呼ぼうとせずに
インラインアセンブラにこだわる理由って何?

860 :ひげぽん:02/07/14 23:38
>>859
別にこだわってないですよ。
>>859さん
インラインアセンブラ方法と
Cからアセンブラを呼ぶ方法
どちらが方法として一般的ですか?
どちらが容易ですか。
やはりどちらとも経験しておいたほうが良いでしょうか。

861 :デフォルトの名無しさん:02/07/14 23:49
>>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
セレクタ地→セレクタ値

864 :デフォルトの名無しさん:02/07/15 00:12
>>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

865 :デフォルトの名無しさん:02/07/15 00:14
>>862
「はじめての486」はMASMを前堤に書いているから
そうなのかもしれん。しかし、NASMなら>>861でできるぞ。

866 :ひげぽん:02/07/15 00:23
>>864
大変貴重なご意見ありがとう。
確かにインラインアセンブラは、アセンブラとCが共存している時点
で見やすくはありませんね。

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

>>864さんが
せっかく方法を提示してくれたので
明日挑戦してみます。

867 :デフォルトの名無しさん:02/07/15 00:24
>>866
プログラムやるならコード書くときくらいはミスタイプに慎重になれよ。

868 :ひげぽん:02/07/15 00:27
cliですね。

869 :FreeDOS教徒:02/07/15 00:33
>>861
プロテクトモードに移行したら速やかにパイプラインの初期化をしなきゃ
ヘタな16bitコードが間に入ると落ちたりする‥‥けど、この場合は
ぜんぜん問題なさそうですね。なんかいらん心配してました(汗

870 :ひげぽん:02/07/15 00:35
>>865
なるほどnasmだと出来るのですね。


871 :デフォルトの名無しさん:02/07/15 00:42
なんかよくわからんけど
ひげぽん第一目標クリアしたのかな。
とりあえずおめでとさん〜。

#こんぱいる済みのもアップしてみてほすぃ。

872 :ひげぽん:02/07/15 00:48
>>871
higeboot.binもアップするようにしました。
Bochsでフロッピーイメージとして設定すると
ブートできますよ。
実際のディスクにddコマンドで書いてもよいけど。


873 :デフォルトの名無しさん:02/07/15 00:54
>>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] なんかが結構
面倒と思う。特にローカル変数とか持つとね。そう言うところは、コンパイラに
やらせるべきだと思うけど...。

874 :デフォルトの名無しさん:02/07/15 01:25
>>873
ああ、言われてみればそんな気がして来た。
俺は、よくありがちなCのコードのなかにasm()がポンポン出てくるような
インラインアセンブラの使い方が嫌なだけだった。
インラインアセンブラ をごっそり関数で括ってあとは
そっちだけ利用すれば一緒だな。

gasの文法を使わなきゃ行けなかったり、
: "d"(ioaddr)なんてCらしくなくて気持ち悪いってのはあるけど
でも、それって確かに主観の問題だ。

875 :ひげぽん:02/07/15 01:29
>>873,>>874
うーん迷いますね。
gasの文法で書かなければいけないのが
インラインアセンブラの微妙なところかもしれないです。
→正直

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

迷うので明日の朝起きてから考えよう。

876 :デフォルトの名無しさん:02/07/15 01:38
ひげぽんは、結構質問屋だけど

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

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

応援しているのでがんばってね。
もうすぐ多分、俺もついていけなくなる(技術的に)


877 :過去ログ読む気はない!:02/07/15 02:02
ここってマジに作ってんの?

878 :デフォルトの名無しさん:02/07/15 03:10
他の板でこのスレの宣伝してる奴がいる…
宣伝厨うぜぇ。

879 :デフォルトの名無しさん:02/07/15 06:31
このスレ見てると、「おちこぼれ」の気分になれます。

880 : :02/07/15 19:57
関数をインライン展開したくなったときにフルアセンブラの関数だと厄介だよね。

881 :デフォルトの名無しさん:02/07/15 21:18
>>879
この掲示板にいる人がおちこぼれってこと?

882 :デフォルトの名無しさん:02/07/15 22:53
サンプル

883 :デフォルトの名無しさん:02/07/15 23:15
cの配列ってbssセクションにメモリが確保されるの?
putchar関数をつくってみたけどちゃんと動かない。

884 :デフォルトの名無しさん:02/07/15 23:23
bssは静的配列だけだろ

885 :デフォルトの名無しさん:02/07/15 23:39
>>883
初期化してるなら data、 してないなら bss、 ローカル変数ならスタックじゃない?
でも、一度アセンブリ出力したのを見た方が確実かも。

886 :デフォルトの名無しさん:02/07/16 01:02
>>885さんの通りでした。どこに配置されているかはわかったものの
なにが悪いのかよくわかっていないので、これから解決してみます

887 :デフォルトの名無しさん:02/07/16 15:45
.ldsが書けない。欝だ死ぬ

888 :デフォルトの名無しさん:02/07/16 18:54
NOWSMART OS クロス開発環境 DL 可能記念あげ。


889 :886:02/07/16 19:00
だめだどうすればいいのかわかんない...

890 :デフォルトの名無しさん:02/07/16 19:03
nowsmartって独自の開発環境があるの?

891 :デフォルトの名無しさん:02/07/16 19:06
>>890
あるよ。
独自開発の「処理系」が。
言語自体は独自じゃなく、MASM 準拠、ANSI C 準拠みたいだけど。
まあ、独自言語よりも凄いかも知れんけど。

280 KB
■ このスレッドは過去ログ倉庫に格納されています

>>17 >>194 >>196 >>334 >>338 >>504 >>723 ★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)