1 :
(・∀・)yossy ◆FlasH.X1/s :
03/01/12 21:44
ズサ━━━━⊂(゚Д゚⊂⌒`つ≡≡≡━━━━!!
新スレおめ
3GET、ごめんなさい・・・(確○犯
あ・・・
嗚呼・・・
嗚呼…
乙
(^^)
読んでみた。 前半は難解だったけど最後まで読んだら ネットについての理解が格段に深まった。 ありがとう。 他の人も、煽ってばかりじゃなくて 一度読んでみるといいと思う。
11 :
デフォルトの名無しさん :03/01/14 17:00
age
12 :
デフォルトの名無しさん :03/01/14 20:33
13 :
デフォルトの名無しさん :03/01/14 20:48
俺も暇だからブートの部分だけ勉強してみよ
前スレ落ちた?
>>14 落ちたみたい
もっとガンガン埋めとくべきだった、、、
(^^)
17 :
デフォルトの名無しさん :03/01/15 19:19
18 :
デフォルトの名無しさん :03/01/15 21:11
>>17 bochsの記事で、bochsのデバッグ機能が『mona』のブート部分の開発に役立った
というものでした。
>>18 なんかそれだけみると。bochsの何のために有るか分からん機能が
monaに役に立った。って書いてあるように見えるなぁ。
>>18 ひげぽん「また落っこちました〜」
まわり「だからbochsのログだせやぁ」
の流れを思い出しました。w
>>21 >の流れを思い出しました。w
あの時も、今もたくさんの人のお世話になっているということですね(笑)
ところで今日は、TSSを使わないタスクスイッチの簡易実験に成功しました。
eflags, csがいまいち更新されてなくて怪しいなど
不確定な要素満載ですが、一歩前に進みました。
アドバイスを下さったたくさんの方々、本当にありがとうございました。m(__)m
マーはニーしる! を思い出しました。
>22 「タスク切り替え」なんてものは、定義が適当だし、今の段階では 実際的な「タスク切り替え」とは程遠いので、あんまり大したこと ではない。
>>24 >「タスク切り替え」なんてものは、定義が適当だし、今の段階では
>実際的な「タスク切り替え」とは程遠いので、あんまり大したこと
>ではない。
全くおっしゃるとおりです。
ただ今回の実験を通していろいろ勉強できたので
自分的には収穫は大きいです。
何か最近Monaの進歩状況がよくわかんないな〜
知りたきゃCVSから取ってこいってのは敷居高くない?
わざわざトップページ更新するほどじゃないのかもしれんが、
SF.jpに日記機能あるんだし、開発日誌みたいなの公開しないの?
https://sourceforge.jp/developer/diary.php?diary_user=2006 CVSを取ってこないと分からない例
1. STLがどうなったのか
2. VPC対応がどうなったのか
3. タスク切り替えがどうなったのか
あと64bitの話が出てたがどう考えてるの?
新規開発者が加入されたようだけどHP更新されてなくて可哀想...
ま、辛口だったかもしれんが、応援してるんで頑張ってちょ
長くなってしまったので分けて。 >1. STLがどうなったのか STLPortが使えるようになりました。 カーネルの実装にはまだ用いていませんが、いずれ使う事になると思います。 特にコレクションなど。 >2. VPC対応がどうなったのか 昨日にやっと、VPCでのブートとタスクスイッチが動作しました。 ただイメージとして公開している物は古いバージョンなので VPCでは動きません。 イメージとして最新版を公開していないのは 現在タスクスイッチ(TSSを使用しないバージョン)の動作がまだあやしいためです。 安定後公開したいと思います。 もしどうしても最新版のイメージがほしい場合は、Make環境を整えていただくか ひげぽんに言っていただければ、何とかいたします。 >3. タスク切り替えがどうなったのか ここ最近、ずっと実験中かつ、実験が失敗していたので特に進捗はありませんでした。 昨日やっと、少しめどがたったのでいろいろな実機で実験しようと思っています。
>あと64bitの話が出てたがどう考えてるの? IA32アーキテクチャの理解もままならないのでしばらくは 64bit化を見据えた開発はしないと思います。 ただ、どなたか詳しい方がいらっしゃって アドバイスいただけるのであれば、積極的に今からある程度 準備するのはありだと思っています。 >新規開発者が加入されたようだけどHP更新されてなくて可哀想... すいません、なるべく早く追加いたします。 yuryuさんこれを見ていたら、開発者メーリングリスト宛に メールください。 >ま、辛口だったかもしれんが、応援してるんで頑張ってちょ 貴重なご意見ありがとうございました。 他にも同じような事を思われていた方もいらっしゃると思うので できるだけ改善していきたいと思っています。
> ここ最近、ずっと実験中かつ、実験が失敗していたので特に進捗はありませんでした。 > 昨日やっと、少しめどがたったのでいろいろな実機で実験しようと思っています。 こういうようなことを、自分の言葉で書ける日記は特別な意味があると思う。 →「あれやった、でも駄目だった、と思ったら勘違いだった」みたいな 他人にとっても泥臭さを通じてmonaを身近に感じる人もいるだろうし、 後で自分のやってきたことを見返すときにもきっと役立つ。
>1. STLがどうなったのか
こういう書き方だと、
2chブラウザとかで
>>1 と混同される
これに限らないがこの手の混同を避けるため
引用符と引用文の間はスペースを空ける慣習があるんだよ
何でひげぽんさんはこっちではトリップ付けないの? MonaBBSではこんなにはじけちゃってるのに(藁 > (´∇`)ヒゲポソ ◆Ngzcp/NZpA トリップは自衛の手段なんだから。 偽者がめちゃくちゃ書く可能性を自分で作ることになるよ。 こっちでもはじけちゃいなよ(藁
>>32 なんかあってからそのトリップつけりゃいんじゃない?
おまい、しんでからシートベルトつけても遅いんだぞ
つーか、書いてる内容でだいたいわかるだろ。 荒らすような偽者には、このスレは敷居高いと思う。
>>34 ぬ、MonaBBSで
>>32 のトリップ使ってるのかと思ったんだが、
どうやらさっき確認した限りではそういう例が見つからなかった。
勘違いですた。
というか、トリップなんて後で適当に決めちゃってもオフイシャルページで宣言しちゃえば問題ないじゃん。
>>35 まぁね。分かるよね。騙すにはそれなりに技術レベルも必要だし。
> 荒らすような偽者には、このスレは敷居高いと思う。 ひげぽんさんが登場するのはこのスレだけではないと思われ それこそOSASKとかNWSOSとかの絡みでしょっちゅう引き合いに出されてるし
ていうか前はトリップ付けてたけど…
ほんとだpart3みたらついてる、、、
にしても、NWSOSの進行が速いな。さっき最新版ダウソしたら いつのまにか、いろんなGUIアプリが動いてた。ってかメモ帳程度の ものが当たり前に動いてるし、 なんなんだ、いったい
MONAもNWSOSも自作組み立て機で動いた。わーい #会社のPCなんで、linux入れてProxyキャッシュサーバとして稼動させる のが本来の予定だったんだけど、NWSOS動かしたら周りの人が、なにそれなにそれ みたいな感じで群がってきた。MONAは、今のところBIOSっぽい画面なんで BIOSと思われてるらしく、あまり注目されてなかった。 ってことで、MONA頑張れ。
>>31 > 引用符と引用文の間はスペースを空ける慣習があるんだよ
了解しました。
> 何でひげぽんさんはこっちではトリップ付けないの?
> MonaBBSではこんなにはじけちゃってるのに(藁
>>32-40 面倒だったので付けていませんでした。>トリップ
なのでつけてみました(笑)
トリップを付けるかどうかは、結構気分かもです。ごめんなさい。
>>42 > みたいな感じで群がってきた。MONAは、今のところBIOSっぽい画面なんで
> BIOSと思われてるらしく、あまり注目されてなかった。
> ってことで、MONA頑張れ。
NWSOSと比べられたら、大負けですね。
というか、どのOSと比べても負けてる。
もっといえばBIOSのほうがすごい・・・
でもがんばります、ありがとうございます。
46 :
ひげぽん ◆Ngzcp/NZpA :03/01/17 17:39
トリップ失敗。。。 さてMonaの進行状況は技術的なことであれば、なるべくここに書いていこうと 決めました。 昨日はタスクスイッチ実験成功コードを見直していたところ どうも動いていたのは奇跡かもという結論に達しました。 iretではなくretで切り替わっていた模様。 なのでEFLAGS,CSチェンジが起こっていなかった。 またスタックに積まれていると予期していたものと 実際でいろいろ勘違いがありました。 ある時点でスタックに積まれている内容を そこで処理がとまっていいので表示したい場合は 汎用レジスタにpopして表示でいいんですよね?自信なし 自分でスタックを初期化して作ったプロセスのほうは popaように0を積んで、eflags,cs,eipとやってiret 切り替えられました。(process2)
47 :
ひげぽん ◆Ngzcp/NZpA :03/01/17 17:42
ただ起点となる(process1)の切り替えがうまくいかない timerHandler schedule switchProcess ここで切り替え インテルのマニュアルを読むと エラーでない割り込みであれば /* EFLAGS */ /* CS */ /* EIP */ と積まれているはずなのに、うまくいかないっす。 それぞれtimerHandler,scheduleのアドレスが pushされているかと二つpopしてやってみたがうまくいかず・・・
48 :
ひげぽん ◆Ngzcp/NZpA :03/01/17 17:44
スタックの内容が表示できるよう #define _syspop(count) { \ \ for (int i = 0; i < count; i++) { \ dword __eax; \ asm volatile("xor %%eax, %%eax\n" \ "pop %%eax \n" \ "mov %%eax, %0 \n" \ : "=m" (__eax) \ : /* no input */ \ ); \ _sys_printf("_sysPop(): %x\n", __eax); \ } \ } 作ってみたけどいまいちきちんと動いてなさそうな気がする。 うーんうまくいかず。 ところでCSて16bitだけど 割り込みでスタックに積まれる時は32bit? かなあ。
表示が乱れてしまいました。 すいません。 > ところでCSて16bitだけど > 割り込みでスタックに積まれる時は32bit? > かなあ。 32bitのようです。 サンクスmitkoさん。
非プログラマブル部分があるからね>CS32BIT
もうおそいけど、次スレ作る際に現行スレのコピーとっておいて、 どこかのWEBページで見れるように保存しておいてほしかったなぁ。 前スレがDAT落ちしまくって後から来たものにはなにがどうなってるのか 分からない罠。 前スレの保存公開は禁じられてるのなら仕方ないけど。
>freedos教徒さん ご苦労様です。 ありがたく拝見されていただきます。
↑拝見させて、だね
>>48 popしちゃうと戻れなくなるから、popせずにスタックを除き見るだけが吉だとおもわれ。
例えば、
handler:
pusha; 8個のレジスタ分つまり32bytesプッシュする
moveax, [esp+32]; eax <= エラーコード
moveax, [esp+36]; eax <= 割り込み時eip
movax, word [esp+40]; ax <= 割り込み時cs
moveax, [esp+44]; eax <= 割り込み時eflags
popa
iret
Cの関数にする場合は
void handler(unsigned long eip, unsigned short cs, unsigned long eflags)
{
interror_code = (&eip)[-1];
/* 割り込みの処理 */
asm("leave");
asm("addl $4, %esp"); /* エラーコードをpopする替わり */
asm("iretl");
}
とかするとよろし。
しまった。タブ入れ欄内の忘れてた。スマソ
漢字むちゃくちゃだ。モチツケ漏れ
まさに今スタックのぞきみを思案中です インラインとprintfでやってますがうまくいかないです
>>58 上の例を説明すると、
- 32bitモードの場合push対象が16bitでも32bit分のスペースをとる。
- esp は最後にpushした値を指す。
- C言語の関数は一般に以下のようにコンパイルされる:
func:
push ebp
mov ebp,esp
; 関数の内容
leave
ret
- C言語の関数の引数としては call 前にpushした値が逆順に与えられる。
例:
push dword 0x1234
call func
void func(unsigned long x)
{
/* x=0x1234 */
}
- C言語の関数は leave, iret ではなく leave, ret で終わるので注意。(前スレあたりでがいしゅつ)
- 例外の場合はエラーコードがプッシュされる場合があるので注意。
なんか要約したつもりが余計長くなってしまった。
>>48 やりたい事が良く分からないので的外れかもしれないけど
無理にインラインアセンブラにしないで
↓みたいな関数にしちゃだめなの?
; eax,ecx,edxが破壊されretで返るルールの場合
__syspop proc near
push esi
push edi
push ebx
mov edi, dword ptr[esp+16]
xor ebx, ebx
test edi, edi
jz _syspop_02
syspop_01:
push dword ptr[esp+ebx*4+20]
push offset _syspop_buf ;printfの第1引数
call _printf
add esp, 8
inc ebx
inc edi
jnz _syspop_01
syspop_02:
pop ebx
pop edi
pop esi
ret
__syspop endp
(昔の雰囲気が戻った)
#define _sysdumpStack() { dword stack0, stack1, stack2; asm volatile( "pusha \n" "mov 32(%%esp), %%eax \n" "mov %%eax, %0 \n" "mov 36(%%esp), %%eax \n" "mov %%eax, %1 \n" "mov 40(%%esp), %%eax \n" "mov %%eax, %2 \n" "popa \n" : "=m"(stack0) , "=m"(stack1) , "=m"(stack2) ); _sys_printf("_sysdumpStack(): %x %x %x\n" , stack0, stack1, stack2); }
皆さんのご教授をもとに作って見ました。 とりあえずこれを使って、昨晩はtimerHandler突入後のスタックを 調べてみましたが CS=0x08らしきものすらスタックに積まれている様子がなくて 戸惑っています。 考えられる可能性は ・_sysdumpStack()がバグっている ・_sysdumpStack()の前にすでにスタックが破壊されている ・ひげぽんの大きな勘違い ・その他。 とりあえずいきづまったので寝てから、もう一度冷静に考えてみます。
>>52 FreeDOS教徒さん
フォローありがとうございます。
yossyさんと検討してみます。>過去ログ
< `ー´>y-~~ スタック見るならこれだけでええやん dword* stack; mov stack,ebp printf("cs=%x,eip=%x,flag=%0x",*(stack+0),*(stack+1),*(stack+2)); // (stackframe) <- esp // [cs ] <- ebp // [eip ] // [eflags]
ちなみに、関数のプロローグは、標準的には、 push ebp mov ebp,esp sub esp,(AUTO変数のサイズ) で、しかも、csとeipの順序が反対なので、 // <- esp // [AUTO変数領域 // ... // AUTO変数領域] // [ebp ] <- ebp // [eip ] // [cs ] // [eflags] // [外側esp](もしあれば) // [外側ss](もしあれば) と夢の中でお告げがありましたのでご報告いたし上げます(南無)。
だって。
>>65 >>66 ありがとうございます。
#define _sysdumpStack2(str) { \
\
dword* stack; \
asm volatile("mov %%ebp, %0 \n" : "=m"(stack)); \
_sys_printf("_sysdumpStack2(%s):%x %x %x\n" \
, str, *(stack + 0), *(stack + 1) \
, *(stack + 2)); \
}
#define _sysdumpStack3(str) { \
\
dword* stack; \
asm volatile("mov %%esp, %0 \n" : "=m"(stack)); \
_sys_printf("_sysdumpStack2(%s):%x %x %x\n" \
, str, *(stack + 0), *(stack + 1) \
, *(stack + 2)); \
}
スタック覗き見作戦ということで やってみました。 timerHandler()の頭で呼んだ場合(それぞれ単独の呼び出し) _sysdumpStack2(timer):0x002FFF6C 0x00001ED0 0x00000008 _sysdumpStack3(timer):0x00001DAD 0x00001DCA 0x00001DAD ProcessManger::schdule() _sysdumpStack2(schedule):0x002FFF58 0x00001DEF 0x000098E0 _sysdumpStack3(schedule):0x000053DF 0x000053FC 0x000053DF timerHandler()ないでは0x00000008があるので もしかしたら惜しいかも。 でも今日はよくわからず、力尽きました。 最近ずっと動くものが作れていないので、CVS コミットしてません。 ちょっと不安。 Makeは出来るけど途中で動きが止まってしまうようなやつを コミットしても良いかと迷うのですがどうなのでしょうか。
ソースチェックアウトしてMakeしたけど スタックダンプしてとまるぞと、怒られそうで・・・ 定常的にチェックして、 ソースからMakeしている人っているのだろうか。。。
C++なんだから、マクロなんか使わないで、インライン関数にしては?>>ヒゲポソタソ
>>69 そのためのブランチでしょ。
新しい実験を開始するたびにブランチすればいい。
>>76 コンパイルオプションを変えただけで動かなくなるかもしれない方法を薦めないように
>>78 だから逆汗してみっていってるでしょ
インラインアセンブラで書いた部分が最適化の影響を受けるとは初耳
>>78 インライン関数がインライン展開される保証は無いのですが
VisualC++なら__forceinlineなんてものがありますが
>>71 今回みたいにちょこっと実験してみるにはマクロが便利でつ
コンパイルオプションとかコンパイラとか、なるべく関係ないように書くには
アセンブリ言語が一番だけどナー
で、実際に逆汗してみた香具師いるわけ?
-O付けなければ一切インライン展開されない。
-Oが付いていればレベルに関係なく100%インライン展開される。
よって
>>77 は正しいが、-Oさえあれば保証はある。
ま、普通のコードでさえ-O3以上だとまれにバグるので、
環境に一切左右されないのは
>>80 の言うようにオール汗だな。
今のmonaの開発方針とは正反対になるけど。
だから最終的には気持ちの差。
############# 終 了 #############
>>71 スタックを扱うので、ちょっとインライン関数は怖かったです。
>>72 ありがとうございます。
CVSコミットしちゃいました。
関係ありそうな箇所について-Sオプションでアセンブラコードを出してみました。
http://mona.sourceforge.jp/higepon/ timerHandler()
ProcessManager::schedule()
ProcessManager::swtichProcess2()
< `ー´>y-~~ やっぱりinline展開されてない様子。 >switchProcess2 initProcessでtimerHandlerへの戻り先他を積んでおかないとダメか。 そもそもコンテキストスイッチをesp切り替えでやるのはあまりお勧めできないが・・・。
>>83 CVSでCFLAGSを見る限り、-Oが付いてないですね。
これではインライン展開されないです。
>>82 インライン関数はなるべくヘッダに書いた方が良いですよ。
他のクラスから使うのであれば絶対に。
>>83 超先生さん
>initProcessでtimerHandlerへの戻り先他を積んでおかないとダメか。
なるほど
二つ手があると思っています。
(1)switchProcess2()は、インライン展開されていないので
schedule()からtimerHandler()に戻るために
initProcessでスタックにtimerHandlerへの戻り値を
格納しておく。
そしてtimerHandler()でiret
(2)iret(つまりタスクスイッチ)をswitchProcess2()で行ってしまう。
この場合はinitProcess()で初期化する場合には
timerHandler()への戻り値を格納しておく必要はなく
適当な値を積んで置く。
そしてタスクスイッチの前にスタックの値を
ひとつ捨てる。
(捨てられるのはtiemrHandelerのアドレスか初期化時に設定された適当な値)
うーんどちらがよいのでしょうか。
>そもそもコンテキストスイッチをesp切り替えでやるのはあまりお勧めできないが・・・。 現状は、この方法しかわからないというのが真実です。 ほかに、もっとよい方法があるのでしたら 簡単でよいので教えていただけないでしょうか。
>>84 さん
アドバイスありがとうございます。
> CVSでCFLAGSを見る限り、-Oが付いてないですね。
> これではインライン展開されないです。
了解しました。
この辺の-Oオプションに詳しいサイト等ありましたら
教えていただけないでしょうか。
できれば、必ずインライン展開される/されない等
の情報があればありがたいです。
> インライン関数はなるべくヘッダに書いた方が良いですよ。
> 他のクラスから使うのであれば絶対に。
はい一応認識しています。
一応私の方針としてクラスメンバ関数のうち
インライン化するのはprivateなものだけにしようと
思っています。
まあなんとなくですが・・・
>>81 > -Oが付いていればレベルに関係なく100%インライン展開される。
この情報のソースある ?
VC では、forceinline 指定にもかかわらず、インラインにならない時があるんだけど。
>>89 それってたまたまそうなってたってことじゃないのか ?
もしそうなら、「100%インライン展開される」とか書くなよ。
>>90 とりあえず、確認もせずにえらそうなことを言うのはやめてくれ。
インラインにならない経験があるんだったら、
それと同じケースがmonaの開発に使っている環境で再現することを示せば
背理法で何も議論する必要ないんだから。
>>91 要するに、100% インラインになることは、保証されてないわけね。
議論以前の問題だよ。
と、とにかく、、コンパイルOPTIONによって動くとか 動かないとかいうのはシステム的になんか嫌だな・・・。 OS作る前にもっとコンパイラとかオブジェクトコードの勉強しないと。。。
>>92 何一人で熱くなってんの?
とりあえず、Monaをダウンロードして、コンパイルしないと始まらないよ。
手を動かしましょうよ。そう思って逆汗逆汗って言ったのに。
Inline Limitを超えなければInlineになることは保証されてる。
それくらい自分で見つけると思ったんだけどなあ。
>>94 わかった、わかった。
貴方の環境では、100% インラインになるわけね。
これでいい ?
俺の環境で、100% 保証されない事がわかればどうでもいいです。
>>94 殺伐とした雰囲気には余りしたくないんだが、、、一つだけ言わせてもらう。
>>90 が言うように「たまたま」そうかもってのは考えた方がいいと思う。
注意事項とか、前提条件、仮定とかはなるべく少ない方がいいからな。
そういうのが多いと、人には理解してもらいづらいし、自分で書いたソースだって
一月もたてば結構忘れてしまうから、用心するには越したことがない。
>>95 はい、結構です。で、本題。
興味の方向から考えるに、貴殿は組み込み用のOSを手がけておられるとお見受けしますが、
タスクスイッチはどういう風に実装しておられましたか?
けんか(・A・)イクナイ!
>>96 と言うか、inline にする/しないなんて、コンパイラのバージョンで変わったりしそうでしょ ?
それに依存するのは、あまり良くないと思ってる。
>>97 > 興味の方向から考えるに、貴殿は組み込み用のOSを手がけておられるとお見受けしますが、
> タスクスイッチはどういう風に実装しておられましたか?
普通に TCB (Task Control Block) にレジスタセーブして、SP を再設定するだけ。
当時は、メモリ管理などはなかった。
また使ってた、68020 は、SP がユーザー/システム/割り込みで独立していたから、結構綺麗に書けた。
一人インライン信者がいるだけ
インラインスケート信者?
>>99 失礼しました。やはりそうでしたか。
gccは2.95の頃から-finline-limit-Nで決めていたので、
そんなに不安定なものだという感覚じゃなかったんです。
inline信者というより、gcc信者の厨房ですみません。
貴殿の書き込みを拝見していると、
コンパイラの面で色々と苦労されておられることが伝わってきて、
特にコールとスタックとかCしか使わない人は気にしないようなところに
非常に気を遣っておられたので、ひょっとしたらと思っていました。
喧嘩みたいになって皆様にはご迷惑をお掛けしましたので自分は逝きます。
>>98 すまん。
>>102 > gccは2.95の頃から-finline-limit-Nで決めていたので、
> そんなに不安定なものだという感覚じゃなかったんです。
>>96 も指摘してるし、
>>99 にも書いたけど。それをもって 100% なんてあまり書かない方が良いと思うよ。
GCC のマニュアルにも...
Note:
pseudo instruction represents, in this particular context, an abstract measurement of function's size.
In no way, it represents a count of assembly instructions and as such its exact meaning might change from one release to an another.
と書かれてるぐらいだから。
> 特にコールとスタックとかCしか使わない人は気にしないようなところに
ちょっと勘違いしてるかと...。
俺は、
>>88 =
>>90 =
>>92 =
>>95 =
>>99 だからスタックどうのこうのは書いてないよ。
ただ、このスレ見てる奴は、スタックがどうのこうのぐらいはだいたいわかってると思う。
(でないと、ちんぷんかんぷんだろうし...。)
えと、一応、CPUメーカに勤めてて、gccにも明るいと自負している自称gccハカセですが、 -O2オプション以上をつけてれば、gccはinline展開を必ず試みます。 が、例外があって、例えば inline 関数を展開した結果、己のinline関数を 呼び出すような場合、無限inline展開に陥るので、その場合、inline属性は 無視されます。これは、C++のinline展開にも言えることで、標準委員会でも 「inline展開は必ずしもinline展開されるとは限らない」と定義されてます。
仕事でだいぶ不規則な生活になって来ました。 早く持ちなおさないと 現状を整理してみようと思います。 (1)現在スタックポインタを切り替えることでTSSを使わないタスクスイッチを試みている (2)割り込みハンドラではeip,cs,eflags,error(あれば)がスタックに積まれる事は わかっている (3)iretでは(2)とは逆にeip,cs,eflagsがpopされて実行元に戻ることがわかっている (4)上記を踏まえてタスク初期化時にはeip,cs,eflags等をあらかじめ積んであるような スタックを用意すれば良いという事がわかっている。 (5)(1)〜(4)のようにタスクスイッチすることは可能である。(理論的には) 問題点 ・関数のinline展開等により割り込みハンドラによって積まれたはずの eip,cs,eflagsがみつからない。 ・スタックダンプマクロをつくりスッタク内を覗き見るがそれらしきものがない。 ・そもそもスタックダンプマクロそのものがスタックを破壊せずに、覗き見できているか ちょっと不安。 ・esp,ebpのつじつまあわせがだんだんとよくわからなくなってきた。 とくに完全には割り込みハンドラまで戻らずiretする場合とか。。。 ・スタックマクロもebp,espどちらを基準にすべきか・・・ 大混乱中です。
やっちゃった。スッタクゴメソ
bochsdbg.exe等のデバッガ付きのもので追跡してみては?
スッタク(・∀・)カコイイ!!
>>105 >・スタックマクロもebp,espどちらを基準にすべきか・・・
push pop しても値変わらんので、
ベースポインタって名前の通り ebp をベースにするのが便利でつ。
インテルアーキテクチャー上だったら普通は enter か push ebp + mov ebp, esp の組で
始まるから、ebp + 2 がコール直後の esp の値になるし。
32bit モードなので ebp + 4 の間違いですた。
>>110 > ベースポインタって名前の通り ebp をベースにするのが便利でつ。
フレームポインタの省略とかやられると辛いので、ここはきちんとアセンブラでスタックの値をとって、表示は C++ とかでやるのが良いと思う。
>>112 う、確かにそうだな。
gcc のinfoページ読んだら、-fomit-frame-pointer か -O2以上をつけると
フレームポインタ省略されてしまうってか言ってあった。フレームポインタ省略を
禁止する方法も無さそうだし。
楽しげだ。でも仕事忙しくて傍観してるしか能がないおれ。
>>114 ここでレスするだけでもちょっとは助けになるんじゃない?
参加の仕方も色々。
>>110 ,112
ありがとうございます。
やはりespからたどるのがよさそうですね。
必要なeip,cs,eflagsが積まれてから
二つの関数に突入するので、だいぶ深いところ
にいってしまうのが難点ですね。
> ・スタックダンプマクロをつくりスッタク内を覗き見るがそれらしきものがない。
> ・そもそもスタックダンプマクロそのものがスタックを破壊せずに、覗き見できているか
> ちょっと不安。
あたりが、まだ解決していないのが痛いです。
>>107 > bochsdbg.exe等のデバッガ付きのもので追跡してみては?
bochsのドキュメント読んでみます。
>>114 >楽しげだ。でも仕事忙しくて傍観してるしか能がないおれ
最近私もだんだんと仕事が忙しくなってきました。
お互いがんばりましょう。
Bochs&GDBデバッグはもしかしてWindowsでは できないのかな? cygwinでMakeすれば出来そうだけどバイナリはないのだろうか・・・ 明日ちょっと調べてみます。
>>117 バイナリパッケージ入れたら bochsdbg.exe ってやつが入ってるからそれ使えばいい。
>>118 それを起動させて
cygwin gdbで
gdb
target remote localhost:1234
とやってみましたが
connection refusedとなりました。
bochsのドキュメントを軽く読んだところ
./configure --enable-debugger --enable-disasm
./configure --enable-gdb-stub
内部デバッガ用、GDB用二つのバイナリがありそうな予感です。
120 :
名無し@沢村 :03/01/22 23:46
ヌヒ等よ、OSをつくために頑張っているヌヒ等よ。 ところで新しいOSができたというニュースはまだ聞かないが、ヌヒ等よ何をしている? ヌヒ等よ、早くやれ!!
>>119 bochsdbg.exe は ./configure --enable-debugger --enable-disasm の方だと思われ。
これを普通の bochs みたいに起動すると、bios の一番最初の命令で停止した状態で
プロンプトが出るから、ブレークポイント置くとかいろいろ準備した後で c で実行開始する。
122 :
名無し@沢村 :03/01/23 00:29
↑酷ぇなおい
>>124 122はあきらかに偽物だろ。
違うのか?
(^^)
こんなのを作ってみました。 ループはあえて使ってません。 #define _sysdumpStack4() \ \ static dword* stack; \ asm volatile("mov %%esp, %0 \n" : "=g"(stack)); \ _sys_printf("%x ", *(stack + 0)); \ _sys_printf("%x ", *(stack + 1)); \ _sys_printf("%x ", *(stack + 2)); \ _sys_printf("%x ", *(stack + 3)); \ _sys_printf("%x ", *(stack + 4)); \ _sys_printf("%x ", *(stack + 5)); \ _sys_printf("%x ", *(stack + 6)); \ _sys_printf("%x ", *(stack + 7)); \ _sys_printf("%x ", *(stack + 8)); \
これをタイマハンドラでこんな風に使ってみます。 void timerHandler() { asm volatile("pushl $0x87654321"); asm volatile("pushl $0x87654321"); asm volatile("pushl $0x87654321"); asm volatile("pushl $0x87654321"); _sysdumpStack4(); /* EOI is below for IRQ 8-15 */ outportb(0xA0, 0x20); outportb(0x20, 0x20); /* determine next process or thread and run it */ ProcessManager& pm = ProcessManager::instance(); pm.schedule(); iret(); return; }
その結果 0x00001DBF 0x00001DBF 0x87654321 0x87654321 0x0000000E 0x00000014 0x002FFF 6C 0x00001FAB 0x0000000 と表示されます。 0x87645321が二つ消えてしまいます。 該当部をディスアセンブルしたのは 00000FD0 55 push ebp 00000FD1 89E5 mov ebp,esp 00000FD3 83EC08 sub esp,byte +0x8 00000FD6 6821436587 push dword 0x87654321 00000FDB 6821436587 push dword 0x87654321 00000FE0 6821436587 push dword 0x87654321 00000FE5 6821436587 push dword 0x87654321 00000FEA 892530800000 mov [0x8030],esp 00000FF0 A130800000 mov eax,[0x8030] 00000FF5 C70424BF1D0000 mov dword [esp],0x1dbf 00000FFC 8B00 mov eax,[eax] 00000FFE 89442404 mov [esp+0x4],eax 00001002 E849F8FFFF call 0x850 00001007 A130800000 mov eax,[0x8030] 0000100C C70424BF1D0000 mov dword [esp],0x1dbf 00001013 8B4004 mov eax,[eax+0x4] 00001016 89442404 mov [esp+0x4],eax 0000101A E831F8FFFF call 0x850 0000101F A130800000 mov eax,[0x8030] 00001024 C70424BF1D0000 mov dword [esp],0x1dbf 0000102B 8B4008 mov eax,[eax+0x8] 0000102E 89442404 mov [esp+0x4],eax 00001032 E819F8FFFF call 0x850
表示ロジックでスタックが上書きされたりするのでしょうか。 大混乱です。 観測しようとすると状態が変わるのか もともと状態がおかしいのか 正常なのか。 ・・・・・・・
>>131 あ、もしかして他の関数をcallしてしまうとおかしくなるかも。。。
ってことでしょうか。
ということは その関数に入ってからスタックには積まれた者はebpからするとマイナス ということですよね。あれちょっと自信ないです。
mov dword [esp],0x1dbf mov [esp+0x4],eax でスタックの内容を書き換えているので正常です
>>134 ありがとうございます。
書き換えが起こっているのは、関数callのせいなのでしょうか。
ebp基準にして0x87654321を探ってみたところ
3つしか表示されませんでした。
スタックに全く影響を与えるのは無理なのでしょうか。
いやそんなことはないですよね。
>>130 > 観測しようとすると状態が変わるのか
量子力学の不確定性みたい...
>>132 > あ、もしかして他の関数をcallしてしまうとおかしくなるかも。。。
先日のinline論議真面目に読んでないんだね...
こんな感じか。 asm volatile("mov %%esp, %0 \n" : "=g"(stack)); \ 00000FEA 892530800000 mov [0x8030],esp 00000FF0 A130800000 mov eax,[0x8030] 00000FF5 C70424BF1D0000 mov dword [esp],0x1dbf ; 引数 "%x " 00000FFC 8B00 mov eax,[eax] ; 引数 *(stack + 0) 00000FFE 89442404 mov [esp+0x4],eax 00001002 E849F8FFFF call 0x850 ; _sys_printf
>
>>132 >> あ、もしかして他の関数をcallしてしまうとおかしくなるかも。。。
>先日のinline論議真面目に読んでないんだね...
もちろん読んでいますが理解が遅いのです。申し訳ありません。m(__)m
_sys_printf("%x ", *(stack + 0)); \ _sys_printf("%x ", *(stack + 1)); \ _sys_printf("%x ", *(stack + 2)); \ _sys_printf("%x ", *(stack + 3)); \ _sys_printf("%x ", *(stack + 4)); \ _sys_printf("%x ", *(stack + 5)); \ _sys_printf("%x ", *(stack + 6)); \ _sys_printf("%x ", *(stack + 7)); \ _sys_printf("%x ", *(stack + 8)); \ を、 unsigned int value[9]; value[0] = *(stack + 0); value[1] = *(stack + 1); ... printf("%d\n", value[0]); ... でやったらどうですか?
>>139 0x87654321 0x87654321 0x87654321 0x87654321 0x34353536 0x00000034 0x000000
と表示されました。
ありがとうございます。
すばらしいのですが
何故解決したかと、なぜ_sys_printfの引数がスタックを上書きしたかが
わかりません・・・
>>135 関数callというか
00000FD3 83EC08 sub esp,byte +0x8
でコンパイラはメモリアクセス用の一時変数を確保しているのですが
その後の
push dword 0x87654321
でスタックポインタが変更されたのに気付いていないのが原因です
↓泣けてきます。 (TдT)
>>103 > ただ、このスレ見てる奴は、スタックがどうのこうのぐらいはだいたいわかってると思う。
あ、スタック仕様はエクスパンドアップ、それともダウン?どっち?
>>141 とりあえずここは一旦Monaのカーネルから離れて、
簡単な関数を書いてアセンブリ出力と睨めっこすることをお勧めします。
コンパイラまでお作りになってるL様の偉大さを思い知る……か
>>142 なるほど。
ということは、インラインアセンブラなどを使わなければ
一番最初の_sysdumpStack4()は普通にスタック内を表示
できているのでしょうか。
そもそもの動機として
割り込みのハンドラへ行くときにスタックにpushされているはずの
eip,cs,eflagsが見当たらないので
・もともとスタックが壊れている
・表示ロジックがスタックを壊している
・表示ロジックが間違っている。
の切り分けをしたいというのがありました。
なかなか難しいです。
でも勉強になります。
こんな感じ。 [引数格納用] +--|<=Stackframe <- esp [auto変数郡] +--| <- ebp [旧ebp] [eip] [cs]
>>145 実は最近それはやってみました。
引数がどのように格納されるか戻り値がどこに格納されるか。
AUTO変数の確保のされ方等
基本は学んだつもりなのですが
応用が利きません・・・
146 またあらわれたLタン。 キャリアが違うと思うんだけど
Lタンが実際に登場した。 ではなくて、またLタンの話が引き合いに出された。 という意味だと思ふ。
>>113 -fno-omit-frame-pointerで、出来ない?
>>154 ガーン(゚д゚|||) 知らなかった。 no- つけると逆になるんだ、、、
info 見直したら書いてあるし、、、
>>113 gccでx86なら、-fomit-frame-pointerを明示的につけない限りフレームポインタは省略されません。
-Ox時に省略されるのは、省略してもデバッグ可能なアーキテクチャのみ。
それはともかく、俺なら割り込みハンドラでいきなりCコードに飛ばずに、asm glue codeを一回経由するけど。
すごく悩んでいろいろ考えた結果の実装が なんとなく動いたのはうれしいのですが 漏れがありそうで怖いですね。 ちょっと時間を置いて見直してみます。
159 :
ひげぽん ◆Ngzcp/NZpA :03/01/25 22:37
160 :
デフォルトの名無しさん :03/01/26 00:40
>割り込みハンドラでいきなりCコードに飛ばずに、asm glue codeを一回経由するけど。 激しく同意。 timerEntry: pusha movl %esp, %eax pushl %eax call timerHandler addl $4, %esp popa iret
161 :
デフォルトの名無しさん :03/01/26 00:41
typedef struct { dword edi; dword esi; dword ebp; dword esp2; dword ebx; dword edx; dword ecx; dword eax; dword eip; dword cs; dword eflag; dword esp; dword ss; } StackFrame; void timerHandler(StackFrame *frame) { printf("eip %d", frame->eip); } こんな感じ。 既存のOSのコードを軽く眺めてみるのも良いと思う。
>>・STLの導入。std::swapは実際にタスクスイッチで使用しています。 をー! OSカーネルにSTLを採用した例としては、世界初では? (MSの人に、WinNTカーネルをSTLで記述しなおすみたいな話は 聞きましたが・・・バッファオーバーラン対策だそうで、でも未確定情報なんで)
163 :
ひげぽん ◆Ngzcp/NZpA :03/01/26 19:47
>>160 >>161 なるほどありがとうございます。
上記のメリットはスタックをきちんと
自分でコントロールできることでしょうか。
>をー!
>OSカーネルにSTLを採用した例としては、世界初では?
もしそうならうれしいですね。
キーボードドライバにstd::queueを使ってみて遊んでいます。
プログラムの勉強しようと思うんだけど、 何から始めれば良いの? Visual BasicとかC言語とかあるけど、 最初はどれ? Visual Basic?
>165 アセンブラとC言語。 アセンブラのみでもいいのだけど、アセンブラだとJMPしまくりで、 スパゲッティに慣れるとよくないから、Cのような構造化言語と併用 していくといいよ。
>>167 誤爆にマジレス...
ていうか、アセンブラとCを併用するようなプログラムは入門には高度すぎだろ。
確かに両方やっておいた方が機械の仕組みがわかっていいのだが、、、
>キーボードドライバにstd::queueを使ってみて遊んでいます。 キーボードドライバは std::deque のほうが向いてるよ。 historyたぐるときなどは、queueよりも高機能実装できるのだ! なんて、ツッコミが後から来ても、元の型を queue -> deque へ 変化させるだけで実装できてしまうのがSTLの強み。 L氏が指摘するように、STLを使うとコードが太る傾向があるが、 これも将来的にコンパイラ技術が上昇すると共に解決される問題なので あまり危惧することでもないと思われ。
Mona上にSTLportを移植された件、ベースになっているバージョンは 4.5.3という事でよろしいでしょうか。( ´∀`)ネソノタメ
>>169 >キーボードドライバは std::deque のほうが向いてるよ。
>historyたぐるときなどは、queueよりも高機能実装できるのだ!
なるほど。
>なんて、ツッコミが後から来ても、元の型を queue -> deque へ
>変化させるだけで実装できてしまうのがSTLの強み。
ですねぇ。うれしいです。
>>170 こんばんはhenohenoさん。
>Mona上にSTLportを移植された件、ベースになっているバージョンは
>4.5.3という事でよろしいでしょうか。( ´∀`)ネソノタメ
はい、あってます。
ところでバージョンが何か問題でしょうか。
気になります。
キーボード入力を二つのタスクを走らせた状態で 片方のタスクで取得する実験をしてみました。 キー入力取得タスクの肝 while (true) { while ((ch = km.getCharacter()) == -1) {} _sys_printf("%c\n", ch); } これを実行するとchが不定の状態で なぜか_sys_printfのところが実行されることがある。 「実行されることがある」とは タスク実行中キー入力がない場合whileの条件は ほとんどtrueになるが50回に1回くらいnot trueになる getCharagter()の実装はまじめにキーを返すバージョンや return -1; オンリーだけでも上記の現象がおきる。 (1) while ((ch = km.getCharacter()) == -1) ⇒ while ((ch = km.getCharacter()) == 120) とやっても この現象は起きます。
(2) while ((ch = km.getCharacter()) == -1) ⇒ ch = -1; while (ch == -1) ではこの現象は起きません。 (3) while ((ch = km.getCharacter()) == -1) ⇒ while ((ch = testkey()) == 120) クラスメンバではなくて普通の関数でも この現象は起きます。 またシングルタスクモードではこの現象は起きません。 なんでだろうなあ。
>>172-173 MutexやWaitForSingleObjectみたいなの実装しないと
その手のことは安定して使えないと思われ
↑すまん、MONAのカーネルの仕組み良く知らんのだけど、 キーボード系などの資源は、タスク側に解放するのではなく、完全に隠蔽した ほうがいいかと。キーボードの入力状況は、カーネル内の一箇所のみに蓄える。 std::deque< char > core_keybd_history; と定義し、唯一のカーネルプロセスで if( any_keybd_input == true ) { core_keybd_history.push_front( km.getCharacter() ) } という感じで蓄える。 で、km.getCharacter() とやらは、アプリ側には非公開。 で適切なタイミングで、カーネルが保持しているプロセス・デスクリプタに historyを適切に集配する。 この適切なタイミングとは、そのプロセスに処理権利が移る瞬間かと。(本当にすまん、MONAについて何も知らないので他にもっと適切なタイミングがあるかも) 各プロセス・デスクリプタに以下のようなヒストリーバッファを用意。 std::deque< char > process_keybd_history; アプリ側は盲目的に process_keybd_history.end()で取り出し、不要になったら process_keybd_history.pop_back()で実現かと。 物理的なキーボード状態が格納されてる唯一のバッファをcore_keybd_historyに絞り あとは配布次第ってことで。
process_keybd_historyは カーネルからはpush_front()で書き込まれ アプリ側からはend() -> pop_back() 読み出されると。
>>172 キューに何も入ってないタイミングで、取り出そうとしたら駄目だろうね。
最初はスピンロックからでもやると良いかと。
私もOS書いてみたいのう…でも時間がない… 上の割り込みハンドラのコードの 00000FF0 A130800000 mov eax,[0x8030] でeaxを壊してるみたいだけど、これだと割り込みから帰ったときに動かないよ 全体を読んでないからわかんないけど
>>175 >>176 > historyを適切に集配する。
> この適切なタイミングとは、そのプロセスに処理権利が移る瞬間かと。(本当にすまん、MONAについて何も知らないので他にもっと適切なタイミングがあるかも)
> 各プロセス・デスクリプタに以下のようなヒストリーバッファを用意。
> std::deque< char > process_keybd_history;
なるほど勉強になります。
適切なタイミングでpushと。
std::deque< char > core_keybd_history;
↓
std::deque< char > process_keybd_history;
あとは各プロセスにキーボードバッファを持たせればよいのかな。
>>178 すいません、現段階でどの部分に当たることなのか
分かりませんが、_switchProcess()マクロに
eaxを壊すところがあったので直しました。
>>177 > キューに何も入ってないタイミングで、取り出そうとしたら駄目だろうね。
> 最初はスピンロックからでもやると良いかと。
一応keyQueue_.empty()チェックを入れてるので
取り出しはしないはずです。
char KeyBoardManager::getCharacter() {
if (keyQueue_.empty()) return -1;
KeyInfo info = keyQueue_.back();
keyQueue_.pop();
if (info.modifiers & KEY_MODIFIER_UP) return -1;
if (info.keycode < 'a' && info.keycode > 'z') return -1;
return (char)(info.keycode);
}
>>182 if (keyQueue_.empty()) return -1;
で、-1 返してるじゃん。
とりあえず、そこで、スピンロック。
詳しく呼んで見たけど void timerHandler() がいろんなレジスタ壊してるように見える… (ほかの人もいってると思うけど、割り込みハンドラの入り口ぐらいは アセンブリで書いたほうがいいのではないかなあ)
>>171 > ところでバージョンが何か問題でしょうか。
> 気になります。
いずれ実装する方や将来のバージョンに合わせる方や
検証する方が来歴を知りたくなるのではないかと思い
ましたので、さわりだけ聞いてみました( ´∀`)
<後ろ頭>y-~~~ timerHandlerだけpusha/popaで括ってないのは何故・・・?
>>187 ><後ろ頭>y-~~~
>timerHandlerだけpusha/popaで括ってないのは何故・・・?
すいません単純に_switchProcess()の最後でiretしているからです。
やはりまずいでしょうか。
>>188 その時点のソースが見れたら便利なので、
(CVSで合わせて取って来させるのは敷居高すぎ)
一緒に置いておくとよいと思います。
ほとんど利用されないと思うのですが、
GPLという建前もありますし、
ソースのサイズでコード量の増減が一目で分かりますし。
191 :
ひげぽん ◆Ngzcp/NZpA :03/01/31 00:39
>>190 >その時点のソースが見れたら便利なので、
>(CVSで合わせて取って来させるのは敷居高すぎ)
>一緒に置いておくとよいと思います。
ご指摘ありがとうございます。
ソースつきのファイルもリリースしておきました。
次回からはソースつきのみのリリースとなるかと思います。
みなさんいっぱいダウンロードしてください(笑)
192 :
デフォルトの名無しさん :03/01/31 00:47
お前ら動作報告しる
失礼しました。私は58氏とは関係ない人物です。
別のスレに書いたCookieに引きずられていました。
>>191 ソースとバイナリを分けて提供するのが普通ですが、
なぜ「ソース込みのバイナリ」なのでしょうか?
私が誤解を招くような書き方をしたのが原因かもしれませんが。
あともう一点、ビルドにLinuxやCygwinが必要なのに、 ソースをLZHで提供する意味がよく分かりません。 Mozillaのソース配布物を見ていただくと一目瞭然ですが、 ソースが巨大になってくるとtar.bz2が群を抜いて圧縮率が高くなるので、 UNIX(的)システムを前提にするならtar.bz2をお勧めします。 バイナリなら別にLZHでも構わないとは思いますが、 MeやXPではデフォルトでZIPが扱えることも考慮されると良いかと。
195 :
デフォルトの名無しさん :03/01/31 02:09
>>192 Pentium100MHz + ASUS P/I-55TP4 + その他 の自作PCで動きますた。
って動作報告はどこにするのが正しいでつか?
ぬるぽの実装はどうなっていますか?
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>196 (_フ彡 /
>>196 単純に落ちます。
カーネル内例外で落ちないOSないっしょ。
……ってネタにマジレスしてみた。
>あともう一点、ビルドにLinuxやCygwinが必要なのに、 >ソースをLZHで提供する意味がよく分かりません。 LZHではいけない理由もわかりません。 >Mozillaのソース配布物を見ていただくと一目瞭然ですが、 >ソースが巨大になってくるとtar.bz2が群を抜いて圧縮率が高くなるので、 これは同意。 >UNIX(的)システムを前提にするならtar.bz2をお勧めします。 UNIX(的)システムを前提にしているのですか? UNIX(的)システムを前提にするならtar.bz2でないといけないのですか? >バイナリなら別にLZHでも構わないとは思いますが、 >MeやXPではデフォルトでZIPが扱えることも考慮されると良いかと。 LhasaもDLできない人がMonaをDLするとは思えませんが。
動作報告を掲示板でやると、 書く側にとってはコピペとか面倒くさいですし、 受け側にとっても集計能率が悪いです。 Webフォームみたいな形にできないですかね? もちろん集計はリアルタイムにCGIで行われて皆で見れるような。 CGIなんか作ってる暇ない?(w メンバ公募なんだからさ。
国産ってだけで有難がるとことかLHa厨ってRuby厨に似てるな OSASK厨もよく似てるけど、不思議とNWSOS厨っていないな Mona厨が発生しないことを祈る
>>199 UNIX風なシステムだったら殆ど必ず標準インストールされている .tgz が一番便利だとおもわれ。
「xxxじゃないといけない」じゃなくて、「xxxだと便利」って発想のがいいんでは?
>>201 さん
いまは人数が少ないからいいけど、じきに出てくるって。
虫がいないソフトには夢がないでしょ。
>>203 さん
> JavaとC#しか扱えない
それもそれで(゚д゚)ウラヤマスィ...
>>203 資料ご提示ありがとうございます。
この資料は知っていたのですが、久々に読み返すと
以前とは違う意味で、勉強になりました。
>>JavaとC#しか扱えないくせに、OSを作ろうと勉強中に見つけました
あーそろそろ。C#本格的に勉強しなければ。。。
マイクロソフトの虫遊び依頼さわってないっすC#
>>206 以来でした。
今ふと思いついたのですが
timerHandler()に入った瞬間にスタックからcs,eip,eflagsを取り出しておいて
タスク構造体に入れておいて
あとからゆっくりと任意の場所でスタックに戻してあげてiretすれば
便利かなあと思ったんですが、何か落とし穴があるのでしょうか。
_,.'⌒)
, ´f二コヽ
! l !ノ リ i l / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ノiハl.゚ ー゚ノリ <.
>>207 それが一般的な実装です。
⊂)允つ \ 同時に汎用レジスタもTCBへ保存するべきですね。
く/_|〉 \____________________
し'ノ
>>208 んで、新しくタスクを作るときはスタックに積んどいて iret でスタートさせると。
>>208 209
アドバイスありがとうございます。
やっと一般的な実装にたどり着いたということですか。
喜んでいいのかな・・・おそいけど。
>>210 ついでに、スレッドの開始アドレスを関数の先頭にしておいて、iretの戻りアドレスとして積んだその関数アドレスの
下にスレッド終了関数のアドレスと、終了関数への引数を積んでおくと、スレッドの関数からリターンしたときに
スレッドが終了するように出来る。
>>henohenoさん
おー。イメージ的にはそんなかんじですね。
ただPHPを勉強する暇はないので厳しいかもです。
>>212 さん
なるほど。
話が変わりますが
eipは直接自分でとることは出来ないんですよね。
割り込みとかがトリガでないと取れないのでしょうか。
>>205 .tgzはちょっと……(ファイル形式じゃなくて拡張子)
何で.tar.gzって冗長なことになっているのかご存知?
>>213 GetEIP:
mov dword [esp], eax
ret
よく考えたら eip 取りたいポイントにラベル置いとけばいいだけだったウトゥ
必死で対処しておられるのは伝わっては来ますが、 今のファイル名の付け方は独自過ぎます。 多分DOS経験が長くてUNIX文化をあまりご存知ないのかと。 うるさいやつと思われるかもしれませんが、 ちょっと知ってる人が見たらすぐ分かるという意味で、 標準的な名前の付け方に従った方が良いです。 まずtgzとzipと両方で4つは冗長すぎます。 いちいちこんなことしていたら収拾付かなくなります。 mona_beta0_02b_img.tgzというファイル名も悪いですが厨房くさいです。 ピリオドを1個にして拡張子tgzにするというのは DOSの慣習に従ったと思われますが、 そもそも8.3形式じゃないので意味ないです。 区切りもピリオドもアンダーバーになっているので見難いです。 imgとかsrcとかの略語は8.3形式制限の産物なので無意味です。 区切りはハイフン、ピリオドは臆せず何個も付けた方が良いです。 あとβというのはリリース(完成)直前のものを指すのであって、 今の段階ではαでさえないので変です。 普通、αとかβとかは1.00αとか完成が視野に入ってから付けます。 それ以前に0.02というナンバリングが初期段階を表しているので αとかβとか謙遜する必要もないです。 あと最近はバージョンニングは3つに区切るのが主流です。 UNIX系ではソース提供が普通なので、 ソースにはいちいちsrcなどと付けず、バイナリを補足します。 ですから次のような2つのファイルを提供することをお勧めします。 mona-0.0.2-image.zip mona-0.0.2.tar.gz
>>214 >何で.tar.gzって冗長なことになっているのかご存知?
私も、最近までUNIXのことをほとんど何も知らなかったので、
「誰がこんな意味不明の"拡張子"の付け方を広めたんだろう。全く、、、。」
と思っていたのですが、今ではなんと賢い付け方を考えたのだろう、という
風に考え方が変わりました。(^_^;)
ようするに、aaaa と言うファイルを bbbb という形式に変換した時、に、
aaaa.bbbb
というファイルができるという規則を何度も連続して適用しているんですね。
これを繰り返して、aaaa.bbbb というファイルを、さらに cccc という形式
に変換すると、
aaaa.bbbb.cccc
に変わると。
だから、aaaa というファイルを、tar でまとめた後、gz 形式に変換すると、
aaaa.tar.gz
に変わる。
逆変換(展開など)をすると、後ろの方から拡張子が消えていくと。
だから、tgz という拡張子にするより、実はtar.gzの方が凄く合理的だと
いう、、、。
>>214 どのような意味でしょうか?
>>205 gzipの圧縮オプションは最大にして下さい。
以下は以前書いたもの。
-----------------------------
$ cat targz.sh
#!/bin/sh
#
echo "tar cf - \"$1\" | gzip -9 > \"$1.tar.gz\""
tar cf - "$1" | gzip -9 > "$1.tar.gz"
-----------------------------
$ cat release.sh
#!/bin/sh
# Release
if [ -z "$1" ]
then rel=0_9_4
else rel="$1"
fi
mod=cvsknit
CVSROOT=':pserver:
[email protected] :/cvsroot/cvsknit'
cvs -z3 -d "$CVSROOT" export -r "CK_REL_${rel}" "$mod"
tar cf - "$mod" | gzip -9 > "${mod}_${rel}.tar.gz"
>>219 これMakefileで何とかなりませんかね。distターゲットとか作って
make distとかでできると楽だと思うのですが、、、
# 俺には期待しないでね &heart;
>>219 > どのような意味でしょうか?
218でLightCone氏が詳しく説明しておられます。
<後ろ頭>y-~~ ピリオドはファイル名の単なる区切り。 そもそもfile system上の"拡張子"という概念はFAT固有のものだしね。
ま、解凍してでてきた物がすばらしけりゃ どーでもいいんだけどね。
>>220 autotoolなら自動でルール作ってくれるけど
×ルール ○ターゲット
最近のディストロならunzipくらい標準ではいってるだろうから tar+gzipじゃなくてzip一本でいいと思われ
>>224 ひげぽんがcygwin使っているので、configureは時間がかかる気がする。
メリットもあまり無いと思うし、、、
# 楽なんだけどね (^^;
配布厨、圧縮厨uzeeeeeeeeeeeeeeeeeeeeeeeeeeep
>>217 219
アドバイスありがとうございます。
MakeFiel
dist :
cd ../bin; zip -9 ../../mona-$(VERSION)-image.zip mona.img
cd ../../; tar cf - mona_v1.0 | gzip -9 > "mona-$(VERSION).tar.gz"
こんな感じでよいでしょうか。
Fiel⇒File 皆様いろいろアドバイスありがとうございます。m(__)m こういうご指摘は大変ありがたいです。 配布形式等で違和感・不親切感が感じられるのは マイナスなので改善していきます。
tarの前にmake cleanしたほうがよさそうですね。 今週末は >207 あたりの実装をしようかと思っています。
>>230 MakeFileではなくてMakefileが普通(大文字・小文字の使い方のこと)
ひげぽんは、本当にいいやつだ。 俺ならもうキレてるw
キレそうになりましたら、近所の人を数発殴ってから作業を再開していますので、 問題ないです。はい。
236 :
デフォルトの名無しさん :03/02/01 17:53
>>ひげぽんさん
お疲れ様でした。
さっそくダウンロードさせていただきました。
今後とも応援していますので頑張ってください。
>>235 こういう時のためのトリップですね。
度々要望ですみませんが…… トップページに > Monaダウンロード : Mona Develop Beta 0.02b がダウンロードできるようになりました。 とアナウンスがありますが、 そこからダウンロードページへリンクした方が親切だと思います。
238 :
デフォルトの名無しさん :03/02/01 19:06
御意
ハンドラ内でのレジスタセーブマクロを作りました。 #define _saveRegisters(process) { \ \ asm volatile("movl %%ebx, %0 \n" \ "movl 4(%%ebp) , %%ebx \n" \ "movl %%ebx , %1 \n" \ "movl 8(%%ebp) , %%ebx \n" \ "movl %%ebx , %2 \n" \ "movl 12(%%ebp), %%ebx \n" \ "movl %%ebx , %3 \n" \ "movl %%eax , %4 \n" \ "movl %%ecx , %5 \n" \ "movl %%edx , %6 \n" \ "movl %%esi , %7 \n" \ "movl %%edi , %8 \n" \ : "=m"(process->ebx) \ , "=m"(process->eip) \ , "=m"(process->cs) \ , "=m"(process->eflags) \ , "=m"(process->eax) \ , "=m"(process->ecx) \ , "=m"(process->edx) \ , "=m"(process->esi) \ , "=m"(process->edi) \ ); \ } \
>>236 >お疲れ様でした。
>さっそくダウンロードさせていただきました。
>今後とも応援していますので頑張ってください。
ありがとうございます。
>>237 >そこからダウンロードページへリンクした方が親切だと思います。
近いうちに改善できるよう要望を出しておきます。
ご指摘ありがとうございます。
>>240 process がグローバル変数かスタティック変数へのポインタでなければ、
gcc が process の値を計算するときにレジスタを使って内容を壊してしまわないか心配。
というか、多分使う。
>>242 さん
気づきませんでした。ありがとうございます。
ProcessManagerクラスのpublic static変数としました。
>>243 一応 gcc -S でアセンブラソース吐き出させて、レジスタ壊してないか確認した方が吉
_,.'⌒)
, ´f二コヽ
! l !ノ リ i l / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ノiハl.゚ ー゚ノリ <.
>>243 pushaでスタックへ吐き出してから
⊂)允つ \ *(ebp+n)で取得するのが安全・確実です。
く/_|〉 \____________________
し'ノ
#define _switchProcess(currentProcess, nextProcess) /* no switch */ if (currentProcess == nextProcess) iret(); /* switch to next */ asm volatile( "movl %2, %%ebx \n" "movl %3, %%ecx \n" "movl %4, %%edx \n" "movl %5, %%edi \n" "movl %6, %%esi \n" "movl %7, %%esp \n" "movl %8, %%ebp \n" "pushl %9 \n" "pushl %10 \n" "pushl %11 \n" "movl %1, %%eax \n" "iretl \n" : "=m"(currentProcess->esp) : "m"(nextProcess->eax) , "m"(nextProcess->ebx) , "m"(nextProcess->ecx) , "m"(nextProcess->edx) , "m"(nextProcess->edi) , "m"(nextProcess->esi) , "m"(nextProcess->esp) , "m"(nextProcess->ebp) , "m"(nextProcess->eflags) , "m"(nextProcess->cs) , "m"(nextProcess->eip) );
プロセススイッチの際に プロセス構造体にレジスタをセーブするように変更しました。 何とか動いております。 ふぅっと。ひといき。
ソースを公開する際は、"cvs co" のかわりに "cvs export" コマンドで
ソースを取り出したものをお使い下さい。(具体例は
>>219 )
exportコマンドを使えば 'CVS' というスペシャルディレクトリとファイルを
含まない、ほぼ純粋なソースを取り出す事ができます。
下手に "cvs co" を使うとそのユーザーの作業環境が漏れたり、
CVSサーバーの所在が漏れたり、そのソースに他の人が作業した
際に扱い辛くなったり、そのソースを別のリポジトリに追加しようと
した人が泣く事に繋がります。
なお、最新のファイルをexportする時は "cvs export -D tomorrow "
でどうぞ。
250 :
デフォルトの名無しさん :03/02/03 21:41
コンテキストの操作にはインラインアセンブラを使わない方が賢明だと思われ。
>>250 >コンテキストの操作にはインラインアセンブラを使わない方が賢明だと思われ。
おっしゃることは良く分かります。
インラインにするといろいろ考慮しなければいけないことが
多いです・・・
こちらで。
>>256 そんなの普通見つけられないと思いますが……
エロサイトの入り口並み(w
>>257 >そんなの普通見つけられないと思いますが……
>エロサイトの入り口並み(w
そうですよねw
実はあそこのリンクは結構使ってます。
mona.sourceforge.jpのほうが覚えやすいので・・・
printf(const char *str, ...) { _sys_printf(str, ...) } というようなことをやりたい場合(実際にやるのは違うことですが) printfが受け取った、引数はどうやって_sys_printf()に渡せばいいんだろう。 C言語入門からやり直そうかな・・・
スタック走査すればいいんじゃ。。
そういう意味ではないと思うけど
>>259 標準ライブラリが使える場合は va_start, va_arg, va_end 等を使うけど、
mona では使わないので、結局
>>260 が言うようにスタックを操作するマクロを自分で書くしかないでつね。
というか、それ _sys_printf() でやってるじゃん。
変換仕様も作らないといけないのか。 始めは%s, %dくらいかな。ひげぽんがんばれ。
Windows NT互換を目指すReactOS 0.1.0リリース
http://slashdot.jp/developers/03/02/03/221257.shtml?topic=1 オープンソースでWindows NT 互換OSを作るReactOSプロジェクトが、
ReactOS 0.1.0をリリースした。
アプリケーションおよびドライバーにむけてNTバイナリ互換性 を確保しようというもの。
現在、CD-ROMブートが可能で、GUIア プリケーションも初歩的ながら動いている。
GUI周りはWINEの助けを借りているそう なので、案外早くに大化けするかもしれない。"
ダウンロードのページからは実験用にBochs 2.0で起動できるイメージとBochsが
セットになったパッケージをゲットできる。
ひげぽんもガンバレ!
gcc,g++なら<stdarg.h>はマクロとビルトイン関数だけだから、 インクルードするだけで、ランタイムライブラリ無しでも使えた と思うよ。
sprintfに対するvsprintfのようなものを用意して、 前者は後者を呼び出すだけにして、 実装は後者で行うようにすると簡単。
267 :
デフォルトの名無しさん :03/02/05 16:57
成果をマージしてるってだけだろ、 LindowsはOSとしてはDebianベースのLinuxで、WINEが動いてるだけ。
269 :
デフォルトの名無しさん :03/02/05 19:07
新しいOSを作ろうとすると、 やっぱり、PC−UNIX系のOSがベースになりますねぇ?
>>269 そうとは限んないですね。
PC-UNIXの空気が合わなくてOSを作る人も
当然いるはずですから。
むしろ、新規にOSをつくる理由はだいたい、
既存のOSにない機能性を求めるところからきてるのでは?
271 :
デフォルトの名無しさん :03/02/05 20:34
Windowsの成り立ち CP/M-86 ↓パクリ 86DOS ↓開発元シアトルコンピュータを買収して、MSが発売 MS-DOS ↓Macに対抗し、GUIベースAPIを追加 Windows
実行時のどのタイミングでもハードウェアのつけ外しができるようなOSキボン。 まぁ、最低一つのマザーボード、一つのCPU、一つのメモリは必要だろうけど。
273 :
デフォルトの名無しさん :03/02/05 21:58
>>272 そんな貴方は、ギガバイト製のマザーで自作しましょう!
USB接続のFDD,HDD,CD-ROMからOSを起動できます。
PCI接続でない限り、ホットプラグが有効です。
>>262 >>263 ありがとうございます。
実は
(1)VirtualConsole* console = new SystemConsole();
(2)VirtualCosole* console = new LogConsole();
console->printf("hoge");
出力先はconsoleの中身次第みたいな作戦を目論んでいました。
SystemConsole#printfの中身は_sys_printfに任せようと思ったので
例の質問をした次第です。
>>264 ご紹介ありがとうございます。
ReacOS試してみました。すごいですねぇ。
ソースを見てみたら、結構綺麗でした。
日付を見ると98年とかあるのでリリースまでに結構かかってるのですね。
Monaはあそこまで動くまでどれくらいかかるんだろう・・・
>>266 >sprintfに対するvsprintfのようなものを用意して、
>前者は後者を呼び出すだけにして、
>実装は後者で行うようにすると簡単
なるほど。ありがとうございます。
>>270 >むしろ、新規にOSをつくる理由はだいたい、
>既存のOSにない機能性を求めるところからきてるのでは?
ですね。
また勉強中ためしばらく ソースの更新はないかもしれません。 やっぱり継承は微妙に使えないかも。⇒今の環境では。
278 :
デフォルトの名無しさん :03/02/07 20:07
>>279 >00000648489i[CPU ] write_virtual_checks(): no write access to seg
>00000648489p[CPU ] >>PANIC<< exception(): 3rd (13) exception with no resolution
このエラーですがカーネルサイズによるものっぽい。
うーんどこかでメモリをこわしてるっぽい。
デバッグか(涙)
switch ( seg->cache.type ) { case 0: case 1: // read only case 4: case 5: // read only, expand down case 8: case 9: // execute only case 10: case 11: // execute/read case 12: case 13: // execute only, conforming case 14: case 15: // execute/read-only, conforming BX_INFO(("write_virtual_checks(): no write access to seg")); exception(int_number(seg), 0, 0); return; このへんかな。
282 :
デフォルトの名無しさん :03/02/08 21:31
継承するときに自己書き換えしてるんじゃない?
>> 284 おそらく仮想関数テーブルが原因ではないと書いてあるよ。
>>285 さん
281の内容は、エラーで発生した例外割り込みを処理してる部分じゃなくて、
この部分そのものがエラーの原因?
いいかげんなこと言ってしまいすみません。
もう少し勉強して物言います(泣
>>284 こんばんは。アドバイスありがとうございます。
ご紹介いただいたURLは、以前一度だけ見たことがありましたが
もう一度みなおしてみます。
上のほうに書いたbochsエラーの原因が半分分かりました。
テスト用プロセス3のスタックが原因でした。
今は適当に何も考えずespを設定しているのですが
これがまずかったようです。(当たり前か)
VirtualConsole問題は相変わらず解決していません。
288 :
デフォルトの名無しさん :03/02/09 07:45
難しすぎて面白いネタの部分が分からないよママン
VirtualConsole問題は解決しました。 プライベートでないstaticオブジェクトの初期化が問題でした。 解決の糸口を下さったniqkさん、超先生、Yas2さんありがとうございました。 m(__)m Monaでは仮想関数も使えることが分かりました。 これからはガシガシ使います。
290 :
デフォルトの名無しさん :03/02/10 15:32
age
最終的にはどうしたいの?そこまでいきたいの?
292 :
ひげぽん ◆Ngzcp/NZpA :03/02/11 01:31
bochs,Virtual PC,実機でフロッピィドライバの実験をしているのですが bochsのFDCにcalibrateコマンドを送っても処理後にinterruptが発生しない。 bochsのFDCにmotorリセットコマンド送っても処理後にinterruptが発生しない。 という現象が見られます。 ただし目的のコマンドに合った動作は得られている。 これは、 「FDCによっては処理後にinterruptを発生させないものもある。」 「bochsは、FDC部のエミュレーションに未実装部分がある」 どちらなんだろう。となやんでいます。
>>292 実FDCもチップ毎に挙動が異なるらしい
intelのチップセットでも妙な物もある
仕様通りに動くとは期待しないほうがよさそう
>>293 処理終了のにinterruptが来てなくても
MSRの状態を見て処理終了を判断、という仕様でいいのかなあ。
bochsで動かないのはまずいなあ。
>>293 すいません293へのコメントが抜けてました。
もしよろしければ作成の体験談・妥協点を教えていただけたら幸いです。
>>295 メモリ上に読み込む事のみが目的でしたから、
割り込みはマスクしてFDCのポーリングで逃げました。
並列動作などを考えると大変でしょうね。
はじめてこのスレ読ましてもらいました。 とっても敷居の高いスレでしたが自分も作ってみたいなぁと思いました。 アセンブラの勉強から早速やってみたいと思います。 、、、、到底追いつけるとは思えないですが、、、
>>296 ありがとうございます。
なるほどやはりポーリングしてだめならタイムアウトですかね。
>>297 こんばんは。
>アセンブラの勉強から早速やってみたいと思います。
>、、、、到底追いつけるとは思えないですが、、、
いえ全然すぐに追いつけると思います。
是非がんばってください。
このスレに触発されてマシン語の勉強を始めてしまいましたw ひげぽんさんOS制作がんばってください
このレス、いつも拝見させてもらってます。 わたしも勉強中・・・・・。でも忙しくて進んでない罠が・・。 ひげぽんさん、ファイdです。
さっそくはじめての486を勉強中なのですが、質問です。 firstboot.asmのファイル中で TEMPSEGが9f00と宣言されているのが その少し下のほうで ES:DI 9fe0:0000となっていて、 どこで換わったのか分りません。。 ひょっとしてすごいダメダメな質問??
>>299 >>300 ありがとうございます。
私も最近忙しくてくじけそうですががんばります。m(__)m
FDCドライバをゆっくりと作成中です。
あ、単なる間違いですか。 なんか特別な仕組みがあるのかと。。 特にRAWRITEがどうのとかの所とか。 interfaceの7月号が売ってないですぅ。。 秋葉でも神保町でも新宿でも。。 どっかに売ってないでしょうか?
またpart2からやりなおしですか。はぁ。
>>304 神保町にないなら見つからないと思われ。
出版元に問い合わせたほうが早いんじゃない?
>>305 すいません、なるべくここでの質問は避けるようにしますんで。。。
開発メモ bochs2.0.2にて現象確認(Monaの環境だけの現象かもしれません) (1)FDCのDORに対してリセットコマンド0x00を送ると not ready , busy状態になりいくら待ってもその状態は変わらない。 その後 not ready を無視して motor onコマンドを設定すると ready ,not busy状態になる。 (2)recalibrateコマンドを発行後(senseInterrupt前)に割り込みが 発生しない。 ただしコマンド発行前後でready -> not ready -> readyという状態遷移はする。
>>308 Bochsがおかしいと思うんだったら、
Lタンみたいに調べてみるべきじゃない?
そんな難しいことはできませんとか言われそうだから、
OS作るのも充分難しいと釘を刺しとく。
おかしいと思う事があったら報告があるのは良いのではないかな。 ついでに言えば、ココに書くだけで情報が集まるならそれは良い事だ。 情報収集の努力はしておいて損がない。 しかし、自分で調べることが重要なのもまた事実。
あまり覚えていないのですが DORに0x00(NORMAL->RESET)を書き込んだ後、 DORに0x04(RESET->NORMAL)を書くのでは? あと、この二つの間にwaitが必要だったかもしれません。
>>310 >おかしいと思う事があったら報告があるのは良いのではないかな。
>ついでに言えば、ココに書くだけで情報が集まるならそれは良い事だ。
>情報収集の努力はしておいて損がない。
フォローありがとうございます。
意図としては、単純に開発メモ(忘れないように)と
情報共有と知っている人がいたらいいなあの3つがあります。
>しかし、自分で調べることが重要なのもまた事実。
御意
>DORに0x00(NORMAL->RESET)を書き込んだ後、
>DORに0x04(RESET->NORMAL)を書くのでは?
アドバイスありがとうございます。
私の想定ではDORに0x00(NORMAL->RESET)の直後に
割り込みが発生するとおもっています。
DORに0x04(RESET->NORMALに関しては
MonaのMFDCDriverではモータスターと同時にこのコマンドを送っています。
この操作のあとの割り込みはBochs,VPC,実機で確認しています。
>>314 ん?PC98?FDCのチップ名がD765AでAT互換機のPD765と似てるけど、
互換互換性あるの?ポート番号だけ変えれば話が成り立つとか、、、
>>315 「D765A」じゃなくて「PD765A」の間違い。脱字スマソ
あ。「互換」も余分だ。重ねてスマソ
某OSのFDCドライバはPC98版とAT互換機版で90%くらい同じコードだよ
>>315 uPD765ですな。Aは改良版と言うことです。
コマンドなんかは同じじゃなかったかな。
_,.'⌒) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ , ´f二コヽ / そもそもSuper I/O chipに統合されてるので ! l !ノ リ i l <. NEC uPD765(A)そのものじゃないですしね。 ノiハl.゚ ー゚ノリ \ NT4 DDKに付属するFD driver sampleは ⊂)允つ \ 完成度としては最高だと思います。 \__________________
結局、DORのbit3を立てないと割り込みが発生しないということのようですね
321 :
ゆりゅ ◆6KzN17336I :03/02/16 19:33
さて。
こっちに1度も書いたことなかったので、ちょっと書いてみよう
yuryu で参加してます。
>>29 ごめんなさい、ずっとさぼってました。
早く gcc が mona で動けばいいね・・・
>>314 さん
ありがとうございます。
>>319 NT4DDKって簡単にてにはいんるんでしょうか。
>>320 そのようですね。ありがとうございます。
>>321 ゆりゅさん
一緒にがんばりましょう。
プロセス管理をきちんと実装したい。 のに、FDCDriverがうまくいかない。 GPLのソースを導入するのも良いとアドバイスをうけたので 最悪その手もあるがここまでやったので・・・ DMACの設定とかを丸ごとぱくってて理解していないのが悪いのだろう。 seekはできないが、readができない。 早く先に進みたい・・・
>>323 NWSOSみたいにBIOSってのも手だと思う
>>324 実は、FDCのドライバ書くより、はるかにBIOSを呼び出すほうが技術的に
難しいといって置きます。
32BITプロテクトモードから、BIOSを呼び出すのはかなり大変なんです。
最低でも仮想8086モードを利用するのですが、割り込みなども全部
「V8086へのリフレクト」が必要になります。
レベル遷移も上下とも自由自在に行う必要があり、かなり複雑になります。
(失礼ですが、FDCドライバが難しいと感じる人には無理だと断言しても
過言ではないと思います。)
>FDCドライバが難しい感じる人には無理 資料が無いから難航しているのでは?
>>326 FDC μPD765Aは、PC-8001の時代から使われていたCHIPで、資料というより
出来上がったソースが一杯あるはずなのです。
歴史が古いので、既に最適化も限界まで行われているはずで、セクタ
リード、ライトルーチンなどはそのままコピーして使えるほど簡単なん
です。BIOSのソースもあるでしょうし、それを32BITに変えることは非常に
基本的なことですよ。
>>325 いずれにせよVESAに手を出すとやらないといけないから脅すのもどうかと
>>323 > GPLのソースを導入するのも良いとアドバイスをうけたので
> 最悪その手もあるがここまでやったので・・・
別に最悪でもないと思う、ていうか現実的
FDCに限らず色々なハード全部をサポートしきれるわけない
Windowsのドライバ流用はほとんど絶望的だけど
Linuxのドライバならソースもあるしやりようはあるだろう
でも新しいOSを作るのとは技術的に趣向も違うし
誰か古狸の応援でも受ければ良い分野ではあるな
ひさしぶりに来てみました。 いまはファイルシステムいじってるのかな? 過去レスみてきま〜。 がんばれ、ひげぽん!
>>327 いや、小学生の頃からアセやってる様な人には簡単かもしれんが、
最近始めた人間にとっては例えソースや資料があったとしても、
デバイス相手はなかなか勝手が分からん物なのだよ。
ワシも最初は随分苦労したよ。要は慣れの問題。
今はアレでもそのうちなんとかなるさ。
このスレはそういう場所。
>>325 今日できなくても、明日できるかもしれない。
明日できなくても、一週間後にはできるかもしれない。
自分の趣味の時間を使ってやってるのだから、
今できるかではなく、出来るようになってやる、という気持ちのが大切。
と思われるが如何か?
>>332 それは一向に構わないんですよ。
でも、Monaのページにご覧になったかどうかは分かりませんが、
正直言って:
「今、一番将来性のあるOSかもしれません。」
は誇大だと思います。
なぜなら、もっとできる人が世の中には山ほどいるからです。
はっきり言ってMonaはまだ何も出来てなくてOSなんて呼べる代物じゃない。 それは作ってる人間が一番良く知ってるだろ。 でも、何も出来てないって事は同時にこれから何でも出来るかもしれないと いう可能性を秘めてるわけだ。 あそこの「将来性」ってのはそういう事が言いたいんじゃないのか? そういう意味での「将来性」ってのはWindowsやLinuxやNWSOSにはない。 Monaの専売特許だよ。あのページはそれを希望とちょこっとのアイロニー を添えて書いてるんだよ。だから誇大でもなんでもないだろ。 アゲ足とるのはヤメレ。
Windows, Mac, Linuxのような物は、それなりの人数と年月がないと作れない以上、 ぶっちゃけ、OS作りなんて、趣味以外の何者でもないと思う。 OSASK や Mona のように、大きな夢を掲げて楽しくみんなで開発するのも良し、 MEG-OSのように萌え路線に走るのも良しで、楽しいことが重要ではないのか? 334にかぶるが、あげ足とるのはやめて楽しめと
メグタソは別に「萌え」に走ったわけじゃないょぅ。 たまたま「萌え」を実装してみたらみんながそっちに注目してるだけだょぅ でも、「MOE」は最近実装しましたがヽ(`ー´)ノ
>>336 違ったのか...スマソ
OSのことはさっぱりだが、ガムバレ メグタン
がんばるょぅヽ(`ー´)ノ
ヽ(`ー´)ノ らいこんたま、らいこんたま、わーい、わーいヽ(`ー´)ノ
>>330 >がんばれ、ひげぽん!
ありがとうございます。
えーと。
私のしょぼい技術のせいで、ちょっとした
騒動?になっていて申し訳ありません。m(__)m
この場であまり弱音を吐かず、技術を着実に少しずつでもつけられるよう
精進いたします。
Lタン、MONAに脅威をもってついに攻撃を始めたか。 よっぽど脅威に思ったと見える(藁 ある意味MONAにとっては大人の仲間入りの洗礼だね。 OSASKでもそういうことあったしね。 Lタンは、自分がプログラムに費やした時間と アセを半年前にはじめたヒゲポソを比べて言っているのだろうか。
>>345 ある人が学習に費やした時間の間も、別の人にも時間があったはずです。
その間にやったことが今を作ります。もちろん、年齢も関係あるとは
ありますけれども、、、。
>>346 そこまで分かってるなら、話が早い。
ヒゲポソは、今までLタンがまあまあ得意な分野とは
違う分野に時間を費やしていたのでは?
Lタン冷静になれ、この分野での経験年数・基礎知識をよーく考慮してみれ。
>>347 「ヒゲポソは、今までLタンがまあまあ得意な分野とは
違う分野に時間を費やしていたのでは?」
それはわかります。
しかし、その状況で、
「今、一番将来性のあるOSかもしれません」
と繋がっていくのかが分かりません。
(アセンブラも知らない、FDCの制御も出来ない、時間もない、資料も集め
られない、学習速度も個人的には早いとは思えない状況下で、、、。)
「二重かきこ」と言われそうですが、気になるので追伸。 自分の作っている作品の事を「将来性がある」と豪語することと、 「私は何も知りません」と言って、2chで聞きまくっている状況とが 全くか合わないように感じるのです。 (実は本心では自信過剰で、猫かぶってるんじゃないかと)
FD Read実験成功しました。 ただしVPCと実機のみ(Bochs)はまだです。 DMACのステータスレジスタの様子がBochsだけ違うので ちょっと調べ中。
(L氏とH氏の一騎打ちか?わくわく)
おいおい、いい加減止めようぜ。こんな話題。
ひげぽん氏の
>>350 の書き込みがなんだか縮こまって見えて可哀想だ。
個人的にはLightCone氏の意見に近いが、
こんなところに書いても不毛な議論(?)だろ。
>>348 >今、一番将来性のあるOSかもしれません
こういうキャッチコピーはふつう大げさなもんだって。
真面目に考えちゃいかんよ。
そういうこった。マターリしる!
まぁ、同じOS作成経験のあるものからすれば、Lタンが現在のMonaについて歯痒い思い をしててそれで噛み付いてるってのも分からんでもないが、実力があるんならあるで どっしり構えて超先生みたく暖かく見守れないものだろうかね。どうよ?>Lタン
>(実は本心では自信過剰で、猫かぶってるんじゃないかと) よく言った!! 実はみんなそう思ってるんだろうけど...
理屈で叩くより感情で叩いた方が有効な場合が多いことを学んだらしい どうせばれるにしろ名無しで叩かないところは流石です
良スレなので余り反応したくないのですが、念のため一言だけ: 荒 ら し は 放 置 の 方 向 で
Mona develop beta 0.02b のタグがない様です。大雑把に cvs rtag -f -D 2003/1/30 develop_beta_ver0_02 mona_v1.0 タグを打って、これをチェックアウトしたものと 配布パッケージを diff -r で比較しながら cvs tag -F -r (rev) develop_beta_ver0_02 path/to/file タグを調整すると楽ですよ
ところで、MEG-OSって今どこにあるの? meg-os.org逝ったらアダルトサイトだったんだけど…(;´Д`)
ちょっと入り口変わっただけだょぅ。昔から18禁だったょぅヽ(`ー´)ノ
ガーン。初めて行ったから間違えたかと思ったよ。ありがd
ところで今メグタソはスッドレ実装中なんですけどスケジューラの 参考になるサイトとかないんですかね? 現状のスケジューラは禿しく糞らしいんで(つД`)
>>364 プロテクトモードで対応するVBEファンクションが
呼び出せるというだけです。
「VGA BIOSがそのまま使える」というわけではありません。
ちなみにこの機能はVBE 2.0から実装されてます。
>>365 ,366
多謝。PDF見ると、初期化が複雑そうなヨカン
てすとん
本当の所、Lタンは、ヒゲポンタンに口を出したいけど 口を出すと、自分のOSとの区別がつかなくなってくるから それを嫌って、口を出せないのが悔しく また、ヒゲポンタンの作業が遅々として進まないのも もどかしく、黙って見守るのが辛くなって 口撃してみる事したのでは? と、今更むしかえしてみる こんな事書いてるけど、別に二人の事を馬鹿にしてる訳ではないよ 本当に
スレと関係ないレスは自粛汁!
メグタソもソース公開したら叩かれたょぅ。えう〜ヽ(`ー´)ノ
374 :
デフォルトの名無しさん :03/02/21 21:40
>>372 そうか? 確かにここに来て、批判的な書き込みもあるが
少なくともこのスレシリーズでは、LightCone氏はヒゲポン氏に対して
「良き先輩」としての暖かいアドバイスを送っている方が多いと思うぞ。
IRCでも指摘されたんですけど、Monaのページを作っているのは、ひげぽん さん自身じゃなかったんですね。 ですので、#348, #349は言いすぎでした。すみません。 (でもまあ、取り立ててひげぽんさんの学習速度が早いとは思えま せんね。すみませんが。)
>>375 LightConeさん
こんばんは。
> IRCでも指摘されたんですけど、Monaのページを作っているのは、ひげぽん
>さん自身じゃなかったんですね。
>
> ですので、#348, #349は言いすぎでした。すみません。
いえ。
LightConeさんが、そう思われた経緯も理解できますので
全然気にしてないです。
というわけで、これからもよろしくお願いします。
> (でもまあ、取り立ててひげぽんさんの学習速度が早いとは思えま
>せんね。すみませんが。)
自分でも早いと思っていないので(笑)
377 :
デフォルトの名無しさん :03/02/22 00:16
>>1 最高にくだらないもん作ってるなww
俺こういうくだらない笑いが好きだwww
正直、電波飛び交ってるよな。 ま、冷静に考えたら、酔狂だ。 そんな漏れも、ここ読んでる時点で、糞馬鹿。(w
>>379 俺もそう思う。
別に誰もひげぽんが早いなんて言ってないのに
いちいち言わなくてもいいんじゃない。
早くないことを指摘すると何かいいことあるのか?
まあ、アレだ。 コンピュータにだけ向かい合って来たんで、 言葉を"オブラートに包む"事が出来なくなったんだろ。
382 :
デフォルトの名無しさん :03/02/22 11:42
最小限の労力で的確に急所を突くという動作は、 ある種の職業病ですが、何か? つうか、おまいら。寒いです
コンピュータに携わると人を見下す性格がデフォルトとなるようです
端的に言うと、 自分の(画期的、先進的な)アイデアは真似されたくないのに、 自分がやっていることは高度であると自慢したいから、 このスレに居着いて先輩面して箸にも棒にもかからない中途半端な助言だけしてるわけだ。 自分が中心でないと気が済まない。 このスレはタテマエはともかく、主人公はひげぽんなわけだし、 ひげぽん寄りな意見の人が多く集まるのは当然なんだが それが理解できず、自分に賛同しない物が居るとひげぽんを叩く。
>>384 ひげぽん寄りな意見の人が多く集まるのは当然なんだが
それが理解できず、自分に賛同しない物が居るとひげぽんを叩く。
そうそう。Lは自分がなにやってるのか分からないんだろうな。
というか、ここで、このスレと関係ない話題で盛り上がるのはイクナイから
L の 話 題 は L の ス レ で
ってことでどうでしょう?
はじめまして、NWSOS信者と申します。 教祖様が叩かれているのでフォローしますと、 教祖様は単純に自己にある物差しで、人や物を観察、評価し表現するのです。 その結果、周囲が不愉快になるかどうかはまた別問題ですが、大抵の日本人は その問題を丁寧に処理します。つまり、大多数の人が気を使うとこなのね。 だけど、教祖様はそんな情的なことには関心がないの。 そこで、謝った判断材料で「○○さんは覚えが早いとは思えません」など 国内の常識人が見れば一言多い言動となるわけです。 OSを開発している稀有な人材が集まってるのだから、つまらない揚げ足どりで 膠着させるのは止めましょう。
part2に逆戻りと言われそうですが、どうしてもエラーの原因がわからない ので、御教授ください。 少々長いですけどすみません。 0x07C0:0x0000 から 512バイト (ブートセクター) 0x07E0:0x0000 から 1024バイト (カーネル) <Bochsのエラー> Event type: PANIC Device: [CPU ] Message: exception(): 3rd (13) exception with no resolution 00000573597i[CPU ] protected mode 00000573597i[CPU ] CS.d_b = 16 bit 00000573597i[CPU ] SS.d_b = 16 bit 00000573597i[CPU ] | EAX=60000011 EBX=000007c0 ECX=00000002 EDX=00000000 00000573597i[CPU ] | ESP=0000fffe EBP=00000000 ESI=000000d9 EDI=000007e0 00000573597i[CPU ] | IOPL=0 NV UP DI PL NZ NA PE NC 00000573597i[CPU ] | SEG selector base limit G D 00000573597i[CPU ] | SEG sltr(index|ti|rpl) base limit G D 00000573597i[CPU ] | DS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0 00000573597i[CPU ] | ES:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0 00000573597i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 00000573597i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0 00000573597i[CPU ] | SS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0 00000573597i[CPU ] | CS:07c0( 0000| 0| 0) 00007c00 0000ffff 0 0 00000573597i[CPU ] | EIP=000000da (000000da) 00000573597i[CPU ] | CR0=0x60000011 CR1=0x00000000 CR2=0x00000000 00000573597i[CPU ] | CR3=0x00000000 CR4=0x00000000 00000573597i[ ] restoring default signal behavior
[bits 16] jmp 0x07C0:start ;CSコードセグメントを設定する。 start: ;セグメントの設定 mov ax, 0x07C0 mov ds, ax mov es, ax mov ss, ax ;ブートスタートメッセージを表示する mov si, BootStart_Msg call print ;FDからセカンドセクター以降を0x07E0:0x0000へ読み込み call read mov bx, 0x07C0 mov es, bx mov si, KernelLoad_Msg call print lgdt [gdtr] ;割り込みの禁止 cli
;CR0の1bit目をセットし、プロテクトモードへ移行する mov eax, cr0 or eax, 1 mov cr0, eax jmp flush_q1; ;-------------------------------------------------- ;グローバルディスクリプタテーブル(GDT)定義 ;-------------------------------------------------- gdtr: dw gdt_end - gdt0 - 1 ; gdt limit dd gdt0 ; start adderess gdt0: ; segment 00 dw 0 ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0 ; segment type db 0 ; segment limitH db 0 ; segment baseH gdt08: ; segment 08(code segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x9a ; Type Code db 0xcf ; segment limitH db 0 ; segment baseH
gdt10: ; segment 10(data segment) dw 0xffff ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x92 ; Type Data db 0xcf ; segment limitH db 0 ; segment baseH gdt18: ; segment 18(stack segment) dw 0 ; segment limitL dw 0 ; segment baseL db 0 ; segment baseM db 0x96 ; Type Stack db 0xc0 ; segment limitH db 0 ; segment baseH gdt_end: ; end of gdt
;------------------------------------------------------------------- ; 文字列を表示する ;入力レジスタ ds:si(文字列の先頭アドレス) ;使用レジスタ ah, al ;------------------------------------------------------------------- print: mov ah, 0x0E mov al, [si] cmp al, 0x00 je print_return int 0x10 ;1文字表示(int 0x10, ah=0x0E, al=文字コード) inc si jmp print print_return: ret
;------------------------------------------------------------------- ; カーネルをFDから読み込む ;------------------------------------------------------------------- read: ;ディスクリセットをする mov ax, 0x0 mov dl, 0x0 int 0x13 ;ディスクリセット(int 0x13, ah=0x00, al=ドライブ番号) jc read_err ;0x07E0:0x0000へFDから読み込む mov ah, 0x02 mov al, 0x02 mov ch, 0x00 mov cl, 0x02 ;セクタ番号だけは0x1から始まるから mov dh, 0x00 mov dl, 0x00 mov di, 0x07E0 mov es, di mov bx, 0x0000 int 0x13 ;(*) jc read_err jmp read_return read_err: mov si, DiskReadErr_Msg call print jmp read read_return: ret
;メッセージ一覧 BootStart_Msg: db 'now boot starting!!...', 0x0D, 0x0A, 0x00 DiskReadErr_Msg: db 'disk read err', 0x0D, 0x0A, 0x00 KernelLoad_Msg: db 'kernel load success!', 0x0D, 0x0A, 0x00 [bits 32] flush_q1: ;ここでエラー終了する。 ;セグメント間ジャンプ命令によってCSレジスタに0x0008をロードする。 db 0eah dw set_cs_desc1 + 0x7C00 dw 0x0008 set_cs_desc1: mov ax, 0x10 ; ds & es mov ds, ax ; selector is mov es, ax ; 0x10 mov ax, 0x18 ; ss selector mov ss, ax ; is 0x18 mov esp, 1024*1024*8 ; sp is 8MB jmp kernel ;$ 現在の行の先頭アドレスをさす。 ;$$ 現在のセクションの先頭アドレスをさす。 ;($-$$) セクションの先頭からのバイト数 times 510-($-$$) db 0 ;510-($-$$) bytesを0で埋める dw 0xAA55 ;ブートシグニチャ kernel:
大量消費ですみません。 どこかにUpした方が良かった... 御教授お願いします。
どこからツッコんだらいいか分かりません。。
エラーで止まった、EIP=000000da の場所は最後の方の ;ここでエラー終了する。 ;セグメント間ジャンプ命令によってCSレジスタに0x0008をロードする。 db 0eah dw set_cs_desc1 + 0x7C00 dw 0x0008 にあたるのですが、そこを逆汗してもきちんと正しいと思われる内容が 表示されていて、何故エラーなのか原因がわかりません。
パクッテル、そして、、、それがうごかない。
>>398 IDT関連の部分は、パクリました。ゴメンなさい。
後々、独自に設定します。
一度はプロテクトモードでVRAM出力まで行けたのですが、
どういうわけか、後々のことを考えたコードに書きなおすと、
エラーで動かなくなりました。
読みにくければ、どこかにUPします。
どうか御教授ください。
IDT間違い GDTです。
懐かしいなあ。 今すぐはわからなそうです。ごめんなさい。 というか忘れてる・・・ VirtualConsole作戦は時期尚早だったと後悔気味です。 newしないと、文字出力できないということは メモリ管理オブジェクトのデバッグが非常に困難・・・ 安定していると思っていた、カーネルメモリ管理クラスの挙動が怪しい。
dd gdt0 + 0x7c00
>>403 どうもありがとうございます!
そんな基本的な部分に抜け落ちがあるとは気づきませんでした。
以後、このような基本的な部分でのミスがなきよう注意します。
BochsではきっちりプロテクトモードVRAM文字出力まで行うことができたのですが、
実機ではブートセクターを読み込んだらすぐに再起動になる現象は
やはりまだ直っていないようなので、もうすこし頑張ります。
startラベル以下でのセグメントの設定をしていなかったのがまずかったのかと
思い、修正した結果がこのバグだったのです...
FreeDOS教徒さん、403さん 夜遅くまでお手数かけました。 実機の問題は、明日やってみることにします。
> hisohisoさん タグの件ご指摘ありがとうございます。 次回のリリースの際には気をつけます。m(__)m
>>404 スタックポイント(sp)が設定されていないから
だと思います
mov ss,ax
の次の行に
mov sp,0xffff
を追加してみてください
スッタクポインタ奇数かよ
>>407 に追加
"mov ss,ax"はstartラベルに近い方の事です
>>407 (409),FreeDOS教徒さん
返事遅くなりました。
start:
;セグメントの設定
mov sp, 0xFFFF
;xorsp,sp
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov ss, ax
と修正したところ、実機の方でもうまく動きました。
御教授ありがとうございます。
セグメント間ジャンプをしたのにSPの設定をしていないためということが原因で、
FreeDOS教徒さんが示された SP = 0x0000 に指定すると言うのは、
SP から -1 すると SP = 0xFFFF ということになり、
無駄なくセグメントを利用できるということなのでしょうか...
>>411 0x0000に指定しておけば、次に積まれるスタックの内容は
sp-2=0xFFFEに置かれます。
あと、割り込みの暗黙的な禁止はスタックセグメントの
操作後1命令だけですし、そのような順番はあまり
良くないので、mov sp,〜はmov ss,〜のすぐ後に移し
たほうがよいでしょう。
>>FreeDOS教徒さん 修正しました。重ね重ねご助言ありがとうございます。
415 :
デフォルトの名無しさん :03/02/24 18:38
>>414 >突然ですがMONAはGUI実装予定ありますか?
Monaのホームページ見てから書き込みしましょう。
GUI の代わりに C-GUI or I(mitation)GUI なんてどうでっしゃろ。 早く言えば AA の GUI よ。 コレなら俺でも参加できる
GUIがどうとかいってるのはもう少しカーネルというものを 勉強された方がいいかと
ハァ?
Site に FAQ を乗せてくれたらいいな・・・ Windows と違うのは オープンソースだったり軽かったりセキュアだったりで UNIX と違うのは >>Monaはなるべく過去の負の遺産を引き継がないように ってあたりっすか?
>>414 GUIはサポート予定です。
ただし現時点では、GUIを実装する段階にはいたっておりませんので
しばらくはCUIのままだと思います。
>>416 > C-GUI or I(mitation)GUI なんてどうでっしゃろ。
面白いですねぇ。それでもまだ、現段階では時期尚早かもしれません。
>>419 >Windows と違うのは オープンソースだったり軽かったりセキュアだったりで
>UNIX と違うのは
> >>Monaはなるべく過去の負の遺産を引き継がないように
そうですね。大雑把に言って
良いものはまねする、悪いものは出来るだけ引き継がないようにするというかんじです。
>Monaはなるべく過去の負の遺産を引き継がないように 時期がきたら、IA-32アーキテクチャ依存からの脱却キボンヌ
>>421 さん
>時期がきたら、IA-32アーキテクチャ依存からの脱却キボンヌ
これもだいぶ先ですが、できれば実現したいですね。
今日は割り込み処理をアセンブラに移行しました。
以前のC++の割り込み処理ではスタックが壊れているような印象があったので
いろいろな方のアドバイスをもとに現在の形に変えました。
2ch風ってところが、激しく世界を狭くしているな もっとはっきり言えばヲタク的と言うか・・・いやマジで
>>423 何の世界を?
ヲタク的だって言いたいことはわかるが、だから世界をどう狭くしてるかわからん。
あと世界が狭くてどう悪いのかも。
別に一般的に普及させたいOSを作るスレでもあるまいし・・・
>>412 bochs でデバッグしてるときに「espが0だ変だ」って言ってpanicしたことあるけど、
大丈夫かな。
>>426 bochsは使いっぱなしだけど、今のところリアルモードで
xor sp,spして問題になったこと無いよ。
>>426 espではなくspなので
0でも大丈夫なのです
今、640*480(256色)モードで色々VGAに書き込んでいます。 書き込み色プレーン指定、ビットマスクの指定の後、 ビットデータを書き込みたい場所のメモリ位置へ転送することで、1ドットを描画しています。 この方法では、横8ドットを一度に書き込む必要があるので、 赤白黒緑赤白黒緑 のようなランダムなドット絵を描画するには、 同じ場所をビットマスクを変えて8回ビットデータを転送しなければいけません。 色々、アルゴリズム的な最適化をしてもかなり遅いです。 Celeron1.7GのCPUで、Bochsだと全画面書き換えに1.5秒ぐらい、 実機でも書き換えがかんたんに見えるぐらい遅いです。 PC-98では、 Bプレーン 0xA8000〜 Rプレーン 0xB0000〜 Gプレーン 0xB8000〜 Iプレーン 0xE0000〜 となってて、メモリアクセスだけで高速に描画できると思います。 DOS/V の VGA に高速で書き込むには、640*480(2色) or 320*200(256色) モードに 設定するしかないのでしょうか?
(ココに書くの久々だなぁ…
>>430 OS側で色別に仮想VRAMを持って、それを一気に転送とか。
(実際、VGA BIOSってかなり遅いし。
ゲームとかの用途だとVGAサイズはリアルモードでは厳しいね…
プロテクトモードなら、他にVESA BIOSにLiner Frame Bufferを作ってもらうって手がある。
>>365 あたり。自分は使ったこと無いんで詳細は頑張って読んで…
ただし、こっちは対応してないグラフィックカードが有るらしい。(具体的にはi815。
Master.Libのソースでも見てみるかな…
書き込み有難うございます。 一応、作成しているプログラムはプロテクトモードOSのつもりw なのでBISOは使えないです。I/Oポートに直接アクセスしています。 概要は、一度ビットマップ形式のバッファを作って、一気に書き込みといった雰囲気です。 素直に描画するのなら、1ドットの描画に、 書き込み色プレーン指定、ビットマスクの指定を、グラフィックコントローラーを操作して行い、 該当のメモリにビットデータを転送しています。工夫すれば、ビットマスクの指定はほとんど しなくて良くなります。全画面更新のために、これを640*480回繰り返してるのですが、 ホントに遅いです。 VESA BIOSにLiner Frame Bufferに作ってもらうしかないのですか... ちょっと試したことはあるのですが、内容があまり理解できてないというのもあり、 モード指定の時点でもう失敗しているので、避けたいのですけどね。
FD読み込みが実機で失敗する現象がなかなか解決せず悩み中。 リザルトステータスを見る限りでは ST0= 0x40 コマンド異常終了 ST1= 0x10 overrun FDCからの転送要求にホストが応答しない ST2= 0x00 C= 0x00 H= 0x00 R= 0x01 N= 0x00 DMACの設定かなと思って調査中。 スタック破壊は原因ではなかった模様。
Nは0でいいの? 俺もちょっとあやしいからどうだかわからんが…
Nは普通2のはず?
>>430 640x480x256って、どのビデオモード使ってるんですか?
ふつー俺なんかだと拡張ビデオモード101hなんかを思いつくわけですが。。
それはともかく、DspVVみたいなディスプレイドライバのソースとか、
あとEOTAのソースなんかも参考になるんでないかなーとか思いますた。
現在全プレーンを一度に更新できる方法探し中。
すみません、書き間違えてます。640*480(256色)→640x480(16色)です。 EOTA では、構造体に描画コマンドとして蓄えてる? ようです。 Liner Frame Bufferを使うか、描画コマンドを使って、書き込みモードをかえながら描画するのか、 白黒にするのか... あまり複雑なことしても、他の部分を作る時間が無くなりますし。
>>430 ピクセル描画をいまのところサポートする必要性はないんだし、
文字書き込みがきちんとできれば、他のところに挑戦していいんでない?
いずれスクロールで頭を悩ますことになるんだろうけど(汗
文字書き込みはできるので、FreeDOS教徒 さんがおっしゃる通りなのですが、 もう少しだけ、色々試してみて、できそうもなければ、他の部分を作ることにします。 まだ、mallocもなく、バッファもスタックに確保してるだけなので...
>>439 この辺から作っていくと面白いと思うよ。
メグタソは萌えで有名なんだけど、
AAできるフォントが使えたりもしたしね。(モナーフォント?)
ひげぽんは足腰のしっかりした本格的なOSを作ろうとして
肩肘張りすぎてる気がするな〜。
何だかんだいって下馬評通りにバンバン進んでないし。
短期的には430様のアプローチの方が楽しそう。
>>424 打倒M$だっつってるじゃん。
>>440 妥当M$は、たんにいいOS作るだけじゃむりなんだよなぁ……
とか逝ってみる
>>430 もう昔のことで覚えとらんのだが
VRAMへの書き込みが特定プレーンにそのまま書き込まれるように設定してやれば、98と同じように見えるので
グラフィックコントローラの設定 4(プレーン)回
640x480/8(byte)のコピー 4(プレーン)回
ですむんじゃねーか
ライン毎とか8ドットごとでもいいけど
仮にビットマップをpacked pixelでもってるなら、packed->planeへの変換はCPUでやる。
御教授ありがとうございます。
プレーン0 を指定、640*480/8 byte を 0xA0000〜 に書き込み、
そして、プレーン0を指定、640*480/8 byte を 0xA0000〜 に書き込み、
...
という方法は実際、やってみたのですが、最後に書いたプレーンの色しか表示されていないので、
できないものかと思っていました。もう少し調べて設定ミスがないか探してみます。
Liner Frame Buffer もわかりやすいサンプルが見つかったので、こちらの方法も視野に入れて
どうするか考えます。
サンプルソース
http://www.gameprogrammer.com/1-vbe.html
二行目 プレーン0 → プレーン1 です。 書いたら、見直しているのですが(汗)
いちおうツッコミ入れとくけど、参考資料間違ってるぽ。 もう一度きちんとグラフィックコントローラレジスタ周り見直してぽ。。 ある意味すげーよ、これで動いてるのって(汗 手もとの資料をちとコピペしとくんで、これで試してみそ。 ---- Port 03C4 - シーケンサアドレスレジスタ 以下に続くマップマスクレジスタの選択のために必要です。 Port 03C5 index 02 - マップマスクレジスタ マスクするマップを選択します。0でマスク、1で解除です。 High <- 0:0:0:0:I:R:G:B -> Low (* I=輝度) Port 03CE - グラフィックアドレスレジスタ 以下に続くビットマスクレジスタの選択のために必要です。 Port 03CF index 08 - ビットマスクレジスタ マスクするビットを選択します。0でマスク、1で解除です。 ビットマスクを有効にするには、あらかじめ読み取り動作を行う必要があります。
>>448 乙〜
これ、うまくmonaとくっつけられないかな
お互いに足りない部分がうまく補完できる気がする
そうすれば面白いと思うんだけど
NWSOSが公開直後になぜ絶賛されたかというとGUIの完成度が高かったから。 MEG-OSが評判になったのも萌えられるから。 しょせん、下馬評なんてそんなもん。 OS/430(仮称)がシングルタスクでGUIだけ突っ走っても、 Windows 3.1や旧Mac OS並みにはなれるはず。。。 が〜んば!
>>449 Monaのブートローダー周りを参考というより、流用の方が近いですが、
こんな感じで、これからもお手本として参考にさせてもらうことになると思います。
それと、グラフィックにこだわってみたいなあと思っていたのと、
参考にしてばっかりのMonaに少しでも、作っていない部分のサンプルを示して
お返しをという気持ちもありLiner Frame Bufferの使用のサンプルになればと思い
作ってみました。
流用に値しないものかもしれないですが、ライセンスはMonaと同じにするので、
よければどうぞ...>Monaプロジェクトの皆様
>>450 ありがとうございます。どこまで出来るかわかりませんがとりあえず頑張ります。
いや、おもしろいです。見ててすごくタメになりました。
ありがとうございます
>>430
OSASK荒れてるな。無意味な日給叩きが原因か? ところで最近、朝鮮生、じゃなかった超先生を見ないな。 どこいった? 彼ならWindowがやってるみたいに、プロテクトモードでありながら VGA-BIOSを叩くテクをご存知かもしれぬ。
>>454 Window?
NWSOS もやってるね。
>>454 テクっていうか、仮想86モード使えばいいだけ。
だけっていっても結構大変だけど。
>>456 >テクっていうか、仮想86モード使えばいいだけ。
馬鹿な事をおっしゃらないで下さいませんか?
そんあ程度で BIOS を呼び出せたら苦労しません。
度が過ぎた知ったかぶりさに、手が震えてまともに文字もまともに 打てなかった(泣)。
<後ろ頭>y-~~~ VGA-BIOS程度ならV86モードだけでOKでは? 特に割り込みも必要ないし。 シングルタスクに限れば300行程度でV86 monitorを作れる。
>>459 他のタスクの動作を、しばらく完全に止めてしまうような動作でよければ
そんなに難しくは無いかもしれませんけれど、はっきり言って、そういうも
のと NWSOSを一緒にされたくは無いですね。
V8086モードのタスクを、未来永劫、システム全体で一つのみに 限定する場合と、BIOS用のV8086タスク以外にも、V8086モードタスクを 動かせるようにするのとでは全く話が違ってくるでしょう。 前者のようなものだと、アドレスが1MB以下の領域を、全タスク共通 にマッピングし、その領域では、線形アドレス=物理アドレスという 恒等写像にしてしまえば、BIOS呼び出し時にタスク切り替えして戻って くる必要が全くなく、同じタスク空間で呼び出せるので簡単です。 しかし、後者のようなものだと、BIOSタスクと、一般USE16タスクの干渉を 避けるためには、BIOSタスク用には物理アドレスへの恒等写像を用い、 一般USE16タスクには、全く別の通常RAMを用いなければ成らないでしょう。 (ちなみにページ切り替えを全く用いないセグメントモデルでは、 複数のV8086タスクを干渉させずに存在させるのは基本的に不可能に なると思います。) そうなってくると、BIOSを呼び出すときに、BIOSタスクへスイッチして から戻ってくるような処理が必要になります。 (タスクのラウンドを利用して出来ないわけでもないかもしれませんが、 それなりの設計力を必要とし、決して簡単とはいえないでしょう。) (簡単な方式を用いた場合、その後の成長性が確実に下がるでしょう。)
>>459 何度もしつこいようで申し訳ないですが、
>VGA-BIOS程度ならV86モードだけでOKでは?
>特に割り込みも必要ないし。
これは分かりませんよ。
割り込みのリフレクトはやった方がいいと思います。
内部で VSYNC を待つために割り込みを使っていたり、タイミング取りに
タイマーを使っているかもしれませんし。
少なくとも、仮にブートもままならないような人ならば、これを簡単と
言える資格はないと思います。
Lタソは最近誰彼構わず叩くのが好きみたいだね
×他のタスクの動作を、しばらく完全に止めてしまうような動作でよければ そんなに難しくは無いかもしれません「けれど、はっきり言って、そういうも のと NWSOSを一緒にされたくは無いですね。」 ○他のタスクの動作を、しばらく完全に止めてしまうような動作でよければ そんなに難しくは無いと思います。 ×V8086モードのタスクを、「未来永劫」、システム全体で一つのみに 限定する場合と、BIOS用のV8086タスク以外にも、V8086モードタスクを 動かせるようにするのとでは全く話が違ってくるでしょう。 ○V8086モードのタスクを、「将来的にも」システム全体で一つのみに 限定する場合と、BIOS用のV8086タスク以外にも、V8086モードタスクを 動かせるようにするのとでは全く話が違ってくるでしょう。 ×少なくとも、仮にブートもままならないような人ならば、これを簡単と 言える資格はないと思います。 ○「必要なし] 以上、添削しました。
>そういうも のと NWSOSを一緒にされたくは無いですね。 ワラタ スゲ-被害妄想 456のレス先見て見れ。 だれもNWSOSの話題なんてしてねーよ 自意識過剰もたいがいにしとけ
こういう人もいるんだね、ここ 勉強になるなぁ
変なのが寄ってくるからブチギレはやめれ。
Lさんの能力はここの住人は認めてるんだから、 下らない*あげあしとり*に突っ込まれる文章は 謹んでほしいですね。 # 知らん人間が見たらどっちが厨か分からんだろう。
能力があれば人間性はどうでもいいのかと小一時間(ry そういう甘やかしは本人の為にもならんぞ。 ってか、「あげあしとり」っていうか、LightConeがケンカふっかけてるように しか見えん。 まぁ、素でいやみったらしい口調の奴は現実に見かけるけどな。 現実なら胸の内でムカつかれておしまいってのが、2chだからストレートに 叩かれてるだけ。
しまった。468は釣りか?鬱
いや釣りじゃないです。仕事終って早めに帰ったらこんなんだったんで 私が欝になりそうであんなこと書きました。釣りに見えたらスマン。
> 度が過ぎた知ったかぶりさに、手が震えてまともに文字もまともに > 打てなかった(泣)。 自意識過剰、駄目の二乗 (知ってる人いるかな...)
実機でのFD読み込み・書き込み成功しました。 読み込み完了の割り込みを待たずにDMACをストップしていたのが 原因でした。
荒れてしまったか。申し訳ない。 申し訳ないので、少し言い訳をしていくことにする。 456 は自分ではないけれど、下に続いた組合せが悪かったかな。 NWSOS の BIOS 呼び出し方法が凄いのは押さえている。 そういう人も居るはずだし、そうでない人は放っておけば良いのでは? それで、454 に 「誰も知らないようなことではないよ?」 て事が言いたかったんだ。 基礎となる仮想8086モードは書籍にも載っている。 そこから他の用件も満たしながら実装することと 書籍を読んで分かった気になることは全く別問題だけれど。
何だかひげぽんが恐縮気味になってきた気がする。
FD読み込みですが 実機ではうまくいくのですがbochsで FD READ完了の割り込みがこない。。。 うーん。bochs起動時のパラメータでも調べようかな。
>NWSOS の BIOS 呼び出し方法が凄いのは押さえている。 凄いと主張されてることは押さえている、だろ。 455が関係者で中身を実際に覗いたのなら別だがな
FDをBIOS経由でアクセスしてもマウスカーソルがこけないという話だから かなり優秀な実装と考えていいのでは? 私のマシン全てでVESA関係の問題で起動できないので確認はできないが
なんか、仕事から帰ってきたらすごいことになってるな(w 名無しにまで牙をむき出すとは。。。 名無しの書き込みだから名誉も何もないのである意味どうでもいいんだけど、 一応弁解しておこうかな(w > 少なくとも、仮にブートもままならないような人ならば、これを簡単と > 言える資格はないと思います。 プ、ブートくらい開始アドレス0x7c00で512バイト以下のプログラム作ってそいつで カーネルなり、セカンドステージローダなりよびだす***だけ***じゃん(w Lって威張ってる割にはこれくらいのことで相当苦労したようだな。 その他の細かいノウハウは試行錯誤するか、よく考えるか、ひげぽんのように 礼儀正しく相談すればいくらでも手に入る。 一応、上で書いた情報だけで1日でプロテクトモードのローダに制御を移せましたが何か? VGA-BIOSの件もそうだとおもうがな。VGA-BIOSとFDD制御機能が干渉することは 知らんかったので、その罠にははまるかもしれんけど、まじめに取り組めばクリアできる自信はある。 Lは他人の文献とか余り読まないようだけど、自分以外人間のの能力を相当過小評価してるらしいな。 ひげぽんの謙虚さを見習って欲しいよ、全く。。。
プロテクトモードのローダじゃなくてカーネル(の替わり)の間違いだった。 ついでに、「自分以外のの」も間違い。 強気な書き込みしてみたのにミスが二箇所も(´・ω・`)ショボーン
くっだらねぇ… どっから見ても、揚げ足を取り合ってるだけだじゃん 簡単だと思ってる香具師は簡単だと思ってれば良いし 難しいと思ってる香具師は難しいと思ってれば良いじゃねぇの?
>>481 自慢になるので言わなかっただけで、私の場合、ブートなんて、半日も
かかりませんでした。
今のMonaの様な状態になるのも数日でした。
だからこそ、こんなに時間がかかっている人たちに、BIOSを呼び出せるか
どうか甚だ疑問なのです。BIOSを呼び出すのはそれなりに苦労しました。
是非やってみてください。
>>481 >その他の細かいノウハウは試行錯誤するか、よく考えるか、ひげぽんのように
>礼儀正しく相談すればいくらでも手に入る。
うそを言わないで下さい。
実際に、2chで私が本当に必要とする情報を聞いても誰も答えてくれません
でした。というよりも、事実上、答えられる人が存在しなかったという
事だと思ってます。
経験上、この辺で答えが返ってくるのは、「慣れ」の問題で誰でも習得できる
ような知識ばかりです。例えば、「Linuxでこういう事したい時どうするの?」
といった類の質問には、大勢の人が質問者を誹謗中傷・罵倒しながらワンサカ
答えますね。確かに(笑)。
>その他の細かいノウハウは試行錯誤するか、よく考えるか、ひげぽんのように >礼儀正しく相談すればいくらでも手に入る。 そもそも、全く逆さまですね。 「細かいノウハウ」というのは、「知識」ではないので優秀な人にしか 答えられないし、考える事も出来ません。 貴方がおっしゃっているような、「0x7c00で512バイト」なんて情報の 方が、2chで入手しやすい情報です。 これは、「知識型」の情報なので、知っている人にはすぐに答えられる からです。 例えば、ハード会社に勤めてる人なら、営業マンでも資料さえ読めば 答えられるでしょう。しかし、資料がなければ全く分からない事です。 2chが有用なのはこういう部分ですね。
ちゃんとした証拠もあります。 Monaのロジック部分が本質的に成り始めてから、higeponさんがつまづいた時、 突破口となるヒントや修正箇所を提示できたのは、ほとんどの場合、 超先生と、私のみでした。 ここから得られる教訓は、私が質問しても答えられるのは、多くの場合、 超先生しかいないであろう、ということですね。 つまり、私にとっては、2chで質問しても、ロジカルな部分やアルゴリズム的な 部分に関しては、ほとんどの場合、意味がないと予想されてしまうのです。 さっきも言いましたけど、「UNIXの特定のコマンドの使い方」などの 情報は、2chでうまく手に入ると思います。
456もLもよー、どれくらいの期間で何が出来たとか、 簡単だの難しいだのとか子供みたいな争いはやめなさいってば。。 みんなでマターリしようぜ。
うんだ。2人ともつまらん口論はヤメロ マタ〜リ
別に問題解決の場というわけではないのになぁ たとえ無能に見えたとしても、自分の役に立たなくても マイナーな分野で自分と同じ方面に興味を持っている人がそれなりにいる ということが窺えるだけでも価値はあると思うが
あとはLスレでやれよ。
てか、もうL来なくていいよ
>>492 そう思われるんでしたら、今後一切、NWSOSに関する事も、私とすぐに分かる
ような表記(Lタン、LightCone)も、ここに書かないで下さい。
「NWSOSで出来ているから簡単にできるはず」なんて論調で語られる事が
多いのが非常にうっとうしいのです。
このスレを検索してみても 特に「NWSOSで出来ているから簡単にできるはず」なんて論調で語られている様子はないようですが? 本当に被害妄想じみてきていますよ
>>493 おいおい…ただでさえ春厨が好みそうな事言ってるのにまだ言うかね
「うっとうしい」事が分ったら進んでやると思うんだけどなー
邪魔する為に。
言いたい事は山ほどありますが皆さんのご指摘の通りつまらん口論で、続けるとスレが荒れるので止めておきます。 昨夜はちょっと酔っていた事もあり、無神経ですいませんでした。
なんか一連のやりとり見てるとやおいサークルのCP論争みたいだ
>>456 話のわかる人で良かったyo!
499からは、
「独自にOSを作っているまたは、作ろうとしている人たちのためのスレッド」
プシィー ; 、 、; , ; 、 、 '⌒`、lili,'⌒` (`γ') |lili| 冫/" ,..-ー―,lili,―-、 .. / ;;| /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ | ;;;;ヽ, /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;l / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ;;;;;;`ー';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(,,゚Д゚)l < そう、目クジラを立てるな `、_______,,,....つ--つ \___________ `ー‐---、,,,____ ,.,., ,.,,,ノ "'''''''''''し'''J
>>498 「独自にOSを作っている人たちを応援するスレッド」もな。
500ゲトー
やおい穴がどこにあるかでもめているのかね
ここは独自にOSを作っている人の作業をLたんが妨害するスレッドになりました。
'K'+1 タンもがむばれ。
基本的に評価は他人がするもので、自分がするものじゃない。 他人に評価させたくないなら自慢すんなよ。 誤解されるといけないが別にオプソにしろっつってんじゃないよ。 NDAって手もある。
いつまでもデフォルトの名無しさんにしておくと、 呼びにくいと思うので、これから、わたもちと名乗るので、よろしくです。 OS的な機能の実現に割り込みがほとんどは関係してくると思うので、 慎重に、割り込みを作りたいと考えています。 スタックの使用は下のように使用される。 | | |割り込み前の使用スタック↑ | |---------------------------| |EFLAG(4bytes) | |---------------------------| |CS(4bytes:下位2bytes使用) | |---------------------------| |EIP(4bytes) | |---------------------------| |ErrorCode(4byte) (*) | |---------------------------| |割り込み後の使用スタック↓ | | | (*)エラーコードをpushする例外としない例外がある。 あと EAX,EBX,ECX,EDX,ESI,EDI,EBP,DS,ES,SS,FS,GS (EFLAG、CS、EIP以外の一般レジスタです)は、 割り込み前の使用状態のままと考えていいでしょうか? 御教授ください。
あと、上のことが正しいとすると、 タスク切り替えを行う場合、割り込みハンドラをCPL=3のコードセグメントに配置させて、 そこで、タスクのスケジューリングを行い、次に実行するタスクへのCS EIP に、 スタック上の CS EIP を書き換えて、iret でマルチタスク実現というのを考えたのですが、 どうでしょう? 特権命令は、タスクゲートを使って、CPL=0にして特権命令を実行後、 元に戻るということにしようかなと思っています。 問題点等ご指摘ください。
>>508 当然、CS:EIP意外のレジスタの内容も切り替えなきゃいけないけど、
それらをコピーするよりはSS:ESP切り替えた方が簡単なので、漏れはそうしてまつ。
ひげぽんはどうやってたっけ?
荒らしうぜえよ。どっかいけ
>>509 そんなかんじです。
プロセス・スレッドはこれから実装しなおします。
先にレスされてしまいました。 Monaのソース読んでなかったのに今気づいた... sourceforge.jp が落ちてるみたいなので、手持ちのものを見てみると、 スタックから取り出して、現在のレジスタを保存、 次のプロセスの以前保存したレジスタをレジスタにロード 私が考えていたものとほとんど同じだ。 またいらない質問してしまったようです。すみません。 SS:ESP切り替えというとどういうものなんでしょう? 良ければ御教授ください。
pusha esp切り替え popa ということですかね。
やっぱりスタックに保存ということだったのですね。 コピーするよりSS:ESP切り替えとあったので、??と思っていました。 どうもありがとうございます。
>>509 いえいえ、こちらこそアセンブラなんて全然やったことがなかったもので、
アセンブラ使いでおられる方から見れば、
このぐらいですぐ気づくものだと思いますし。
Linux板の悪口がちょっとあったので(誰とは言わんが)。 あそこの板で上がっているスレは中傷通りの状況だけど、 アプリ開発者も結構いて、ドキュメントされていない質問には 丁寧な回答があったりするんだよね。 カーネルコアな人(らしい人)はあまり来ていないみたいだけど、 Linux板の話題の大半はLinuxカーネル以外の話だから仕方が無いです。 カーネルに興味がある人はYLUGのほうが盛んかな? # スレ違いかつ板違いスマソ。
前に実装したマルチタスクもどきを きちんと書き直して、カーネルスレッドを実現しようと 計画中です。 それにしてもわたもちさんは、進むのが早い(´ヘ`;)
あとはそろそろ気合を入れて メモリ管理をきちんと実装しないといけませんね。 ページングはなんとしても実現したいです。 ちょっとボリュームが大きいですが何とかやりたい。
いえいえ。遅いですよw 実際に作り始めるのに大分、時間かかりましたし。 まだ、割り込み部分に少し手をつけたくらいです。 ページングといえば、私はメモリ保護でも使おうと思っています。 PTE(ページテーブルエントリ)のU/S、R/Wビットを利用したものになる予定。 いつになるやら...
>ぽんたん CVSではないソース&バイナリってどこかにおいてあるんでしょうか?
大きく誤ってそうだったら突込みをお願いします。 thread#yieldは、ソフトウェア割り込みで カレントスレッドのコンテキストをセーブ後 runキューからはずして、どこか別のキュー(sleep?) でスケジューラー起動。 スケジューラーはそうすると yieldまたは、タイマ割り込みで起動でいけそう。 ソフトウェア割り込みでやるなら 呼び出し規約を定めて(レジスタに設定する値等)を システムコールのようにしたらいいのかな。 OSASKスレッドでシステムコールについて熱い議論があったけど そんなレベルには到底いけそうにないなあ。(しばらくの間)
>>524 runキューの末尾に移すようにすればいいんじゃない?
システムコールの実装方法の方は、余り気にすると煮詰まってしまうから
気にしすぎるのもまずいけど、一応OSASKすれには目を通しておくといいかもね。
>>524 OSASKスレの話は、システムコールの実装ということに関しては、
あんまり参考にならない様な気がする。
x86ならINT nで実装しないとCPL上げられないし。
>>526 特権レベルを上げるには、intとコールゲートの二種類あるんですが、
Windows/Linux/NWSOS のどれもがintらしいです。
コールゲートなら、スタック渡しの際に外側スタックから内側スタックへの
0〜31 DWORDの自動コピーできるメリットがあるのに、intが使われる理由は
なんなのでしょうか。
intは、命令長が短いのですが、それだけが利点でしょうか?
私なりの推測では、intの最大のメリットは、割り込み禁止可能なことです
(IDTが「割り込みゲート」になっているベクタ番号には、intは割り込み
禁止でハンドラに突入してくれます。)。
CALL GATEだと、外側レベルから内側レベルに変わった直後にどうやっても
割り込みENABLE期間が生じてしまいます。これは非常に大きな問題です。
OSを作っていくと、「全ての」レベル遷移時に割り込み禁止の状態で何かを
やっておきたいことはよくありますので。
>>525 こんにちは
>runキューの末尾に移すようにすればいいんじゃない?
そうですね。waitや、sleepはとりあえずなしで
実装してみるのが簡単そうですね。
>OSASKスレの話は、システムコールの実装ということに関しては、
>あんまり参考にならない様な気がする。
ちょっと私には難しすぎました(笑)
>>527 LightConeさん
>CALL GATEだと、外側レベルから内側レベルに変わった直後にどうやっても
>割り込みENABLE期間が生じてしまいます。これは非常に大きな問題です。
なるほどこれは知りませんでした。
確かに割り込まれた痛い処理というのは存在しますね。
勉強になります。
作ってみようスレッドを見て思ったのですが 画面への出力もシステムコールとしたほうがよさげですね。 ロック機構も考えないと。
>>530 LightConeさん
>個人的に難しく感じて、その後自分なりに解決したようなことを書いておきま
>したのでご覧下さい。まだ僅かですが、ご参考になれば幸いです。
すばらしいです。
私が将来つまづきそうなところが満載でした。
ブックマークさせていただきます。m(__)m
>>LightCone様 まだ、割り込みハンドラの実装で、エラー続出レベルの私には、 遠い話ですが、きっと役に立つと思います。 どうも、有難うございます。 C言語はやっぱり向いていないなぁと感じる今日この頃w Javaが懐かしい...(泣)
>>528 そうですね。waitや、sleepはとりあえずなしで
実装してみるのが簡単そうですね。
一般的には
run: 現在CPUを使用中
wait: 他のプロセスがCPUを使ってるので自分の番まで待機中
sleep: ファイル入出力待ち・プロセス間通信待ちなどの外部イベント待ち
ってことなので、runとwaitは必須。
sleepは他のプロセスやFDD等の外部デバイスとの通信をしなきゃ不必要かも。
>>527 割り込み禁止にする必要があるかどうかはOSの設計次第です。
FreeBSDのシステムコールや例外はトラップゲートだし、
NoNameのシステムコールや例外もトラップゲートです。
反対にEseBTRONというOSではシステムコールや例外は割り込みゲートです。
この違いは割り込み処理をプロセスのコンテキストの延長と見るか、
独立したコンテキストとみるかの違いでしょう。
NWSOSの場合はどうして割り込みゲートを使っているのでしょうか?
実はL様はK氏より他人に親切かもしれない、と思ってみるテスト 厳しいお言葉もライオンが子供を谷に突き落とすようなものかも...
>>535 >NWSOSの場合はどうして割り込みゲートを使っているのでしょうか?
IA32は、もともとの設計では、内側レベルを呼び出して、外側レベルへ戻って
くることしかサポートされていません。ひとまず、この呼び出し方向を
「順方向」と呼ぶことにします。
NWSOSでは、「逆方向」の呼び出しもサポートしています。
IA32では、TSSにある各レベルのスタックポインタが遷移時に自動的に変更
される事は有りませんので、逆方向に呼び出してまだ帰ってこない間に、
別のシステムコールを呼び出すと、レベル0のスタックが上書きされてしま
います。
これを避けるためには、レベル遷移時する時は必ずTSSにあるスタックポインタ
を調整する必要があります。
その間、どうしても割り込みを禁止する必要があると思います。
「割り込み禁止」というと、リアルタイム制を損なう感じがするかもしれま
せんが、レベル遷移時にはもともと僅かではありますが、CPU内部で割り込み
禁止期間がありますので、その延長と考えれば、その期間が少し長くなった
と考えることが出来ます。
なるほど「逆方向」の呼び出しですか。 面白そうですね。非常にためになるお話でした。 よろしければ「逆方向」の呼び出しがOSの中でどういう風に 使われているかもついでに教えていただけませんでしょうか。 NWSOSのページの情報からデバドラはDPL1で動くみたいなので、 カーネル(DPL0)からデバドラを呼び出す時に使ったりするので はないかと推測しているのですが。
>>446 plane pixel方式のノウハウなんてのはDOS時代の古代の技術だから
今から覚えるよりとっととpacked pixelで進めるのは良い判断と思われ
しかしANDしてORみたいなplane pixelの古代の技術が
VESA & packed pixelモードで失われたかと思ったら
windows GDIで復活し、
DirectDraw & ColorKEYで再び失われたと思ったら
DirectDrawより自力描画のほうが速いよ!となって条件分岐より数ピクセルまとめてANDしてORが復活し
DirectX8(7だっけか?)で2Dでもポリゴン&アルファチャンネルだ!となって再び失われつつあるが
いつ復活するかわかったものでないので基本として押さえとくのはいいかも
>>539 さん
描画ライブラリの作成が簡単になるようにということで、
Packed Pixel形式が使える方を選択しましたが、こちらで良かったようで
一安心です。ありがとうございます。
Packed Pixel、Plane Pixel形式、世代交代が激しいようですね...
この方面もさっぱりわからないので、参考になります。
>>535 もれは例外と割り込みは別の概念だと思う
メグタソもPacked Pixel実装してみたらフォント描画が禿しく単純になったょぅ。。。
でしょ〜 プレーン方式を使ってた時は、私なんかちょっとした描画でも混乱してました。 タイマー、キーボード割り込み実装したので、簡易マルチタスク機能(というか、 ほとんどスレッド程度なんだけど...)をつけたらアップする予定です。
と思ったけどメグタソのフォント描画は事前処理がいろいろあるから複雑に見えるだけで 描画ループはパックトの方が複雑かもしれん・・・ Packed PixelはBitBltで真価を発揮しそうやね
1byteで、8ドットというのが、慣れてないためか混乱してしまいます。 今まで、Packed形式しか使ったことが無かったもので... >Packed PixelはBitBltで真価を発揮しそうやね ですね。 レスが大阪弁ですけど、大阪人ですか?w
お嬢は無国籍DAYOヽ(`ー´)ノ
宇宙人?とか言ってみるテスト
前々から思っていたのだが、ディスク上にファイルシステム構築するのではなくて、 今では256MB〜あるメモリ上にファイルシステムをエミュレートできないのかな? でも、作成したファイルなどは再起動したら消失してしまうだろうが。。。 検討はずれのこといってたらごめんなさい。
>>549 RAMDISKって聞いたことあります。
やっぱり、二次記憶のディスクより、相当高速アクセスできるんですよね・・?
>>548 さん
いえ、私はそういう方向で行こうかな〜と思っています。
やっぱり新しいハードディスクはなかなか用意できないということで、
すべてフロッピーディスクで済むようにと考えています。
保存したければ、終了時にフロッピーに書き込みでもいいかなと思います。
>>548 unix系だとmfsってよばれててインストーラなどで使われてることが多い。
作っておくと後で役に立つ可能性も高いので、最初に実装するのもいいかもね。
>>551 最近ではネットワークも拡大・高速化してますので、
たとえ、1FDのOSであっても、RAMDISKを使えば、ネットから数十MB
の動画ファイルをダウンロードして観ることも可能になりますね。
(ネットワーク対応、大容量RAMが必須になりますが。)
結構魅力的かも。。。
そういえば、RAMDISKでもFATとかいうのかなぁ。。。
mfs=メモリーファイルシステムでしたか。。。 UNIX系では/tmpとかに使われてるみたいです。
実装方法はまだ全然考えていません。 その頃になれば、色々調べて実装したいと思います。 >たとえ、1FDのOSであっても、RAMDISKを使えば、ネットから数十MB >の動画ファイルをダウンロードして観ることも可能になりますね。 夢を膨らませてもらうのは、非常に嬉しいのですが、 あまり期待しすぎないでくださいw
packed時代のplaneテクその2 planeだと8ドット単位の処理が基本になる。それ以外だと両端と中央の処理を分けたり、シフトしたりと「複雑」になる。 packedだと1pixelに1回でアクセスできて楽、かというと、速度を考えると話はそこで終わらない。 例えば8bit/pixelで考える。フツーならbyte*で処理するところだ。 これを例えば32bit/4pixelと考えてuint32*(適宜読み替え)で処理する。 そーするとplaneと同じく複雑になるが、メモリアクセスが1/4になる。キャッシュしない(メモリアクセスの遅い)VRAMにおいては、この差は大きい。 トータルでは4倍-「複雑な処理部分」の速度だ. 全ての描画命令に「複雑な処理」をつけるのはウザいが、blitやfillなど多用されるものにつければ効果は大きい。 #OSカーネルの話と激しくズレてるが
>>556 さん
御教授ありがとうございます。
>OSカーネルの話と激しくズレてるが
気にしないでください。
実は、Graphics_cls でその手は使っています。
最初は、素直に byte* へキャストしていたのですが、
強引に unsigned int* へキャストしてみたら、
問題なく動いたので、Java等を使っていた私にしたら、
こんなのありですか...な感じでしたw
仮想ページに割り当てるための物理ページが足りなくなった場合にページアウト すべき物理ページを選択するアルゴリズムについて悩んでいます。 基本的に、LRU方式, ワーキングセット方式, FINUFO方式があるようですが、 FINUFO方式が選択が一番高速になると思います。 しかし、この中で一番理想的なのはワーキングセット方式なのですが、 「ワーキングセット」を高速に求めるアルゴリズムが存在するのかどうか 分かりません。 どなたかアドバイスできる方いらっしゃれば、是非教えてください。
簡易カーネルスレッド実装とともに システムコール実装テストをしようと目論んでいます。 システムコール呼出し手順はこんな感じで考えています。 ■ユーザーモード想定 (1)システムコール用構造体に引数を設定 (2)(1)の構造体へのポインタをレジスタにセーブ (3)int ■ここからカーネルモード想定 (4)レジスタから構造体へのポインタを取得(必要であればカーネルからアクセス可能なように変換) (5)引数妥当性検討(今回はここは軽め?) (6)処理実行 (7)必要であればリスケジューリング システムコール自体はシステムコール構造体で管理しようと思っています。 引数の数・前処理・後処理・システムコール実体など。。。
>>559 引数がレジスタで渡せるうちはレジスタで渡したほうがいいんじゃないかな
将来的に仮想メモリをサポートして、(2)と(3)の間にtask switchがおきて(1)がswap outしたとすると、
(5)の前にswap inする必要がある。少なくともチェックは必要。
まあイマドキのCPUなら無視できる負荷かもしれんけど
>>558 ちょいと調べてみたんだが「ワーキングセット方式」つーのは
突き詰めると実装はLRU(またはその近似)と同じ、という気がする
>>562 言葉の遊びみたいになってしまいますが、「OS論」と呼ばれる学問では、
「LRU方式」と「ワーキングセット方式」とは、一応区別されていて、
いずれも、「最も最後にアクセスされたページをページアウトの候補」
とすると言う点は同じなんですが、前者は記録に用いられる時間が
「システム共通時間」なのに対し、後者では「タスクローカルな時間」
である点と、ワーキングセットアルゴリズムの場合、最近の
「利用頻度(N回分の調査記録を利用)」も考慮されるが異なって
います。
なお、「システム共通時間」で測定する場合、タスクの「活動度」が低いと
メモリアクセスがほとんどされていないように見えてしまうので、不公平に
ページアウト対象になりやすくなってしまうのではないでしょうか。
逆に、「タスクローカルな時間」で考慮されるならば、活動度が低くても
「活動している時間に対するそのページにアクセスした時間比率」が
中心的な役割を持ってくるため、そういう問題が起こりにくくなると
考えられます。
>>562 ワーキングセットの推定をするには将来の処理の動きを読まなきゃいけないけど、
それをするには処理終了までのシュミレーションをしなきゃならないけど、
それは計算機にさせるべき処理そのものなので、それが完了した時点でワーキングセットの
推定は無意味になるので、原理的に無理。
つまり、計算量の問題ではない。
ってことで、現実的な解法として過去の挙動からワーキングセットを推定する方法が
いくつか提案されているけど、その一つがLRU方式。
って、説教たれてる割には、LRU方式の効率的な実装方法がわからなくて悩み中。
処理時間、メモリ使用量、LRUの厳密さ、これらの三つのトレードオフを巧く処理できない。
今考えている話は、仮想記憶における、「置換アルゴリズム」と言われる ものですが、日本のOS研究では、ネットや本で軽く見る限りですが、 「なるべく最適な廃棄ページを見つけるアルゴリズム」、に対して関心 が行っているようです。 しかし、物理メモリが大量に搭載された現状で、実際にOSを作る際には、 「如何に高速にページの使用統計を取るか」の方が重要の様に思います。 例えばの話、IA32のOSでは、タイムスライスのために、10(ms)程度の 周期のタイマー割り込みを使います。このタイマー割り込み内でページの アクセス統計を取ると考えてみると、256MB の物理メモリを一杯に使った 状態では、厳密な統計を取るなら、最悪、256MB/4KB = 65536 ページ分 ものページエントリーの調査が必要になります。 つまり、秒間100回も 65536 回の forループ処理をバックグラウンドで 行わなくては成らなくなるということです。 しかも、同じCPUに、メモリを多く詰めば益々自体は悪化する傾向が あります(なんとかしなければ。)。
>>564 >ワーキングセットの推定をするには将来の処理の動きを読まなきゃいけないけど、
>それをするには処理終了までのシュミレーションをしなきゃならないけど、
>それは計算機にさせるべき処理そのものなので、それが完了した時点でワーキングセットの
>推定は無意味になるので、原理的に無理。
言葉のあやになってしまうのですが、一応、ワーキングセットの厳密な意味は、
t0 <= t < t0 + τ
の間にアクセスされたページの集合と言う意味で、それ自体の計算は可能です。
むしろ、IA32では、厳密な LRU の方が無理です。統計処理を行う時間間隔で
曖昧さが出ます。つまり、10(ms)毎に統計を取るならば、10(ms)の誤差が
出ると言う事です。
おっしゃりたいのは、「OPTアルゴリズム」の方ではないでしょうか。そちらは、
絶対に実現不可能です。証明は簡単です。未来にいくつかの可能性がある場合、
現時点で最適な選択を行う事は絶対に無理だからです。
速度を度外視した場合の厳密なワーキングセットの具体的な計算法を書いて おきます。 まず、タイマー割り込み内で、物理ページが割り付けられているページエントリ のアクセスビットを調査します。調査が済むと0にします。 そして、各ページエントリに対応して例えば1BYTEの統計情報を対応させます。 IA32では、ページエントリにはそれだけの余地がないので、別の場所に 入れます。今、k 番目のエントリのアクセスビットを参照し、accessだと すると、 page_entry[k]->m_bit <<= 1; page_enetr[k]->m_bit |= access; とします。 これで、m_bit の 1 のビットの数が、直前の 80(ms)の間のページ k の アクセス頻度になります。 このアクセス頻度が一番小さいページをページアウトするというわけです。 しかし、この処理は、256MBの物理メモリだと、最悪、秒間 100 * 65536 回の 繰り返し処理が必要になると思います。
>>567 >page_entry[k]->m_bit <<= 1;
>page_enetr[k]->m_bit |= access;
それくらいの機能はCPU(MMU)に積んどけってことか。
物理メモリーを、256 MB も(?)積んでいる機種のCPUは、恐らく 1GHzは あると考えるのが妥当だという前提に立つと、1エントリの調査に x クロック 必要だとすると、 x * (100*65536)/(1024*1024*1024) = 0.006 x これが、この処理が必要とする時間の全CPUパワーに対する比率になります。 x = 10 として、6%。 IA32だと、ページテーブルエントリのアクセスビットだけでなく、 ページディレクトリ・エントリのアクセスビットもあるので、そちらで 普段は「カリング」できるので、このアルゴリズムでも余り問題ないの でしょうか?? しかし、FLATモデルだと、複数のページディレクトリがあるので、そんな ことで済まないような気も。
>>568 MMUつーか、メモリに載せなきゃいけない罠。
メモリ全体にこんな機能つけけるのは無駄極まりないけど、
ページテーブル専用の特殊メモリをつけるってのもありかな?
といってみたけど、プロセス数がその特殊メモリの容量に制約受けそうで嫌だな。
L氏へ > しかし、物理メモリが大量に搭載された現状で、実際にOSを作る際には、 >「如何に高速にページの使用統計を取るか」の方が重要の様に思います。 そのとおりです。僕はこれについてうまい方法を既に考えています。僕の方法 では、非常に効率的に使用統計が取れます。もし興味があればOSASKスレッドで 、「OSASKのLRU管理アルゴリズムについて説明してほしい」と書いてください。 L氏が興味を持たなくても、他のどなたかが興味を持たれれば、その方が書き込 んでくださってもかまいません。 特徴をかいつまんで説明すると、僕の方法では、タイムスライスごとの定期的 な調査が不要です。それでも十分に詳しい(むしろ定期的検査よりも詳しい)使用 統計が取れます。もっというと、PTEのアクセスビットやダーティビットを参照 する必要すらありません。
573 :
デフォルトの名無しさん :03/03/04 11:54
>>559 開発段階においても、(5)は重要。デバッグが楽になると思う。
システムコール用構造体を使うと、アドレス計算の分だけ処理が遅くなる思う。
しかし、誤差の範囲と言えるかも。
ただ、ユーザスレッドや非同期IOなどの実装が楽になるかもしれない。
>>560 の言ってる事が起こり得るから、システムコール用構造体はswap禁止とかも有り。
しかし、システムコール用構造体が増えすぎると結局swapが必要になりますね。
やっと、わかりそうな内容になってきた感じなので素人考えを初書き込み。
>>571 漏れが勘違いしてる可能性大だが、
>といってみたけど、プロセス数がその特殊メモリの容量に制約受けそうで嫌だな。
統計を残したいのは、物理メモリに読み込まれてるページへのアクセス有無だから、
プロセス数はあまり関係ないと思う。
単一のプロセスが乗っかってる・使ってるページをいつもまとめてページイン・アウト
するわけじゃないから。
>>569 >普段は「カリング」できるので、このアルゴリズムでも余り問題ないの
ページが4KB単位であること自体が一種の「カリング」なんだろうよ。
256MBもの物理メモリを4KB単位1枚ずつでちまちま管理してたらだめだめだー、ってことかなぁ。
>>576 >ページが4KB単位であること自体が一種の「カリング」なんだろうよ。
まあ、そうなんですが、IA32では、最低でも二段階のページ機構が
あり、4KBのページを1024個集まったものをページテーブルと言い、
1024個のページテーブルへのポインタを集めたものをページディレクトリ
と言います。一つの項目の事をエントリと言い、エントリが集まったものを
テーブルと読んでいます。
ページディレクトリには、1024個のページテーブルへのポインタが格納
されているのですが、NULL に相当するポインタを書くことが出来て、
そこに対応するページテーブルが存在しない事を意味する事が出来います。
あるページ P にアクセスがあると、該当するページテーブルの中の
該当するエントリの A ビットが1にセットされます。もし書きこみ
アクセスだと、D ビットも1にセットされます。CPUが勝手に0にリセット
することはなく、0にしたいときは、ソフト的に行います。
今説明したのは、ページテーブルのエントリのことですが、実は、
対応するページディレクトリのエントリにも、A ビットがあり、そこも
同時に 1 にセットされるということです。
ですので、ページテーブルのAビットを参照する前に、
ページディレクトリエントリのAビットで大まかに調査を省くことが
できるというわけです。#569では、これを「カリング」と表現したわけです。
なお、ページ・ディレクトリ・エントリを、PDE、ページ・テーブル・エントリを PTEと呼びます。 IA32の初代ではこのように「二段階」のページ機構を持っていたのですが、 最新のIA32系のCPUでは、三段階にすることも出来ます。 また、ページのサイズをもっと大きくする事(たしか、4MBと2MB)が出来ます。 なお、メインフレーム用のCPUでは、A BIT, D BIT 相当のBITだけではなく、 「アクセス時間」などの統計情報も PTE にCPUが書き込んでくれるものが あるそうです。
>>572 もしかして、既に実ページが割り当てられているページを、
アクセスした瞬間にページ例外ハンドラに通知させるために、
P BIT = 0 にしますか?
それとも、「最もページアウトするべきぺージ」を探すのを諦め、
とにかく、以前調査した時に A = 0 にしておいて、今回の
調査で、A = 1 になっているページを、リング状に探しますか?
ちなみに、これは、FINUFO(First In Not Used First Out)
アルゴリズムというそうで、Linux 2.2で使われていたようです
(Linux 2.4 では良く知りません。)。
>>578 わかりやすい説明サンクス。
> なお、メインフレーム用のCPUでは、A BIT, D BIT 相当のBITだけではなく、
>「アクセス時間」などの統計情報も PTE にCPUが書き込んでくれるものが
>あるそうです。
物理メモリよりも大きい仮想メモリを基準に据えれば、そうすべきなのかもな。
CPU設計はOS設計と切り離しちゃだめだと再認識。(←だからなんだよ)
ところで、Lタソは、ページングアルゴリズムの実装の工夫で何を解決しようとしてる?
・スラッシングの防止(必要メモリが物理メモリを超えた途端ダサー)
・トータルパフォーマンスの向上(曖昧だな)
それとも、単に、
・最低限のページングアルゴリズムを実装した時のパフォーマンスダウンを抑止
したいだけ?ワーキングセットが理想的なのに、それを実装すると、理想に反して
パフォーマンスが落ちるのに耐えられないのか。
OSがどのように使われるかで最適(と思われる)ページングアルゴリズムは
異なるよな。
例:
・RTOS→ページングはハードリアルタイム性を失う原因となるので法度
・サーバOS→多数のプロセスが間欠的に動作。トータルで必要なメモリ大
・ビジネス用途→フォアグラウンドのプロセスを快適に動作
・マルチメディア→RTOSほどでないにしろソフトリアルタイム性を実現
学問的には、どんなサイズでいくつくらいのメモリの塊が必要かの分布の分析に
なるだろうが、味気ないので誤解をおそれず上記のように書いてみた。
こいつらのトレードオフの重心をどこに置く?それともダイナミックに対応したいのかな。
>>580 「ダイナミック対応」...おもろいかも
プロセスごとに変えるといいかも。
最初はリアルタイム用のモードで動かして、必要ないようだったらページングをはじめるとか。
>>581 >最初はリアルタイム用のモードで動かして、必要ないようだったらページングをはじめるとか。
マルチメディア的なリアルタイム(せいぜいソフトリアルタイム)なら、可能。
ハードリアルタイムは難しいというか無理ぽ。
OSASKのちょっと一言ページを見ました。 実は#279でも書いていた通り(ちょっと一言ページでも私が気付いている 事には触れられていましたが)、本当は、実ページを割り振っている ページに対し、アクセス統計(+書きこみフラグ)を取る目的だけのために 存在ビット(P)を0にすると言うアイデアは、置換アルゴリズムについて考え 始めた当初から気付いていました。 ただし、私のアイデアは、ワーキングセットアルゴリズムでの、 W(t0,τ)を厳密に高速に求めることができるような方法です。 例えば、W(t0,τ)を、10ms に一回調べたいならば、10ms周期で発生 させるタイマー割り込みの中で、調査対象のページのPを全て0にします。 ただし、このアルゴリズムでは、P=1のページはリストに保持できるので、 そのリストを利用してP=1のページだけをP=0にして、もともとP=0だった ページを初期化するための時間は必要は有りません。 このようにすると、ページにアクセスされると必ずページ例外が発生します ので、例外が起きたページをリストに加え、同時に、P=1にしておきます。 すると、次のタイマー割り込みまでには、10msの間にアクセスされた ページのリストが出来上がります。 このリストの過去N回分から、10N (ms)分のワーキングセットを求める のは容易です。 ただし、速度が少し心配なのと、コピー・オン・ライトや、 オン・デマンド・ページング、プリ・ページングなどと合わさった時の 事情を考慮しなくてはならない部分がちょっと心配です。
>>583 なるほど。
AとかDのフラグをチェックしてアクセス/書き込みがあったかどうかを調べると、
コストがかかる
->アクセス/書き込みが起こったときに例外を起こさせて(しかも1周期に1回だけ)
A,Dフラグをチェックするコストを節約するわけだな。
で、ページ例外のコストはどれくらい?
少しだけですが、今着目しているアルゴリズムを使う場合のページテーブル の様子を細かく見てみます。 P=0 のページには、最低でも次のような種類があることになります (まだ他にもあるかもしれません。)。 1. 予約されていない不法なページ(このときは、例外報告後、タスクを終了) 2. ディスクにページアウトされているページ 3. アクセス統計を取るためにP=0にされているだけで、本当は実ページが が割り振られているページ 4. オン・デマンド・ページングのために予約されているページ。 しかし、3の状態のページは、P=1にしたら、即座にPTEとして利用出来る ことが好ましいため、上記の4つの状態を区別するビットは、"AVL"の 3BITに置く事になると思います。ただし、1BITだけあれば、3の状態 であるかどうかだけは十分判別できますので、AVLは1BITだけ利用すれば 十分で、他の三つの状態のときは、PビットとこのAVLの1BIT以外の残り 30BITは、全て「ソフトウェアで利用可能」ですので、それを 利用すれば十分区別できます(ただし、2の状態のときのディスク上の ページアウト装置番号とスロット番号を保持できる予知は必要ですが、 残り29BITが利用出来ます。)。 良く考えてませんが、初期化されないメモリを確保した時には、 オン・デマンド・ページングの状態にするのが良いかもしれません。
>>585 >で、ページ例外のコストはどれくらい?
物理ページが足りなくなる事自体、頻度は余り多くありませんので、
そのためだけに普段から統計を取る重たい処理を行い続ける方針
が正しいかどうかです。
ようするに、ほとんど起こらない事のために、普段から無駄に準備を続けている
ということです。
正確なLRUアルゴリズムや、ワーキングセットアルゴリズムを行うためには、
ハードウェアからの支援が必要だと諦めてしまう方が得策かもしれません。
IA32では、FINUFO アルゴリズムでいいのかも。
>引数がレジスタで渡せるうちはレジスタで渡したほうがいいんじゃないかな >将来的に仮想メモリをサポートして、(2)と(3)の間にtask switchがおきて(1)がswap outしたとすると、 >(5)の前にswap inする必要がある。少なくともチェックは必要。 >まあイマドキのCPUなら無視できる負荷かもしれんけど システムコール実装の経験がないので どちらが良いのかわからないのですが 例えばシステムコールに文字列を渡すときはレジスタ経由でも 結局は構造体のようなものを介さなければいけないですよね。 迷います。 開発段階においても、(5)は重要。デバッグが楽になると思う。 >> 574 >システムコール用構造体を使うと、アドレス計算の分だけ処理が遅くなる思う。 >しかし、誤差の範囲と言えるかも。 >ただ、ユーザスレッドや非同期IOなどの実装が楽になるかもしれない。 そうですね、システムコール用構造体を使用するメリットは大いにありますよね。 ありがとうございます。
>>587 >ようするに、ほとんど起こらない事のために、普段から無駄に準備を続けている
>ということです。
linux2.2のカーネルについてのリンク
>>570 を見ただけだが・・・
メモリの用途=ヒープか、コードか、マップトファイルか、などによって、
どうでも良いメモリは(物理メモリが空いてても)積極的にページングされてもいいと
思うのだが。
そうでなくても、
>>569 で検討した数値
> x = 10 として、6%。
よりもコストを節約できるなら、「やってみる価値」はあると思う。
他との絡みもあるからそれを今決めるのは大変だろうな。
これはつまらない提案だが、ページングとか、タスクスイッチのアルゴリズムは
簡単なシミュレーションモデルで実装前に検証した方が良くないか?
研究論文関係だとシミュレーションの結果だけ、というのも多いんだろ?(←想像)
後で手戻りできなくて、後悔しつづけるより、今のうちにちょっと苦労して
シミュしておくのは、悪くないと思わない?
パラメトリックなモデルにしておけば、
・メモリ速度
・(ページアウト先の)HDD速度
・物理メモリサイズ
・プロセス数と使用メモリのサイズ
などの影響もある程度(=傾向)見積もれて、動作報告との照合が可能になるだろう。
あんまり凝るとかえって手数がかかって意味ないが。
「ランダム・アルゴリズム」がCPU内部のキャッシュアウトに使われた ことがあるそうです。 そんなものでも、それなりの性能は得られる、と書いてありました。 しかし、そもそも、ディスクにスワップアウトした時点で、余り性能なんて 期待しないですよね? 運悪くスラッシングがおきても、ランダムに ページアウトしていれば、そのうち最悪の事態は回避されると思いません か? 故意にやろうとするほど、余計に自体が悪くなる事ってありますよね。 ひげを剃る時、鏡を見ながら剃るより、適当に剃った方がうまく行くと 聞いた事もあります(笑)。
LightConeは、自分が躁鬱のような状態であるということの気づいて いるんでしょうか。 本人以外はこのスレを読めば分かるけどね。
何回も連続してスラッシングが起きるようなときって、ページ単位で 置換する限り、どんなページをページ・アウトしても大抵駄目なんじゃない かなあ、と思いますね。なぜって、そういう時は、実ページが割り当てられ ているページ全体をまんべんなくアクセスしてるかもしれないからです。 そんなときは、どれか犠牲となる(?)タスク全体をディスクに 吐き出してしまうしか方法がないように思いますね。 今考えている方法は、どうも、実際にやるのを躊躇してしまいます。 だって、メモリを一杯積んで、絶対スワップファイルが必要ないとき も、(不在)ページ例外だけは日常的に起きるなんて、話が変だと 思いませんか?
躁だね。
最新版アップしました〜
何が追加されたのか書いてほすぃ
ReadMeのコピーですけど... プロテクトモードでの実行 Packed Pixel形式での描画 文字出力用メソッド等、少数の描画用メソッド 簡易スレッドの作成、実行、停止 (メモリ保護を実装してプロセスにする予定なので、名前はProcessになっています) イベントシステムの簡易実装 (キーイベントのみ手抜きで作ってみました) こんな感じのことが実装されました。
>>592 > だって、メモリを一杯積んで、絶対スワップファイルが必要ないとき
>も、(不在)ページ例外だけは日常的に起きるなんて、話が変だと
>思いませんか?
確かに変だけど、
・理想的なアルゴリズムを実現するには
・IA32ではハードの支援が足りなくて
・コスト節約のためにわざと例外を起こす
ということなら現実解としては成り立つじゃないか。
理想的なCPU、理想的なOS、理想的なアプリが現実から乖離しているからこそ、
各種パフォーマンスのトレードオフを実装技術で調整するんだろ。
それを逆手に取った使い方とかアプリに対してはそりゃ無力だろうが。
環境やアプリをしぼればしぼるほど、実装技術はいらんだろうよ。
大型コンや、RTOSみたいにな。Lタンはそれで満足か。
>>599 ふーん、かなりイタいね、K,L両氏とも。
日本にはこんなヤシらしかいないのか、と思うとかなり
ショボーン・・・。ソフト分野でアメ公追い越すのはだいぶ
先の話だな・・・。それとも現在においてOS制作ってーのは
趣味の領域にすぎないことの現れなのか・・・。
歴史上、偉人や天才と言った人はみなどこかキレてる。
Win32は基本的には64KB単位で処理しているらしいね GetSystemInfo APIで得られる値なので真偽は不明だけど 16ページまとめることでどの程度性能向上するかは不明だが 少なくとも必要なワークエリアサイズは抑えられるということかな
>>602 は間違い
今調べたら普通に4KB単位だった
今考察中の置換アルゴリズムえで測定周期をT、ページ例外の単位時間あたりの 平均発生頻度をz(T)とすると、ほぼ、 z(T) = (1/T)*h(T) h(T) = (時間Tの間にアクセスされる仮想ページの平均枚数) になると思います。また、メモリ・アクセスに局在性が全く無いときに、 h(T)の上限が決まるだろうと予想されるので、恐らく、 h(T) <= (T/T0) * h(T0) に近い関係式が成り立つと思います。すると、 z(T) <= h(T0) / T0 という式になり、z(T)は、Tによらない右辺の様な式により大まかな上限が 決まることになると思います。z(T)は、”単位時間”あたりなので当然の 結果です。 T0はなんでもいいので、T0=1とすると、 z(T) <= h(1) = (単位時間あたりのアクセスされる仮想ページの平均枚数) という結果が出ます(ある意味、当然の結果ですね。)。
[続き] つまり、ページ例外の秒間発生回数は、秒間ページアクセス頻度以下になる ということで、メモリアクセスの局在性があれば、それより少なくなるとい うことになります。 今考えているのは、「物理メモリが不足した時にページアウトするページを 選ぶ方法」です。256MBの物理メモリを積んでいて不足する状況を考えると、 行列計算などでは、ほぼ物理メモリ全域をアクセスすると考えられるので、 256MB / 4KB = 64K枚のページにアクセスする可能性が高く、ページ例外 発生頻度は、秒間、最悪で65536回になると思います。 逆に、テキストエディタなどでは、メモリアクセスの局在性が強いので、秒間 数枚程度になると思います。 つまり、アプリケーションの種類によって例外発生頻度の変動が大きくなると 思います。
もしかしてラージページって知らない?
実は、上の議論では、T>=T0と言う条件があって、本当は、 T1 < T < T2 に対し、 h(T2)/T2 <= h(T)/T <= h(T1)/T1 になると思います。定義:z(T)≡h(T)/Tにより、 z(T2) <= z(T) <= z(T1) つまり、平均的な秒間例外発生頻度は、測定周期が大きいほど小さくなると いう、これまた当然の結果が得られます。
コンピュータって自然科学を扱うより遙かに簡単だね。
>>585 >>604 >>605 >>607 ページ例外の頻度(コスト)は定性的にしか取り扱えないから、躊躇しとるわけやね。
一方、統計情報の収集を素直に実装した場合のコストは定量的に求まる。
統計が嫌いなら、そもそも比較すべきでないな。
しかし敢えて指摘すると、仮想メモリ機構自体が「アクセスの局在性」に依存してるよな。
キャッシュの類も同じだ。
つまり、
>行列計算などでは、ほぼ物理メモリ全域をアクセスすると考えられるので、
という前提は、仮想メモリ機構を利用する根拠を台無しにする。
いくら統計が嫌いでも、
「ある頻度で、巨大行列計算が発生すると・・・」と捉えなければ意味が無い。
アプリのモデル化だ。仮定したモデルに近い状態でのみ想定したパフォがでるだろう。
想定外ではちゃんと動かないだろう。それは「いじわるテスト」だ。
ある程度の「いじわるな状況」でもかろうじて動作しつづける必要はあるだろう。
堅牢性や信頼性と呼ばれるかもしれない。
もともと足りない物理メモリ量をパフォの低下というコストを支払ってで実現するのが
仮想メモリなんだろ。実装技術で補えるのは、せいぜい低下するパフォをできるだけ抑えることだけだ。
いくら工夫しても、巨大行列演算は物理メモリ量に依存する。演算のアルゴリズムを変えて、
メモリ使用量を減らした方がよほど性能向上が期待できる。
>もともと足りない物理メモリ量をパフォの低下というコストを支払ってで実現するのが おっと、これは単一プロセスを仮定してたな。 多数のプロセスを動かすためにも仮想メモリは必要ダナ。 もっとも、その場合は「タスクスケジューラ」と総合的にパフォを決められるよな。 物理メモリが足りないことを、この2つの場合で分けて考えてるよな。
>>そうですね、システムコール用構造体を使用するメリットは大いにありますよね。 それを突き詰めると「メッセージング機構」になるんだと思われ
>>611 さん
>>>そうですね、システムコール用構造体を使用するメリットは大いにありますよね。
>
>それを突き詰めると「メッセージング機構」になるんだと思われ
なるほど。
ここで言うメッセージ機構というのはシステムコール(または別のサービス)
をメッセージという抽象化された方法でサーバ(OS)に要求するということですよね。
システムコールをメッセージ機構で実装した場合、どのような実装例があるのでしょうか。
マイクロカーネルへとつながるところでもあるので興味があります。
私も、そろそろ簡易スレッドを実装したので、カーネルモードと ユーザーモードの分離のため、システムコールを実装してゆきます。 データの渡し方には、レジスタ渡しと構造体渡しがあり、利点、欠点など、 丁寧な解説ありがたく参考にしています。 さまざまな OS のファンクションコール方法 Windows NT int 2eh eax にファンクション番号 FreeBSD int 80h eax にファンクション番号。パラメータはスタック。 Linux int 80h eax にファンクション番号。パラメータはレジスタ。 らしいです。
>Windows NT int 2eh eax にファンクション番号
>FreeBSD int 80h eax にファンクション番号。パラメータはスタック。
>Linux int 80h eax にファンクション番号。パラメータはレジスタ
おお。すばらしいです。
WindowsNTのシステムコールは引数渡しはどうやっているんでしょう。
>
>>612 >QNX
なるほど、たしかにQNXはマイクロカーネルでメッセージを
使用していましたね。
x86での具体的な実装方法を解説したものを探すか、
ソースをみるって感じですかね。
解説はあまり期待できないかも・・・
Windows NT は記述がありませんでした...(^^;
>>618 そいつらの議論は、実装以前だ。放置の方向で。
アドレス空間としてシステム共有空間とプロセス固有空間を持ち、ユーザープロ セスのコードやデータは全てプロセス固有空間内に格納され、他のプロセスから は完全に不可視な状態になります。 今、アプリケーションが、write(fdsc, buf, size); でファイルへ書きこみを行 った場合を想定します。 bufは、アプリケーションの固有空間にありますので、FSPからは直接は見えま せん。しかし、FSPは、bufのデータを読み込む必要がありますので、カーネルの ページング・サービスを用いて自分のアドレス空間に覗き窓を作ってbufの内容 を覗くか、または、単純にアプリのプロセスにいる間に共有空間にコピーした ものを参照する必要があるでしょう。速度面から前者を用いる事になるでしょ うが、そもそも、FSのアドレス空間がアプリケーションと分離されていなけれ ばこんなことは必要なく、直接見ることが出来ます。 つまり、もし、FSをモノリシック方式で書いていれば、覗き窓もコピーも 必要ないのです。FSは、いくつかのプロセスで同時に実行され、それぞれの アドレス空間で、直接データをやり取り出来ます。
なお、IA32では、モノリシック方式でもカーネルをFSから保護することは 可能です。やり方は簡単で、FSの特権レベルをカーネルより低くすればいい だけです(タスク(プロセス)と特権レベルとが、独立した概念としてあり ますので)。 また、「プロセス」の特徴として、定期的に実行に移される特徴がありますが、 FSでは、キャッシュの遅延書きこみなどに少し便利そうではありますが、それだけ のためには、少し「大げさ」過ぎるようにも思えます。
>>621 の冒頭に挿入(スマソ)
Linusもマイクロカーネルに懐疑的だそうですが、実は私も懐疑的で、
OSのサブシステムからカーネルを保護するだけなら、IA32では他の方法も
あるのではないかと思っています(懐疑的なだけで、絶対意味が無いとか
そういう意味ではありませんが。)。
最初に断っておきますが、QNXの資料にも明言されている通り、マイクロカー
ネルはカーネルが小さい事を意味するのではなく、OSの各種サブシステムを
一般プロセスとほぼ等価な形態で構成する方法を言います。
OSのサブシステムの代表であるファイルシステム(以下FS)をこのような一般
プロセスとして記述した場合を考えましょう。以下、FSのプロセスをFSPと言い
ます。
現代的なOSでは(Windows/Linux/QNXも)、特殊例を除き、個々のプロセスは、
私が考えるマイクロカーネルの最大の利点は、サブシステムが壊れた時に、 アプリを巻き添えにしなくていい、と言う点です。 モノリシックの場合、サブシステムが壊れると、そのサブシステムを呼び 出していた全てのアプリも同時にダウンすると思います。 しかも、あるアプリが原因となってサブシステムが壊れた場合にも、 そのサブシステムを「同時に」利用していた別のアプリもダウンしてしまう ことに成ると思います。 例えば、マイクロカーネルでは、FSがダウンしても、FSを呼び出していた アプリは、read()や、write()が異常終了するだけで済むと思います。
>>620 さん
私も、マイクロカーネルについて調べていたので、大変参考になりました。
ありがとうございます。
>>LightConeさん
モノリシック、マイクロカーネル方式のカーネルについて御教授ありがとうございます。
私は機能と作成の難易度を考慮して、以下のようにしたいと思います。
・モノシリックカーネル方式
・モジュール化をきっちり行い容易にマイクロカーネル方式へ移行できるようにする。
・システムコールは割り込みゲートを使用。パラメータはレジスタ渡し。
メモリ配置は、530で示していただいた資料を参考に、考え中です。
ありがとうございます。
Liner Frame Bufferの物理ベースアドレスが 0xE0000000 となっていたのに、
今気づいたのですが、なぜメモリは4G無いにもかかわらず、
プログラムは正常に動いているのでしょうか...
理由をご存知の方、参考になるアドレス等教えていただけないでしょうか?
フレームバッファはVGA内のメモリにあるから本体メモリとは関係なっしんぐ。
>>626 さん
御教授ありがとうございます。
物理アドレス 0xE0000000〜 以降は、自動的に、チップセットの方が
VGA内のメモリへマップする言うことでしょうか?
>>626 ハァッ?ネタか?
PCIのコンフィグレーション(←違ってたらごめん)で
論理アドレス0xE0000000にVGA内のメモリが割りつくだけだろ。
本体メモリを4GB積んでも、そこの512MBは使えないから、関係オオアリクイだとおもうが?
ボクへの煽り?カコワルイ
カコワル(・∀・)イイ!!
Intelのチップセット仕様を見たところ、 ISA Hole 0100_0000〜00F0_0000 AGP Aperture 〜FEC0_0000 その他色々なシステム領域 FEC0_0000〜 とありました。ありがとうざいます。 これを知らなければ、危うく、ISA Hole まで使ってしまうところでした。 システムのメモリ空間に、メインメモリ以外のものが色々割り当てられているようです。
ありがとうございます。そういえば、このような資料もありましたね... ここは、割り込み部分を作っている時に、よく見てました。
>>623 >一般プロセスとほぼ等価な形態で構成する方法を言います。
Linuxなどではdaemonプロセスが、そこを補ってるという認識。
QNXを利用したときの幸せはqnetの透過性。分散とか並列とか言わずに潔く
よそのCPUやマシンのリソースを利用できる。
しかもその場合の性能保証/測定・多重化ができる。
ネットといえばイーサしか思い浮かばない向きには関係ないだろうがな。
>>620 知らんかった。サンスコ。日本法人が(やっと)まともに仕事してるんだな。
OSASK3.4でますた。
>>624 FSが落ちた時点でどっちみちそのシステムは死んだも同じだと思われ。
マイクロカーネルはモジュール化の一つの方法にしか過ぎないのでは
ないかとオレは思ってる。ローダブルモジュールでも十分だと。
Lたん書き込み多すぎ。他のレスが埋まってしまう。 というか、LスレDAT落ちしかねない静かさだがいいのか? この際このスレに一本化するというのも手ではあるとおもうが...
>639 確かに今のOS板の速度的には あとわずか6ヶ月ぐらいの放置でdat落ちしかねないな、うん。
>>625 間違えやすいのですが、「モノ*シリ*ック」ではなく、「モノ*リシ*ック」
です(monolithic)。SFで「モノリス」とか時々聞きますけど、それで
覚えましょう(笑)。小さいリスがコンピュータの中に一匹入っている
様子を想像するとさらにGOOD!
>>638 ハードディスクのFSが落ちた場合は、おっしゃる通り、大方再起不能で
しょうね。でも、GUIサブシステムが落ちた場合などなら、マイクロカーネル
では再ロードできるのではないでしょうか。モノリシックでは、再ロードは、
かなり難しいと思います。ただし、パフォーマンスを落とさずにGUIを
一般プロセスでどうやって組むのか良く分かりませんが。
>Liner Frame Bufferの物理ベースアドレスが 0xE0000000 となっていたのに、
>今気づいたのですが、なぜメモリは4G無いにもかかわらず、
>プログラムは正常に動いているのでしょうか...
それは、その物理アドレスにFrame Bufferが顔を出すように組まれている
からです。PCIバスなどでは、バス調停回路があって複雑ですが、
基本的な考え方を説明すると、アドレスのいくつかのビットがある
特定の1,0の組み合わせの時だけ信号線がONになるような回路を「デコーダ」
と呼びますが、そのデコーダが、Frame BufferのRAMのCS(CHIP SELECT)に
接続されているだけです。
例えば、E000 0000 〜 E00F FFFF までを Frame Bufferにしたい場合は、
上位 12 BIT が、E00 になっていればいいので、
bool CS = (PhysAddr[31-20] = 1110 0000 0000B);
みたいな回路を、AND素子とNOT素子を使って作ります。
>>LightConeさん ご指摘、丁寧な解説ありがとうございます、 完全に「モノシリック」と勘違いしていました(^^; ハードウェアーの方まで、よくご存知のようで頭があがりません...
>>643 おまえがばかなだけ。でも確かにLタンはわかりやすく説明できる能力をもってる。
しかし頭いいヤシにそんな手間を取らせるのは漏れ達愚民の大罪だな。
長島監督に、毎日少年野球のコーチさせるのはもったいないだろ。
>>644 第2種←今は呼び名違う
レベルの知識と思われ。つまり計算機の基礎。ソフトもハードもない。基礎だ。
小さいリスはいいですな しかし物知り言っている人って2001年宇宙の旅のモノリスとか知らないのかな
>>646 さん
プログラミングは、趣味でやってるだけなので、基礎も発展もさっぱり無く、
多大な迷惑をかけると思いますが、どうぞお許しください。
マイクロカーネルは、さらに小さいリスが何匹もいるのかな。
と、これだけ書いても仕方ないので。
>>642 X window systemは、一般のプロセスなのでは?
パフォーマンスは、落ちているでしょうけど。
プロセッサが限定されますが
MTRR(Memory Type Range Register)てのがありますね。
>>648 情報処理試験の参考書でも買えば。
試験受けろとは言わんけど。
基礎を勉強するのには結構役立つよ。
>>648 知らないことが別に悪いわけじゃないよ。がんがれ。
だけど基礎はしりませ〜ん、だとコミュニケーションに無駄が増えすぎる。
内容は理解していなくてもコトバを知ってるだけで、お互いすごく楽になると思うよ。
頭の中のインデクスを作るためにも入門書は役に立つと思われ。<-糞本でもな。
「鶏のタマゴを塩化ナトリウム少量を溶かした熱湯の中で10分間熱してくれ。」
->「ゆで卵作って。」
>>651 書き漏らしたてるナ。
>「鶏のタマゴを塩化ナトリウム少量を溶かした熱湯の中で10分間熱してくれ。」
>->「ゆで卵作って。」
まずはこれでコミュニケーション確立。で、
>>652 が言ってるみたいに、やっと
「どうやって茹でたら欲するゆで卵ができるか」の議論ができるわけ。
塩は純粋なNaClで良いのか、熱湯は常に100℃がいいのか、温泉玉子みたいに
低い温度の方がいいのか、など。
で、実装になったら、長たらしい方の表現に戻らねばならん。厳密さが必要になるからな。
いわゆる仕様書というやつだな。
>>645 >長島監督に、毎日少年野球のコーチさせるのはもったいないだろ。
だからLタン、1週間に1回来てくれればいいよ。(w
何も言うまい何も言うまい・・・
何回リロードしても出てこないよ(´Д⊂グスンw F5連打じゃないよw
たぶん採用の選考試験の結果じゃないかな。 大学で proxy の cache が効いていると、 Flash を使ったページが cache からウンロードされて更新されないというケースがあった。
NWSOSは、最近動きないねぇ。
>>661 水面下でいろいろやってるんです(^_^;)
API-DLLへの対応、インポート関数への対応、スタックの自動伸張、
ドライバの仕様化、予約だけして物理ページを割り当てないメモリへの
対応、ファイルバッファ容量の自動調整機能など。
さらにこれらのための下準備として、NWSLをインポート関数や特権レベル
セグメントへ対応させたり、今までALL-ASSEMBLERだったメモリ管理や
ファイル管理を全部Cに書き直したり、割り込み中でメモリの確保をやめて
固定バッファに直したりとか。
一応、DLLも扱えるようになり、ファイルシステムとメモリシステムは全部Cに
書き直せて、スタックの自動伸張にも基本的には対応できました。
アプリのファイルサイズが大分小さくなり、GUIの文字描画やエディタの
描画速度も速くなり、タスクスイッチも高速になっていますが、全て
内部構造の変化でしかなく、目に見えて分かるような機能向上がないので、
公開していないのです。
>>662 アプリケーションプログラマから見れば十分機能向上してます。
もっとまめに更新してもいいんじゃないかと思いますが。
なぜLタンは、自作自演を続けるの? そしてなぜ気づかれていないと思うのだろうか。 (自称)頭いいならば、そこにまず気づけと。
> アプリのファイルサイズが大分小さくなり 〜 > 高速に 〜 > 目に見えて分かるような機能向上がない どっちよ?
>>666 >>664 はLタンじゃないですよ。
Lタンについては賛否両論色々あるだろうけど、
基本的にその開発力は凄いと思いますよ。
K氏と並ぶ日本OS界の裏スターです。
>K氏と並ぶ日本OS界の裏スターです。 同意。
>>659 ( ゚д゚)ビンゴーw
おじゃましました。大学合格したら僕もOS作って見たかったのに〜
時間がぁ。゚(゚´Д`゚)゚。
>>672 国公立前期か。
まあ、後期で頑張れ。枠が狭くてキツいだろうけど。
カーネルモードとユーザーモードの分離、かなり時間かかりそうです。 os_06.zipと外見はほとんど変わりそうにありません;;
>>672 オレはもう前期であきらめてOS作ってるんだが、まぁ、がんばれよ。
俺みたいな万年浪人生なんかになるんじゃないぞ。
カーネル簡易スレッドの実装にめどが立ちました。 またMona開発開始してから、よく今まで動いていたなぁ。。。 と思うような実装の抜けを発見しました。 今の実装にまずいところがありすぎるので 少しずつ既存のコードも書き直して行こうと思っています。 もう少し土台をしっかりとしたものにしないといけません。
チャントハタラクツモリダゾヽ(`Д´)ノ フリーターダガナ(w
>>679 チャント家賃・光熱費・食費・プロバイダ・携帯・年金・健康保険、
全部払える程もらえる一時雇いのシゴトあるのか。
日本経済もまだまだ捨てたモンじゃないな。
それとも、OS作るために生活切り詰めてガンガッテるのか?
> それとも、OS作るために生活切り詰めてガンガッテるのか? 某K?
家賃は2万です。 プロバイダは無料のヤシです。 保険は払ってませぬ。 携帯は持っていませぬ。 あとはひたすら節約
プッ、大学にも行けないヤシがOSか。 万年浪人生の次は万年夢想家ってか(プププ と煽っとこう。後期に向けてちょっとでも勉強しる!
>>683 >あとはひたすら節約
気に入った。でもな・・・
昔近所のあんちゃんが、東京でそんな生活してて、
栄養失調→肺炎でシンだ。弱ってるとすぐ腐るからな。
腹が減ったら、盗んででもチャント食えよ。
シンんだ方がマシと、シヌよりマシは大違いだからな。
>>685 おまえんとこから盗んでやるから住所おしえれ。
Lタンはどうやって生計を立てているの?
ちょっと雑談入ってんな。。 ま、いつまでも続くものではないか。
Lタン、今プーなの?オイラ京大の先生のトコで働いているん だけどさあ。ウチで働いてみる?(w 一応募集はしてるけど。
>689 単にホームオフィスかもしれないぞ。
>>691 一瞬、ホームレスと読み間違えますた(w
(実態は、家庭内ホームレスなんです(笑))
>>693 なるほど、家庭にいながらホームレスか。禅問答だな。
そこにブラックホールがあるから、HNがライトコーンなんだな。
ハウスはあるが、ホームはない。とか?
家庭はあるけどホームがないのでは。
ある種のアフォリズムかと思われ。
>>700 UML(User Mode Linux)みたいな感じですね。
ドキュメントを斜め読みしてますが、結構面白そうです。
情報Thanks
外出かもしれんが。 カーネル書くのにC++使うのは構わんが、STLはどうなの? 動的メモリ確保するアルゴリズムは、mallocできなくてあぼーんしたりしないの? コンストラクタの問題はどっかのスレで話題になってたけど。 っていうか、カーネル内部でmallocしようにも、メモリ管理ってOSの仕事だよな。 カーネル内部専用のmallocつくって、内部でだけ使うのかなぁ? 漏れみたいなバカは考えるだけ無駄だな。ヤッパリ。←キッパリ。
マイクロカーネルとはさっぱり関係ないわけだが
>>704 このファイルデバイスデーモンってのが、OSサーバというものかと思ったんですが、勘違い?
名前ミスってた。もう少し勉強して出直してきます。
まあミスってはいないわけだが
>>702 >カーネル書くのにC++使うのは構わんが、STLはどうなの?
>動的メモリ確保するアルゴリズムは、mallocできなくてあぼーんしたりしないの?
Monaでは、カーネルが動的なメモリを使えるように演算子new,delete
malloc(),free()を実装することでこの問題に対処しています。
>っていうか、カーネル内部でmallocしようにも、メモリ管理ってOSの仕事だよな。
>カーネル内部専用のmallocつくって、内部でだけ使うのかなぁ?
私の認識ではその通りです。
>>703 >カーネルスレッドの実装をしているという事は、
>そろそろAPIの設計もするようになるんでしょうね。
>ひげぽんさん、がんばってください。
ありがとうございます。
なるべく早く、マイクロカーネル化できる様がんばります。
>>708 ソース嫁ばわかるはずのことなのに・・・ひげぽんタンって、いい人だね。
つまらない指摘に答えるために時間を取らせちゃって申し訳ない!
反省して、ソース読みに逝ってきます。
あと、もうちょっとで、カーネルとリンクしていない本物の実行ファイルが 動きそうです。 ページングの設定 mov cr3, eax でエラーが出て先に進まない;; あともうちょっとなのに...
一度聞いてみたかったという理由だけで聞かせてください。 OSのAPIに渡す文字列がchar*なのは、作り手の方々はどう思っておられるのでしょう? \0を文字列中に含めることが可能な言語(C/C++以外のほぼ全て)からだと、 APIを介すると\0以降が切れてしまう事が起こり得るわけで… (本来ならM$に問うべきかも…)
>>712 さん
全然見当はずれなことを言っているかもしれませんが、
私が思ったことをレスしてみます。
C,C++でAPI作られているから、文字列は char* と扱うことにしている。
Java、.NETでAPIが出来ていれば、Stringオブジェクトが渡すものになる。
char* は単に配列の先頭アドレスへのポインタなので、
char[0] = 文字列の長さ
char[1]〜 文字コード
と解釈するようなプログラムにすれば、255文字までなら、
\0も使える文字列になると思います。
>>712 アドレスを渡してるだけなので、
内部で単なるバイナリ列として扱えば\0以降は切られない。
>>714 素朴な疑問だけど、サイズ渡さないと何処までがデータなのか判らない気がする。
>>715 そのとおりです。
712の主張が、データが\0で切られてしまうって事をどう思うかって事だと解釈したので、
レスはこれだけでいいと思いました。
717 :
デフォルトの名無しさん :03/03/15 15:21
age
\0で終端を表すAPI採用してるOSなんて、unix系だけだろ?
\0で終端を表す文字列へのポインタを引数にとるAPIならWin32APIにもある。 ファイル操作やディレクトリ操作など。
そもそも\0を含む文字列ってどうよ おまいら宇宙後でも話すんかい
テキストファイルとか何かの拍子で制御コードが混じってることは完全に無いことも無いので、 アプリ的には一応対応しておきたい場合は希にある。
>>718 C言語がそうだからな。
C言語(or C++)がメインの言語のOSってUNIX系だけだっけ?
>>722 UNIXのためにC言語が作られたから そういうこと。
例えばMacintoshはもともとPascal指向なコンピューターだったから、
C言語の方にStr255という型を定義してる。
CP/Mは'$'で区切るんじゃなかったっけな…
例えば、バイナリファイルを開けることを自慢するテキストエディタとか作ってて、 locale依存な検索機能付けたら文字列比較APIが\0以降を見てくれなかったり クリップボードを経由したら、\0以降のデータが無くなったりしてたら迷惑でしょ。
>>724 カットアンドペーストをWindowsのクリップボード経由で行うバイナリエディタ作ったことあるけど、
テキストデータとしては渡さなかったな。
テキストエディタなら適当にエスケープ文字でも決めといて対応すればいいんじゃない?
文字列比較その他はAPIより自前の方がいい気がするし。
何でもOSが対応しなきゃいけないって事は無いとおもう。
ファイル名に\0文字が入ってるドライブをマウントして 他にコピーしたりするとちょっと嫌かも。 でもさすがに文字数渡すようにしてるか。
DOSはファイル名に&h20含むだけでファイル扱えなくなるもんなぁ…
>>727 カーネルはスペース扱えるよ
スペース対応していないアプリが多いだけ
保守sage機能作動
monaは打ち上げ花火だったか…… # 年度末の忙しさってだけなら良いんだけど
こんにちは。 # 年度末の忙しさってだけなら良いんだけど 全くもって上記の通りです。 仕事が落ち着くまでしばらく停滞するかと思われます。
まあ、マッタリやろうよ。
bochsでは、ページングの設定に成功し、 特権レベル3のユーザープロセスでVGAへの書き込みに、成功しました〜 ヽ(´ー`)ノ もう少し整備すれば、ユーザーアプリケーションも作れるようになると思います。 またまた、実機では、FDから読み込めないというエラーが出て困っています。 cs=ds=ss=0x9000で mov ah, 0x02 mov al, 0x21;[kernel_app_size] mov ch, 0x00 mov cl, 0x02 ;セクタ番号だけは0x1から始まるから mov dh, 0x00 mov dl, 0x00 mov bx, 0x1000 mov es, bx mov bx, 0x0000 int 0x13 ;(*) jc read_err jmp read_return jc read_errで、エラー処理へjmpして、 エラーコード0x04(要求されたセクタ番号が見つからない)を出力します。 al,es,bxへの代入が異なっている以外は、以前のverと同じはずなのですが... どうかご指摘、御教授お願いします。
複数トラックにまたがるセクタって転送できたっけ?
御教授有難うございます。 単純に、セクタ番号×512で読み込みと思っていたのですが、 トラックが絡んでくるのですね。FDの構造を調べてみます。 何も知らなさすぎですね...
調べててみると...
ttp://web.kyoto-inet.or.jp/people/pessi/PC9800HOWTO-16.htmlより 容量 セクタサイズ セクタ数 ヘッド数 トラック(シリンダ)数
(1) 1232KB(1.2MB) 1024バイト 8 2 77
(2) 1440KB(1.44MB) 512バイト 18 2 80
(3) 1200KB(1.2MB) 512バイト 15 2 80
(4) 640KB 512バイト 8 2 80
(5) 720KB 512バイト 9 2 80
これらのフォーマット形式のFDに、セクタ、ヘッド、トラックを指定して
書き込み、読み込みをしなければならないということですね。
セクタ、ヘッド、トラックを指定して書き込みが出来るソフトを探してきます。
>>737 先頭セクタあたりに、メディアのタイプを示すID(ディスクリプタ)もあるよ。
あと、ドライブ側(FDC,BIOS含む)の制限にも注意な。1024バイトセクタ読める
ドライブは絶滅寸前かと思われ。
>セクタ、ヘッド、トラックを指定して書き込みが出来るソフトを探してきます。
よほど変なフォーマットで無い限り、アクセスしたいセクタ番号(通し番号)nとすると、
セクタ:n % セクタ数
サイド:n % (サイド数 * セクタ数)
トラック:n / セクタ数 / サイド数
で求まるよ。%は剰余な。
とりあえずこれで、セクタ数、サイド数、トラック数をパラメトリックにしておけば、
対応フォーマットを増やすのも楽だと思うが。
HDDのCHS-LBA変換も基本的にはこれで済むと思うけどなぁ。
遅っいマイコンではそんな計算毎セクタごとにやってると、ディスクが回っちゃってて、
1セクタ読むごとに、1回転しちゃうんだよな。だからシーク時だけ上記の計算して、
あとはサイド、トラックの切り替わりだけどシーケンシャルに処理したりしたなぁ。
セクタの配置をばらばらにする事もあった。
そういや、トラック0だけサイド0しかないフォーマットとかもあったな。でも今時は
そんなメディア読めなくてもいいJARO
詳しい解説どうもありがとうございます。
MONAの
; fake boot parameter block(bpb) for RAWRITE
部分の意味がわかってきました。
738さんのレスや
ttp://kone.vis.ne.jp/diary/diaryb5.html を参考に考えると、
ブートセクタ上の最初数十バイトにファイル構造を示すデータがある。
ブートプログラム(ブートセクターに配置)にフォーマット形式等を埋め込んだもの boot.img
カーネルバイナリファイル kernel.img 、アプリケーションバイナリファイル app.img とすると、
このファイルを boot.img kernel.img app.img の順にくっつけた os.img を dd等 で書き込み
カーネルの読み込みは セクタ番号(通し番号) 2〜 から読み込むということでいいでしょうか。
>>739 ブートの詳細(ソフトから見た場合)は、
http://www37.tok2.com/home/nobusan/ (リンクフリーではないらしいので注意)
を見ればよいかと。フロッピーも基本は同じだぁ。
違いは、先頭セクタをddして見比べれば、大体わかるっしょ。
>>736 >何も知らなさすぎですね...
わたもちたんは、勘がいいみたいだから、知らないくてもすぐに知ってる状態に
なれるっしょ。勘が悪くて物知りバカの漏れみたいな人種からはうらやましいよ。
質問の答えを書き忘れてた。
>>739 >このファイルを boot.img kernel.img app.img の順にくっつけた os.img を dd等 で書き込み
>カーネルの読み込みは セクタ番号(通し番号) 2〜 から読み込むということでいいでしょうか。
先頭セクタ=MBRにブートのためのコードを*まだ*置けない状態であれば、それでよいと思う。
実際にはもうちょっと後ろから実際のイメージを置くみたいだが。
メディアからブートさせるには、先頭セクタに、カーネルイメージを読み出すコードを
置いておく。そのコードがでかくて入りきらないなら、カーネルを読みだすためのコードを読み込むためのコードを置く。
でも現状はたしか、GRUB使ってるんだよな。
>わたもちd Monaのfirstboot.asmを流用すれば?無粋かもしれませんが‥‥ やってることはごく単純だし、煩わしければそんな方法でもいいかと。
>>740 (741)さん
ジャンプコード、OEMラベル、セクタあたりバイト数、クラスタ当たりセクタ数、予約セクタ数
FATの数、ルート最大エントリ数、全セクタ数、メディアディスクリプタ、FATのセクタ数、
トラック当たりセクタ数、ヘッド数ぐらいまで(27bytes)、
ブートプログラムの最初に追加したいと思います。
それと、カーネル読み出し部分をヘッド、シリンダー、セクターを使用したものに書き直します。
こんな感じでためしてみます。
どうでもいいことですが、Monaのブートローダーを元に作った、ブートローダーを最初から使っています。
GRUBは、ファイルシステムが理解できて、elf形式実行ファイルを直接カーネルとして
ロードしたりできるみたいなのですが、使い方が分からないので...
>わたもちたんは、勘がいいみたいだから、知らないくてもすぐに知ってる状態に
>なれるっしょ。勘が悪くて物知りバカの漏れみたいな人種からはうらやましいよ。
えと、詳しいことはイイことです。たぶん私に思われていることは99%ぐらいウソな予感w
>>742 さん
どうも資料の提示、ありがとうございます。
今は、バイト位置を指定してロードしているだけなので、
簡単なものでもいいからファイルシステムも考えていかないといけませんね。
>>FreeDOS教徒さん
せっかく作ったので、もう少しトライしてみます。
というか自前のブートローダーといっても、firstboot.asm を流用しているのにかなり近いです。
>>745 >簡単なものでもいいからファイルシステムも考えていかないといけませんね。
たぶんそうだろうと思って、FFSのリンクを示してみた。
これから登る山の大きさが分かれば、気が楽になるってもんだと思ってね。
>>747 >> でも現状はたしか、GRUB使ってるんだよな。
>それはNoNameのほうです。
ヴォケてた。スマソ。
>>FreeDOS教徒さん どうも、非常に参考になります。 ありがとうございます。 OSの名前をOEMに入れないといけないですね。 日本の花ということでAsagaoとか考え中です。
狩人さんはおばかさん
桜だと、某有名萌えアニメにはまった人達が、たくさんソフトにその名前を つけているようなので、わざとはずしました。 私もはまったその一人だったりw このOSもそっち系にいきそうです。
_, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。
日本の花は菊だと思うが・・・ (国会議員のバッジとか・・・)
いや、梅(ry
だから、国花だけじゃないっちゅーにw<日本の花
日本の花じゃないけどBlueRoseとかどう?
>>757 英語圏に住んでいたら、たぶんBlueRoseに変えるぐらいいイイ感じなのですが、
とりあえず、ひらがなで書くようなものと、
萌え系のOSになっても大丈夫なような名前でお願いします。
注文が多くてスミマセン(^^;
「ひらがな」というより、日本的なものですね...
わた氏は本性を隠していたな。 Asagao でいいと思う。開発コードにChihiroとかついてるご時世だし。 萌え系ってのはショックだが。
>わた氏は本性を隠していたな。 隠しているつもりはなかったのですが... >萌え系ってのはショックだが。 やっぱりだめですか... SwingのようにLook&Feelを変えて使用してくださいと言ってみるテストw
ひなげし、に1票。
萌え系・・・ _, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。 マンセー!!
ひまわり・・・・って気象衛星みたいになってきますたw らいちょう・・・・って鉄道みたいになってきますたw
FD読み込みに失敗の件は、結局Monaのものを流用させていただきました。
Monaプロジェクトのみなさま、厚くお礼申し上げます。
OSの名前は、とりあえず(仮称)あさがおにしておきます。
どうも、色々な名前ありがとうございました。
また実機で動かないバグが...もう泣きそうです
Kernel.c の StartKernel -> Init -> PrintPagingOnMessage -> Graphics_SetColor までは
問題ないのですが、次の行Graphics_DrawStringで、いきなり落ちます。
どういうわけか、Bochs でも特権レベル3のプログラムが動かなくなりました。
0xDFFFFFFCでページフォルトが起きているのですが、PageManagerではきちんとページを確保しています。
原因が思いつく方、お時間ありましたら、レスください。お願いします。
ソースは前と同じにあります。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/6802/os_10_debug.zip
ひがんばなでいいよ
>>765 いっそのこと下の部分はMonaに差し替えて、
Monaで手のついてないGUIとかに専念しては?
「あさがお」はウィンドウシステムの名前にすればいいし。
>>767 さん
このまま本当に作れるのかと言ったら、まだまだ乗り越えないといけない課題も多いですし、
Linuxのように、カーネルにMonaを使い、ディストリビューションという形で
作っていくというのもありと思います。
でも、OSのイメージと言うと、人それぞれだとは思いますが、
ほとんどはGUIの雰囲気で決まるところがあると思います。
そんな一番おいしいところを頂くのも、気が引けます。
どうにか原因究明をして、特権レベル3での実行ができるようにしたいと思います。
>>765 >>768 ちらっと見ただけだが、
0xDFFFFFFCにアクセスしようとするのがおかしいよな。
uint vga_memory_low = 0xE0000000;
に近いのでVRAM書き込みアドレスがあやしいかと思ったが、さして問題なさそう。
となるとスタックを疑うか。
Graphics_DrawString()の中でGraphics_DrawCharを呼ばずに、
(g->data)[0] = 0x55;
とかやってみるのはだめかな。というのは、
・VRAMアクセスで問題
・その他の問題
の切り分けが先決かと。
>原因が思いつく方、お時間ありましたら、レスください。お願いします。
PF発生時のIPはわからないのかな。レジスタ/スタックダンプも。
っていうか、動かなくなった原因は、触ったことそのものだから、
そこに問題があるというのが原則では?
どうもお手数かけます。 「VRAMアクセスで問題」でした。 0xE0000000へアクセスしてもなにも変化無く(落ちもしないし、描画もなし)、VGA_GetVram()だと落ちます。 0xE0000000と思いこんで実装している部分が無いか調べてみます。 0xDFFFFFFCでのページフォルトは、 Bochs では 3rd (13) exception with no resolutionと表示されました。 14でないのは、無理にエラー処理されて、わけがわからない場所を実行するので、 IDTへの登録と設定そして、割り込みは禁止にしてあります。 だから、そもそも割り込みハンドラが無いと表示されていると思います。 cr3 の値が0x00000000だったので、ページフォルトだと思いました。 sp = 0xE0000000となるようにスタックを積んで、iretで制御を渡しているので、 <ProcessLoader> 80000000:55 push %ebp 80000001:89 e5 mov %esp,%ebp 80000003:90 nop 80000004:eb fe jmp 80000004 <_Main+0x4> 最初のpushで0xDFFFFFFCになってページフォールトだと思います。 Process_Initの PageManager_AllocatePage(p, 0xDFFFFFFC); が デバッグ用にあるので、ページフォルトは無いはずなのですが。
>cr3 の値が0x00000000だったので、ページフォルトだと思いました。 cr3の値が0x00000000でないからの誤りです。 どうも、夜遅くまでバグを見つけてもらい感謝します。
>>772 >どうも、夜遅くまでバグを見つけてもらい感謝します。
バグを取ったのはチミ自身だ。チミの勲章だ。
>>769 さん
iretで、特権レベル3に行く直前まで無事、実機でも確認できました。
ほんとうにどうもありがとうございます。
「VRAM書き込みアドレス」が怪しいというヒントが無ければ、一人では見つけられませんでした。
バグ取りができたのも、すべて769さんのお陰です。
VBE linear buffer形式 の 開始アドレスは 0xE0000000 では無く、
その他の条件、少なくとも機種によって異なる。
偶然、Bochsでは意味ありげなきちんとしたアドレスの0xE0000000となっていた。
ということが原因だったようです。
これからこの辺を実装される方はお気をつけください。
>>774 外出っぽいが、
>VBE linear buffer形式 の 開始アドレスは 0xE0000000 では無く、
>その他の条件、少なくとも機種によって異なる。
漏れはVBE3.0しか見てないが、初期化してモードを選択してから、
ModeInfoBlockを見ろと書いてあるように見えるな。
>>774 うちの環境では、vga mode change err が出てしまいます。
int 0x10 AH=4f02
途中で書き込みしてしまいました。 bochs2.0.2を使ってます。 int 0x10 AX=4f02が失敗というか、AHが4fのまま。。。 あと、DIは設定しなくてもいいのですかね? bochsrcもつけてもらえると、原因がわかるかもしれません。
どうも有難うございます。 Bochsのデフォルトの設定では、VGABIOS-elpin-2.40が使われているはずなので、 VGABIOS-lgpl-latestを使用していただければ、vga mode change err はでないと思います。 bochsrc.txtです。 floppya: 1_44="pc\asagao.img", status=inserted diskc: file="pc\c.img", cyl=20, heads=16, spt=63 romimage: file=BIOS-bochs-latest, address=0xf0000 vgaromimage: VGABIOS-lgpl-latest megs: 32 boot: a vga_update_interval: 300000 keyboard_serial_delay: 250 floppy_command_delay: 500 ips: 500000 mouse: enabled=0 private_colormap: enabled=0 i440fxsupport: enabled=0 time0: 0 newharddrivesupport: enabled=1 log: - panic: action=ask error: action=report info: action=report debug: action=ignore
>>779 無事ブートできました。
3rd (13) exception with no resolutionで落ちましたけど。
あと、本質的なことじゃなくて恐縮ですが、
ImageMakerでイメージを書き換えるより、ヘッダバイナリ(?)みたいなのをつくって
boot+Headbinary+Kernel+Appとくっつけたほうがよくないですかね?
もしくは、Kernel,Appコンパイル後、サイズ定義ファイルを生成して、boot.asmで読み込むとか。
もうひとつ、やっぱり本質的じゃないですが、
イメージ作成.batでパス設定してるのに、フルパス使ってるのは疑問ですが(w
Kernel,Appとファイルも増えてるし、そろそろ、Makefileを作ったほうがいいかもしれませんね。
>3rd (13) exception with no resolutionで落ちましたけど。 Kernel.c の StartProcessLoader の iret でユーザープロセスに行ったとたん落ちます。 未だに原因わからずです。 >ImageMakerでイメージを書き換えるより、ヘッダバイナリ(?)みたいなのをつくって >boot+Headbinary+Kernel+Appとくっつけたほうがよくないですかね? >もしくは、Kernel,Appコンパイル後、サイズ定義ファイルを生成して、boot.asmで読み込むとか。 boot+Headbinary+image(Kernel,App等)の構成に、ユーザーレベルでの実行に成功したら 変えるつもりです。 Headbinaryには、各ファイルのサイズとimageでの位置を書いて、 デイレクトリの無いファイルシステムのつもりで実装します。 たぶん今後は、ImageMakerは、kernel, 作成したアプリ から image を 生成するようなツールになるはずです。 コマンドはかなり苦手なので、適当にbatファイル書いたら、コンパイルできたから いいやという、いいかげんなものなので、つっこまないでくださいw 一度、makefileは作ろうとしたことがあるのですが、失敗しました。 そろそろ作らないとやっぱりいけないですよね... 統合開発環境ばっかり使ってるとこんな人間になります。お気をつけて(を
>>781 >一度、makefileは作ろうとしたことがあるのですが、失敗しました。
マクロとかmakeの方言を使わなければ簡単かと。
[作りたいもの] : [材料1] [材料2]
[材料1]と[材料2]から、[作りたいもの]を作るコマンド
をずらずら並べるだけでも、随分楽になるけどなぁ。
クロスだと、
install : all
copy hoge.exe a:
とやっておくだけで、生産性の改善もできるとな。
>>781 一般保護違反や無効TSSの例外ハンドラを実装してみてください。
恐らく、無効TSSが原因だと思います。
>>783 さん
どうもありがとうございます。
もう一度きちんと調べて、makefileを作ってみます。
>>784 さん
割り込み番号 0x0D の例外ハンドラを実装してみて、
TTSについて、もう一度チェックしてみます。
どうもありがとうございます。
これも経験と知識の差でしょうね...
皆さんどうしてそんなに簡単にエラー見つけることが出来るのですか...(はぁ
この際なので、0x13まで、どの例外かが分かる程度まで、実装します。
わたもちさん StartProcessLoaderの push $0x80000000 を、 push $0x00000000 に直してみてください
>>787 に追加
exe.lsの
.= 0x80000000
も
.= 0x00000000
に直してください。
>>.oOo. CSのベースアドレス‥‥??
>>787 (788)さん
0x00000000から実行ということですよね?
カーネルのページマップは
すべてのマップを 仮想アドレス = 物理アドレス としています。
ユーザーのページマップは
0x00000000〜0x7FFFFFFF と VGA 領域が 仮想アドレス = 物理アドレス
0x80000000〜0xFFFFFFFF (VGA領域を除く)となってるので、
ページマップを全体的に変えることになりそうですけど、
仮想8086モードを使わないとしても、無理なマップなのでしょうか...
原因をつかんでおかないとまた同じことを繰り返しそうなので、
エラー原因を御教授くださいませんか?お願いします。
<後ろ頭>-~~ ここはiret(d)命令でないと。PL3側のespもpushの必要あり。 > asm volatile ("push$0x00000020 \n\t" > "push$0xE0000000 \n\t" > "push$0x00000018 \n\t" > "push$0x80000000 \n\t" > "ret \n\t");
わたもちさん メモリーマップはこのままでもいいです。 なぜ0かというとCS(0x1b)のベースが0x80000000だからです つまり0x1b:0x0はリニアアドレスの0x80000000になるのです push $0x80000000や.=0x80000000 では0x1b:0x80000000=0x100000000を指すことになります
超先生、ありがとうございます。 恐れ入りますが、新しくDLしてください。 前はret にしていたのですが、iret でPL=3に移ると書かれたものを見たので、 iret に書き直してあります。スタック切り替えもされる思って書いたコードです。 asm volatile ( "push$0x00000023 \n\t"//20 "push$0xE0000000 \n\t" "push$0x00000000 \n\t" "push$0x0000001B \n\t"//18 "push$0x80000000 \n\t" "iret \n\t");
>>.oOo.さん プロテクトモードに入ってすっかりベースのこと忘れ、そのことに気づいていませんでした。 どうも有難うございます。 CS.base 0x80000000 で、exe.ls = 0x00000000 とするか CS.base 0x80000000 -> 0x00000000 で exe.ls = 0x80000000 とすればいいのですよね。 0x80000000 以下で実行されると困るので、 CS.base 0x80000000 で、exe.ls = 0x80000000 がよさそうですね。
>CS.base 0x80000000 で、exe.ls = 0x80000000 がよさそうですね CS.base 0x80000000 で、exe.ls = 0x00000000 ですた
asm volatile("mov$0x0023, %ax \n\t" "mov%ax, %ds \n\t" "mov%ax, %es \n\t" "mov%ax, %fs \n\t" "mov%ax, %gs \n\t"); asm volatile ("push$0x00000023 \n\t"//20 "push$0xE0000000 \n\t" "push$0x00000000 \n\t" "push$0x0000001B \n\t"//18 "push$0x00000000 \n\t" "iret \n\t"); と、 無効TSS 例外(#TS)(int 0x0A)、セグメント不在例外(#NP)(int 0x0B)、一般保護例外(#GP)(int 0x0D) ページフォルト(int 0x0E) を設定して実行してみても、 割り込み番号 0x0E、エラー原因のアドレス 0xDFFFFFFF、割り込みハンドラに入る前のeip = 0x00000000 となってるようです。謎w 787,788も修正しました。どうもありがとうございます。
Bochsでも、実機でも動きました! ページテーブルのフラグの意味を取り違えていました。 フラグを修正すると、動きましたぁ〜〜 これで、ようやくOSらしくなってきましたw
ちょっとだけ復活します。 わたもちさんはすごいなぁ。 カーネルスレッド実装がだいぶ落ち着いてきました。 スレッドというよりは、プロセスになってしまいましたが・・・ コンテキストをkthread構造体に保存する形になりました。 デバッグに四苦八苦したため、全ての流れを一応把握できているつもりです。 セマフォを用いたロックもうまくいっている模様です。 依然見られたスタック破壊もなくなりだいぶ安定してきました。 システムコールでkthread_yieldを簡易実装予定。 明日までに終わればいいなあ。
>>ひげぽんさん >わたもちさんはすごいなぁ。 C++で、マイクロカーネルのOSを作るという先進的なことに取り組まれているようで、 とても足元にも及びません。 このスレッドの皆さんのおかげと、Monaのソース、LightConeさんのまとめ書き等があったことと、 時間が有り余ってるので、ここまで実装できました。 でもまだまだ、キーボード割り込みもスキャンコードを取得しているだけですし、 メモリ管理は一応作ってあるのですが、バグだらけの予感です。先は遠いです。
>C++で、マイクロカーネルのOSを作るという先進的なことに取り組まれているようで、 >とても足元にも及びません C++はともかく、マイクロカーネルは果てしなく遠いです(笑) ページングも、ユーザーモードでのプロセス実行も実装できていないので 参考にさせていただきます。m(__)m
いいかんじになってきたな。(いろんな意味で)
ダウンロードページ開けないょぅ…。
すみません、できますた。
そろそろ、混乱しないように、Mona的な用語定義とかインタフェース仕様とかがあると便利かも。
>>806 うわ、見てて頭が痛くなる論文だ(笑)
てか、改めて数学はどんな分野よりシンプルでかつ難しいと感じました。
>>807 証明に利用している数学的知識は非常に初歩的なものなので、実は
かなり簡単なんです。
beta0.05a がリリースされて、久しぶりにサイトを見たが SS めっちゃかっこよくなってんじゃん。リアルで『スゲー』とか言っちゃった
あ、MonaBBSでも出てましたね。
β公開age
キタ━━━━━(゚∀゚)━━━━━!!!! 乙カレー
>>815 さん
ありがとうございます。
メモリの扱い、イベントの扱い、ファイルの扱い、GUIはどのように作るか等
まだまだ決めることが多いので萌え風味を出せるまでしばらくかかると思いますが、
できるだけ早く実現できるよう頑張ります。
>>わたもちd 萌え進行は正直、ちょっと楽しみです。。 がんばってください。
>>813 検索して見つかったものでよさげだった奴
ttp://www.justsystem.co.jp/tech/atok/atokapi.pdf APIのインタフェースを使う人に対して説明したものですね。
APIの機能を詳しく説明したものを機能仕様書or機能設計書。
実装に関する部分まで詳しく説明したものを詳細設計所と、
呼んでいたような感じがする。
インタフェース仕様書は、機能仕様所に含まれる場合もある。
とりあえず、インタフェース仕様書があると、簡易OSサーバとか簡易アプリケーションとかを
一般ユーザさんが少しずつ作り始めることができるかと。
>>FreeDOS教徒さん ありがとうございます。意外にも好感を持ってもらい嬉しいです。 萌えっていうと正確にはどういうことを言うのかなと、 ちょっと思っています。 ファンシーとかなら大丈夫っぽいですが、キャラクター関係だと絵が苦手な罠。 主にアプリケーション開発環境はJavaでできたらいいなと考え中です。
>>819 JavaVMってVMで使われているシステムコールをどうにかしたら、
性能は悪くても、動くようになるんですかねぇ。
>>820 さん
インタプリンタを移植する予定なので、煩雑な計算を行うものだと
スピードに問題が出てくると思いますが、一般的なGUIアプリケーションでは、
実用的なものになるようにできると思います。
Javaが遅く、.NETが早い理由がおそらく解決のポイントだと思います。
クラスライブラリーの作成の時
1.スピードのネックになるところは、C,C++を使用する
2.できるだけ抽象度を下げる
Javaのクラスライブラリーのように、互換性を大事にするためにできるだけJavaで作ることをせず、
グラフィック関係はCで作ったものを薄くJavaでラップするぐらいの気持ちで作りたいと思います。
>>821 さん
ありがとうございます。
もともと、Wabaには目をつけていました^^
クラスライブラリーについては、kaffeのクラスライブラリーを流用したいと思います。
java.utilとかとても一人で作れるものじゃないですw
欲を言えば、例外やスレッドが使えるインタプリンタがいいのですが、無理っぽいので
このへんで...
うお、こんな面白いスレがあったのか見落としてた。 外野のたわごとですが、アプリの動かないOSなんて誰も使わないので たとえばエミュが軽快に動作するマイクロカーネルなんて面白いんじゃないかと思ってました。 上位(GUIとか)層を一から作るのも面白いとは思いますがそんなに広まることないので 将来的にはWindowsもUnixアプリも動くといいなぁっとか。OS/2みたいに別レイヤで動くとかね。 たわごと失礼。
>>823 チンコスのかほりがプンプンするなw
萌えを目指すなら見た目重視にして暫くお茶を濁した方がいいかもしれない。 と言ってみるテスト。
>>潜伏名無しさん 名無したんですか? 潔くお茶を濁したように見せかけて、コソーリ内部はきっちりつくってみたりするかもしれない。 とか言ってみるテストw
はやとちり、スマソ。 読み間違えてますた。最初読んだとき、だいぶん、へこんでますた。 もともと萌えキャラはかけないので、お茶を濁すのは無理ぽです。 助言ありがとです。
以前も早とちりして、結果的に逆の意味にとれるもの書いてしまったので、 気をつけないと...ゴメンナサイ
萌え指向ならいっそうの事、エージェント指向なOSを目指すのも面白いかも。 萌え萌えなキャラクターが、あなたの代わりにお仕事しますとか。 エージェント指向なOSとは、(技術的に)どのようなOSか、漏れにも よく判らないけど。
>>830 さん
「伺か」みたいなものを、OSのシェルとして使うというぐらいなら、
おそらく可能だと思います。
Windows版でさえも作るのはかなり大変みたいです;;
>>818 情報ありがとうございます。
Java VMの件面白そうですね。
Monaで動くようになったら幸せですが・・・
>>832 あまりこういうのは書いてないんで、どのように書くのがいいのかはわかりませんが、
いろいろ見てみると、参考になると思います。
以前に、manコマンドで表示される形式で書けと言われたこともあります。
>>830 オブジェクト指向もよく理解できてない凡人ですが、
ユーザからの要求をそのときのシステム状態(プロセス数とかCPU使用率など)に
応じて要求受付モジュールがより細かい単純な仕事に分解し、優先度付けして、
それぞれの仕事をするモジュールに渡す。ようなものだと思っています。
エージェント指向は、オブジェクト指向に人工生命や人工知能の技術の一部(進化と自律性?)を
取り入れたものでしょうかね。この辺りはエージェントの定義が多種多様なので詳しくはわかりません。
とかいっても、プログラムしたことしかできないので、結局、オブジェクト指向になってしまう。
(プログラムしたこと以外をされても困るし(w
C++で記述されてるMonaならこれからの設計次第で、将来はエージェント指向OSにばけるかもしれませんねぇ。
#まとまりのない長文で悪い。。。
エージェントさんはおばかさんσ'A`)σ
>>822 スレからは外れるが...
> インタプリンタを移植する予定なので、
何故か、interpreter を「インタプリンタ」と書く人が多いんだが、どこをどう読んだら新型のプリンタみたいに聞えるんだろう...。
>>835 よく見てますねぇ。まったく気付かなかった。
標準出力がプリンタってのを思い出してしまった(w
>>835 ,836さん
インタプリンタ、やっちゃいました^^
言われると、そうだったと気づくのですが、いつのまにか気づかずに、
またやっちゃいそうですw
10回言うと、いつのまにかインタプリタ...インタプリンタになってたり。((((;゚Д゚)))ガクガクブルブル
デスクトップをディスクトップと言うのと同じかも。
>>837 >10回言うと、いつのまにかインタプリタ...インタプリンタになってたり。((((;゚Д゚)))ガクガクブルブル
1日1回、100回ぐらい連続で言うと、もはやプリンタと言うつもりでもプリタになったり、、チガウ!
これを 3日ほど続けるともう間違えなくなるYo-。
>>840 インタプリタ (ン無し) あ、ネタだった?
質問ですが、このソースを元に、自分なりに改造してみても良いですか?
846 :
ひげぽん ◆Ngzcp/NZpA :03/03/31 21:58
847 :
デフォルトの名無しさん :03/03/31 22:12
>>847 BFSですか、ありがとうございます。
FSも、少しずつDataBaseとの垣根がなくなってくるのかもしれませんね。
floppyの論理ブロックアドレスとトラック・ヘッド・セクタの対応が よくわからないので資料を探しています。 ファイルシステムの実験はMonaと切り離して実行できるのがうれしいですね。
>>850 どなたかはわかりませんがありがとうございます。
どうも知っている人っぽいのですが、本当にありがとうございます。
作ってみようスレのURLすごいな あんなにOSあったんだな
>>853 これは素晴らしい
用途から言うとNWSOSの互換ライブラリを思い出したよ
内容は全然違うけど(w
MEGのristiaの狙ってるのとも重なるかも
みんなJava好きだね〜
>>855 > イベントディスパッチ部分のきちんとした実装が良く分からないので、
> もう少しほかのGUIライブラリーを調べてみます。
これはめっちゃ言語に依存する部分。
自前イベントループで自前ディスパッチなんかしなくていいように
隠蔽することを前提にすると……
Cだとコールバックしかない。
C++だとコールバックはきつ過ぎるのでメッセージマップで隠蔽とか、(MFC)
独自プリプロセッサでグルーコードを自動生成するとか、(Qt)
似たようなことをテンプレートでやり繰りするとか、(Gtk--)
継承必須で仮想関数だけでやっちゃうとか、(wxWindows)
みんなめっちゃ苦労してる。
Javaだと仮想関数とインターフェースでのリスナーを使うのがAWT/Swing。
原理的には同じようなことはC++でもできる。(libqv)
コールバックをやろうと思えばリフレクションで出来るだろうけど
実際にそれを実行に移したものは見たことない。
C#だと委譲が強力でオブジェクト指向とコールバックがうまく両立している。
このC#の仕様があってWindows Formsは単純かつ強力に仕上がっている。
(ちなみにJ#はJavaに委譲が追加されている)
Objective-CはC#の状況に似てるかな。
とにかく言語に依存するよ。C#が一番扱いやすいと思ワレメ。w
>>856 さん
書き方が悪かったです。お手数かけました。
イベントの処理を書く部分は、
MFCではたぶんオーバーライドで、
Javaではインタフェースを使った委譲モデルで、
C#ではデリゲーション(メソッドオブジェクトみたいなものっぽい)を使った委譲モデル
というのは知ってるのですが、
困っているのは実際イベントキューからどのようにイベントを伝えるかです。
ComponentEventはそのまま発生元がイベントの伝え先なのですが、
MouseEventやKeyEventはどこへ伝えようかなと、なかなか良い方法が考えつきません。
ちなみに私はC#のデリゲーションは嫌いだったり。
class MainFrame() extends Frame {
MainFrame() {
addMouseListener(new MouseEventHandler());
addMouseMotionListener(new MouseMotionEventHandler());
}
class MouseEventHandler() extends MouseAdapter{
}
class MouseMotionEventHandler() extends MouseMotionAdapter{
}
}
こんな感じでイベントごとにグループわけできないからC#でたくさんイベントハンドラ書くと意味不明になりますw
構造体とかデリゲーションとかいらない機能多すぎです。C#ではきちんとした内部クラスが書けません。
MouseEventHandlerの中から直接MainFrameのフィールドにアクセスしたりできないのです。
言語の好みは人それぞれなんですけどね。
宗教戦争っぽくなるので、C#とJavaの言語的な所はこのへんで。 今は MouseEventのTYPE_MOUSE_PRESSED、TYPE_MOUSE_RELEASEDは最前面にあるウィンドウだけに TYPE_MOUSE_MOVEDは全部のウィンドウに ComponentEventはイベントの発生元に イベントキューからイベントを送るということにしているのですが、 色々考えるとこれだとまずいですしね...難しいです
>宗教戦争っぽくなるので、C#とJavaの言語的な所はこのへんで。 ワラタ
引き際が(・∀・)イイ!
好き勝手なこと言った挙句反論は受け付けませんなんてのは まともな人間のすることとは思えんが
今日はFDCDriver::write(int lba, byte* buf)のデバッグをしてました。 実機,VirtualPCではうまく動いているようです。 EOTパラメータではまりそうになりました。 bochsでは相変わらず write終了後の割り込みがこない writeコマンド後のリザルトフェーズ時にMSRがreadyにならない。 という二つの現象が見られ、気持ち悪いです。 後者の現象は前者を無視してリザルトフェーズにいったのが悪いのかも 他のOS作者さんたちがどのように対応しているかが知りたいところです。
864 :
デフォルトの名無しさん :03/04/07 09:35
865 :
bloom :03/04/07 09:40
866 :
デフォルトの名無しさん :03/04/07 16:23
OSの話をしてるかと思えばJavaとC#の話? OS作りにはVM上で動くJavaやC#よりも C/C++のほうが適していると思ったりする。 もうそんな考え方古い?
古いとかじゃなくてそもそもOSはJavaやC#では書けません。
>>863 >write終了後の割り込みがこない
mona-0.0.5.tar.gzのソースMFDCDriver.cppを見た。
たぶん、確認済みだと思うのであるが、
while(!waitInterrupt());
は中身が、
return interrupt_;
だけだな。ちゃんと実行コードは生成されてるのかな。
特に、MFDCDriver::writeでは、直前に
interrupt_ = false;
があるからな。お子ちゃまが書いたコンパイラでもニフラムで消し去れるな。
割り込みで書き書きする変数にはvolatile付けとけ。C++でも使えるJARO。
DMA使ってるんなら、DMAの完了でええやんけ、と思うのは無責任かな。
参考文献:「トラ技スペシャルN.11 フロッピ・ディスク・インターフェイスのすべて」
>>863 >>872 連続カキコスマヌ
あらためて、mona.tar.gzをダウソしてソースを見た。FDCDriver.cpp
-Sオプションでアセンブルリスト見たが、volatileは関係なさそうだな。自信無し。
普段gcc/g++使ってないから悪ぃね。でもvolatileはつけといた方が良いよ。
で、「割り込みがこない」と判断した理由は何かな?
bool FDCDriver::waitInterrupt()
で、数えてるcounterのカウントアップかな?
でもこいつは「waitInterrup()を呼び出す全て」でカウントしちゃうよ。
シークしてるあいだに5000くらい行っちゃわない?たとえbochsでも。
しかもリセットされないしな。
void FDCDriver::waitPrint(const char* msg)
みたいに、500000くらいにした方がいいんじゃないかなぁ。
bochsでDOS6使ってるけど、フロッピーはやたら遅いしなぁ。
あれは明らかに1シークあたり、1回転してしまってる感じだけどなぁ。
(1回転=0.1秒オーダー)
bochsのソースもちらと見たが、DMA転送完了時に
割り込みを起こすつもりのように見えるけどなぁ。
まぁ、漏れなんかの書くことは気にせずに、他の作者さんの情報を待った方が
いいだろうな。うんうん。
>>870 書けないって断言されると書きたくなっちゃう ♥
>>872 さん
>は中身が、
> return interrupt_;
>けだな。ちゃんと実行コードは生成されてるのかな。
すいません。そこまでは思いつかなかったです。
確かにその可能性があるので調べる必要があると思います。
>DMA使ってるんなら、DMAの完了でええやんけ、と思うのは無責任かな。
>参考文献:「トラ技スペシャルN.11 フロッピ・ディスク・インターフェイスのすべて」
おお。ありがとうございます。そのような完了判定方法もあるのですね。
>>876 >console_->printf("\ninterrupt:");
>interrupt_ = true;
>となっているので割り込みが来ていないことが分かっております。
void FDCDriver::interrupt()
のことだな。trueにするやつは他にもいて、counterのカウントアップがそれだな。
まだ、割り込みが来ないとは言い切れてないよな。
現状だと、「interrupt:」と表示されずに、waitInterrupt()が抜ける、だけであって、
それをもって割り込みが来ないと断言してはいかん。
できれば、何十秒か何分か待って、なおかつDMAの転送も終わって、ディスケットに
データが書き込まれているのに、なお「interrupt:」が表示されないことを
確認すべき。第一、読み込みでも割り込み起こらないの?
「期待した以上に遅れて割り込みが起こるかもしれない」という可能性を捨ててはいけない。
実際問題bochsの挙動に問題があろのだとしても、上記のようなデバッグでは
問題が切り分けできていないとおもわれ。
本当に正しくは、何秒以内に割り込みが起こるはずかを見積もるべきであるが、bochsでは
できない。充分すぎるくらい長い時間を想定すべきかと。
ハードウェアリトライという恐ろしいコトバを記しておこう。
>それも考えたのですが、CPUに依存してしまうのでどうも
counterをタイムアウトの意味で使ってるなら、counterの実装自体がCPU依存であり、
カウントアップ値で5000を選ぶかどうかは上記デバッグの考え方に基づくべき。
bochsでカウンタ5000回回すのに、1秒もかからないような気がする。かかるのか?
>おお。ありがとうございます。そのような完了判定方法もあるのですね。
いや、十ン年前の話だし、8ビット機での話だからな。あてにはならん。
あの本は、98について書かれてるから、一層あてにならん。
それでは申し訳ないので、ついでにWin2000のDDKのFDC.Cを見てみた。
やっぱり書き込み完了後に割り込みがくることを期待するコードになってた。
>>「期待した以上に遅れて割り込みが起こるかもしれない」という可能性を捨ててはいけない。 なるほど。これは重いお言葉です。 確かにその通りだと思います。 >やっぱり書き込み完了後に割り込みがくることを期待するコードになってた。 わざわざ確かめていただきありがとうございます。 まずは問題の切り分けから週末にはじめていきたいとおもいます。
>>878 毎度思うが、ひげタンは人当たりがソフトな書き方らねぇ。
>まずは問題の切り分けから週末にはじめていきたいとおもいます。
読み書き自体は動作していて、実機では問題ないなら、TODOリストにだけのっけておいて
放置する戦術もありだと思ふ。
そのうち通りすがりでその道の達人が指摘してくれるかもよ。
ただし、TODOリストが公開される必要はあるが。
doxyなら、@todo Help達人 て書いときゃいいんじゃないかな。
初めてここみてギャグスレかと思ったらみんなマジだった・・・ネット上で以心伝心なんてちょっと感動 漏れもさんかしようかなぁ
ぶっちゃけそんな喪前が好きだ
>読み書き自体は動作していて、実機では問題ないなら、TODOリストにだけのっけておいて >放置する戦術もありだと思ふ。 そうですね。今日実験してみたところ、3時間ほど放置しましたが やはり割り込みはきませんでした。(仕事しながらだったのでちょっと自身なしですがw) TODOリストにあげておいて、後回しがいいかもですね。 いろいろとありがとうございました。m(__)m
役に立てなくて申し訳ないね・・・がんがってちょ。
>>882 s/自身/自信
>>872 さん
いろいろありがとうございます。
私なんかより、数倍できる方のようで
自分の力不足を痛感します。
やっとFAT12の実装に取り掛かった模様。
ぐりぽん氏に教えてもらった
http://www.vector.co.jp/soft/data/hardware/se016321.html の資料で奮闘中。
ファイルシステムの開発はMonaとできるだけ切り離して行えるよう
別環境を用意して開発中です。
インターフェースDiskDriverが、その役割を担っています。
ルートディレクトリのエントリの取得と512byte以下のファイルの中身が取得できました。
ファイルシステムでどこまでのパラメータ等をメモリに持つかを迷います。
必要なときに読むか、一度読み込んで変更があるまではキャッシュしておくか等迷いどころです。
ファイルバッファのキャッシュは、更に上位のレイヤーで行おうと目論んでいるのですが
果たしてそこまで行くかどうか。
ひさしぶにりこの板に来て、初めてこのスレ見つけた。 なんだか俺が忘れてしまったものを思い出したみたいだよ。 昔はコンピューターをいじくっているだけで楽しかったのに、いまは仕事になっちゃった。 おまえいらの熱意に乾杯。 モナープロジェクトを全部読み直して、俺も参加準備するぜ!
>>887 がんばれー。
漏れも参加準備しようかな。
>>889 いろいろ準備はあるぜ。
もう俺はクロックやペアを考えながらアセンブラでかけなくなっちまったし、
makeファイルもかけねえ。
VisualStudioとかJBuilderとかのIDEがないとプログラムが書けない屁たれになっちまった。
あとな、
そ も そ も モ ナ ー プ ロ ジ ェ ク ト が
ど う い う も の か わ か っ て な い
>>890 深く考えなくていいでない?昔、アセがかけていたなら思い出すでしょう。
当たって砕けてください。
makeは、
<生成物> : <材料1> <材料2>...
<tab>コマンド1
<tab>コマンド2
例)
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c hello.h
gcc -c hello.c
すべての材料の更新日付と生成物の更新日付を比較して、生成物のほうが
古かったらコマンドを実行する。
これとマクロの使い方を知っていればすぐ使えると思う。
マクロ(特別なマクロも)は他の人よろしく。↓
、, ヾi\ _、- lヽ ヾlll\ _,.-‐'''llllllllヽ |ヾ゙l ,,,,,,,,,;;;;;;;;;;;)lllllllllllllllllllllllllllllヽ |ヾ゙l ;;;;;;;;;;;;;;;;_、-‐'''^^~~ ̄ ̄ ̄ ̄ ̄ ̄~~`^^^ ー--、 |ヾ゙ ,.、--‐‐''´ ___ l i /⌒l ヽ | (ー----−−― ―― ''^^^~ =二三/ l l ヾ'''ノ __,ノ |//`ー‐--、,._____ ゛゙ l ト、_  ̄`ゝ |ノ,/ /////////~`^ヽ、_____ ___,,..、、、ト-テ‐‐‐'' ̄ |ノ/ `~^ー‐--、////ノlllllllノ~`^^^フll/ |ノ  ̄ ̄/lll/ // // ` `'
マグロかよ!! とか言いたかった…
894 :
デフォルトの名無しさん :03/04/17 07:36
(^^)
896 :
デフォルトの名無しさん :03/04/19 01:21
山崎上げ
∧_∧ ( ^^ )< ぬるぽ(^^)
ヒゲポソ、最近のすすみ具合はどんなもんですか? 突然だが、Gentoo 1.4 rc_4 の Live CD がものすごく格好良いす。 参考になればと思って言ってみますた。
>>898 FAT12のドライバをMonaとは切り離して実装中です。
読み込みに関しての仕様をやっと把握できたのでがりがり実装中です。
ただ仕事が最近も忙しいため、昔ほどは思うようには時間が取れない状況です。
やる気だけは、あるのですが・・・
一応以下の感じで進む予定です。
ファイルシステムの実装
ユーザーモードの実装
ファイルシステムをユーザーモードで呼び出すことにより
マイクロカーネル化
シェルの実装
名無したんが鮮やかに900げっとヽ(`ー´)ノ
ど素人のプログラム全然判りませんな人間ですが、質問していいデスか? ファイルシステムって絶対決めちゃわないといけないんですか? よく判らないんですが、例えば MacOS X ではバーチャルボリウムレイヤがあって、その上で動いてますよね? だから、バーチャルボリウムレイヤが対応していればどんなファイルシステム上でも一応動作できるようになってますよね? そう言う風には出来ないんですか? って言うのがどれほど大変な事なのかも判らないやつなんですけどね。 変な事書いてすんません。
>>901 > そう言う風には出来ないんですか?
いくらでもできるだろ。
と言うか今時の OS は、複数のファイルシステムをサポートするのは珍しくない。
当然どっかのレイヤーで仮想化していると思うよ。
それに仰々しい名前を付けて知ったか君にネタを提供するかだけの差だと思う。
>よく判らないんですが、例えば MacOS X ではバーチャルボリウムレイヤがあって、その上で動いてますよね? >だから、バーチャルボリウムレイヤが対応していればどんなファイルシステム上でも一応動作できるようになってますよね? バーチャルボリウムレイヤはあくまでも「バーチャル」なので、論理的な存在だということ。 どっかで物理的なフォーマットを用意する必要があって、OSのレベルだとそれも用意しておく必要あるってこと。 実際にファイルにアクセスして読み書きすることもOSの仕事のうちだからね。こんなところでOK?
多忙につき開発低迷中。以前ソース整理をしました。 その結果、現在のMonaのソース行数は以下のようになっています。 stl_portは、私の書いたソースではありませんので*.cpp, *.hが 本当の行数ですね。 SLOC Directory SLOC-by-Language (Sorted) 42535 src_stlport ansic=42533,sh=2 2889 src_top_dir cpp=2323,asm=566 957 src_include cpp=678,ansic=279 92 src_FreeBSD ansic=92 57 tools cpp=57 Totals grouped by language (dominant language first): ansic: 42904 (92.21%) cpp: 3058 (6.57%) asm: 566 (1.22%) sh: 2 (0.00%)
正直、Monaの進行速度には不満がないと言えば嘘になるけど、 自分が参加して引っ張る余力もないから批判はできないねぇ……
>>892 どうでもいいが、それホントにマグロか?
鰯?
環境ホルモンで死にかけのシーラカンスみたいだ
>>905 たしかに、Monaの開発速度は以前より遅くなっていると思います。
多忙なせいなのもありますし、ひげぽんの怠慢もあると思います。
何とかモチベーションを維持してがんばります。
というわけで、Monaにはまだ組み込まれていませんが
FAT12ドライバーの読み込み部がなんとなくできましたw
ドライブレターをまだ決めてないのですが一応ファイル内容が読み込めています。
以下テストサンプルコード
910 :
ひげぽん ◆Ngzcp/NZpA :03/04/29 23:16
if (!fat->initilize()) { int errorNo = fat->getErrorNo(); if (errorNo == FAT12::BPB_ERROR) printf("BPB read error \n"); else if (errorNo == FAT12::NOT_FAT12_ERROR) printf("NOT FAT12 error \n"); else if (errorNo == FAT12::FAT_READ_ERROR) printf("NOT FAT12 error \n"); else printf("unknown error \n"); /* error */ return -1; } printf("fat initilize\n"); if (!fat->open("SOMEDIR\\DIR1\\DIR2\\DIR3\\DIR4", "SOME.CPP", FAT12::READ_MODE)) { printf("open failed"); } while (fat->readHasNext()) { byte buf[512]; fat->read(buf); for (int i = 0; i < 512; i++) printf("%c", (char)buf[i]); }
Monaの他のOSと比べてのアドバンテージは何?
ネタとして 気分だけ盛り上がって、放置気味のファイルを公開します。 何かMonaでの有用な使い道が見つかったり、改良してくれる人が いたりしたらうれしいです。 BitMap.cpp/h ファイルシステム実装勉強中に勢いあまって作ったものの使用していない メモリ管理やら、クラスタ管理やらに使えるかも。 rtc.cpp リアルタイムクロックで、日付時刻を取得しようとしつつ いつの間にか忘れてました。FAT12書き込みのときまでには必要ですね。 Monaのほかの部分と結構独立しているので誰か、完成させてくれないかなあ(ボソ SystemInfo.cpp cpuidという命令を使用して、現在Monaを実行しているCPUが何者なのかを 知ろうとする機能を持たせようとしました。 ベンダーIDを取得したところで別の機能の実装に入ってしまいました。 これもうまく拡張すればいろいろ便利かも。
>>911 >Monaの他のOSと比べてのアドバンテージは何?
今現在は全然アドバンテージにはなっていないですが
カーネルがNASM, GCCを用いて少量のアセンブラと大量のC++で実装されていること。
オブジェクト指向をカーネル実装にも適用しようとしている。
UNIXクローンや、POSIX準拠を目指しているわけではないので
フットワークが軽い?
あたりでしょうか。
いま、
>>914 がいいこと言った。
特に初めの方は、またいつものネタスレかよ... という感じで叩かれもしたけど、きちんと対応してたからここまで来れたんだと思う。
俺も色々勉強になったし、何よりやる気が重要であることを再確認させられた。
厨房化が著しいこの板で一番まともなスレだと思う。
>>914 ,915さん
なんだかとても恐縮です。m(__)m
今日は
>>912 で書いていたBitMapクラスを
FAT12のクラスタ管理に使用するようにしました。
FAT12.cppは、読み込み部だけでソースが10KBなので
他の機能と比較してわりとコード量が多めですね。
FAT12の実装状況ですが createFile,changeDirectory, read, writeの実装が なんとなく完了しました。 事前に用意していたBitMapクラスが意外と重宝しました。 残すは bool FAT12::rename(const char* from, const char* to) {return true;} bool FAT12::remove(const char* file) {return true;} bool FAT12::removeDirecotry(const char* name) {return true;} bool FAT12::makeDirectory(const char* name) {return true;} ですが、優先度が低いため後回しにされる可能性が高いです。 とりあえず来週は、FAT12.cppをカーネル本体に組み込むテストと りファクタリングに時間をとる予定です。 少しでも対応するファイルシステムを増やしたいので ファイルシステムに共通のインターフェースを考えて行きたいです。 Solarisのvnodeインターフェースメソッドのようなものの簡易版ですね。 read, write, open, close, mkdir, rmdir, rename, link, unlink seek, fsync, ioctl, create あたりでしょうか。
忘れないように覚書です。 FAT12#writeで ファイルサイズが小さくなる場合に、クラスタを開放する処理を 入れ忘れました。しまった・・・
ヒゲポソガソバレ(゚д゚)!!
920 :
デフォルトの名無しさん :03/05/07 21:17
はじめまして、私もFAT12実装中です^^ ところでヒゲポンさんは、WINとの相性は 考えます?
>>920 相性とは
FAT12@MONAで読み書きしたディスクがWindowsでも
読み書きできるということですか?
そうであれば、多少は気にしています。
OSとしての互換性、例えば実行ファイル形式等は
特に相性は考えていません。
FAT12の実装をしていて個人的に思ったのですが
既存のファイルシステムのドライバ?が欲しいのであれば
習作以外では、誰かのを作ったのを流用するほうが賢いと思いました。
私は素人なので勉強になったのですが
OSのほかの部分に時間を割いたほうがいい場合もあるかなと。。。
922 :
デフォルトの名無しさん :03/05/07 23:45
んでできたんすか?
読み書きは出来ました。ドライバレベルですが。 Windows上からも一応認識してくれている模様。 ただ918のやつはまだ対応していません。m(__)m
>>919 ありがとうございます。
もし興味がありましたらMonaプロジェクトへ是非(笑)
MEG-OSの次回策はMonaのプラグインということでよろしいか?
926 :
デフォルトの名無しさん :03/05/07 23:57
いろんな意味でアフォウだがその精神はすごいなぁ。 「作ろう」って言うだけ逝って逃げるウンコとは違うようだ。 最終的にはWINDOWSなしで直に起動できればおもろいんだがなぁ。 ってそれが目標ですか?
>>926 >最終的にはWINDOWSなしで直に起動できればおもろいんだがなぁ。
>ってそれが目標ですか?
こんにちは。Monaは、いちおうWindowsなしで起動しますよ。
ただそれは、Monaがすごいとかではなく
兄貴分?のNWSOS,OSASK,MEG-OSでもとっくに実現されていることです。
OSとしての機能を以下に追加していくかが課題です。
いまはMonaは最低限の機能さえ実装できていないので
まずはそこからです。m(__)m
近々Monaの上でMona用のアプリが作れて動かせるようになったら色々やってみたいですね(w 開発も大変でしょうががんばってください。応援してます。 (へっぽこプログラマな私には何もお手伝いできませんが・・)
> FAT12の実装をしていて個人的に思ったのですが > 既存のファイルシステムのドライバ?が欲しいのであれば > 習作以外では、誰かのを作ったのを流用するほうが賢いと思いました。 完全なマイクロカーネルにまでは時期尚早ですが、 何らかのダイナミックロードというかプラグインが出来るようにして、 OSサーバとして他のフリーなOSのコードがそのまま動くようにしておくと、 (そのままと言ってもサーバ部分の再コンパイルは必要ですが) いくらでも潰しが利くんじゃないかと思います。 別にPOSIX準拠が目的でなくても、 DarwinみたいにBSDレイヤを動かせば自動的にBSDになりますし、 Mona独自サーバを動かせば独自モードになります。 それがマイクロカーネルですから。 DarwinのソースとFreeBSDのソースを比較してみると色々と面白いです。 古いDarwin 1.3.1はVPCでも動くはずです。 > 私は素人なので勉強になったのですが > OSのほかの部分に時間を割いたほうがいい場合もあるかなと。。。 純粋に効率から言うとそうですね。 見たところ一部FreeBSDのコードが入っているみたいですが、 こうやってつなぎで取り合えず突っ込んでおいて、 後で純血(?)を追求できる余裕があるときにでも リプレースしてしまうというのも手です。
全然関係ない質問ですがよろしくお願いします。 bochsでエミュレートする時fd.cという名前のファイルをリンクしたバイナリから起動したら 3rdExceptionを吐いてしまいます。 そこでfd.c->aiueo.cに変えてみると今度は動くのです。 bochsに禁止語句か何かあるのでしょうか? エラーはLOCK PREFIX UNALLOWEDと出ています。 bochs 2.02 on linuxでの話です。
エェーPOSIX準拠目指してよぉ
>>928 さん
>近々Monaの上でMona用のアプリが作れて動かせるようになったら色々やってみたいですね(w
>開発も大変でしょうががんばってください。応援してます。
ありがとうございます。道のりは長いですががんばります。
>>929 さん
>OSサーバとして他のフリーなOSのコードがそのまま動くようにしておくと、
>(そのままと言ってもサーバ部分の再コンパイルは必要ですが)
>いくらでも潰しが利くんじゃないかと思います。
なるほど参考になります。
>DarwinのソースとFreeBSDのソースを比較してみると色々と面白いです。
>古いDarwin 1.3.1はVPCでも動くはずです。
おお。面白そうですね。
ソースを探してみたのですがちょっとどの部分がcoreなのか分かりませんでした。
ttp://www.opensource.apple.com/darwinsource/1.3.1/index.html >後で純血(?)を追求できる余裕があるときにでも
>リプレースしてしまうというのも手です
なるほど同感です。
>>931 さん
>エェーPOSIX準拠目指してよぉ
現在はPOSIX準拠は視野に入っていません。
というか詳しく知らないのが現状です。
もっと勉強してから考えさせてください。
>>931 自分で頑張れ。
ここはそういう板 (のはず) だ。
>FAT12@MONAで読み書きしたディスクがWindowsでも >読み書きできるということですか? そうですね^^読み書きだったら、FATの考えかただけ わかれば作れるのですが、WINだとどうなっているか?と 考えると、少し行き詰ってしまうんですよね^^ >OSとしての互換性、例えば実行ファイル形式等は >特に相性は考えていません。 実行ファイル・・・考えたくない事項ですなぁ^^;
>>932 > ソースを探してみたのですがちょっとどの部分がcoreなのか分かりませんでした。
xnuです。
あと以前誰かが言ってましたが、
引用符">"と引用文の間に空白を入れておかないと
数字が行頭に来たときにリンクだと誤認識されてうざいです。
>>932 > 現在はPOSIX準拠は視野に入っていません。
> というか詳しく知らないのが現状です。
> もっと勉強してから考えさせてください。
POSIXを自前実装するのは時間の無駄と思う。
DarwinやRT-Machと同じようにFreeBSDをOSサーバ化して乗っけた方が簡単。
別にLinuxでやってもいいけど。(MkLinux)
というかはっきり言ってそうでもしないと個人レベルの作業量じゃ無理。
# RT-Machのページは閉鎖されちゃったみたいで残念……。
なぜα版品質にもなってないのにβ名乗ってるの?>Mona αとかβとかの意味わかってる?>ヒゲポソたん
>>937 とりあえず、知ったかぶるのは止めといた方がいいと思うよ。
>>938 グローバルスタンダードの時代に俺用語はまずいだろ
>>939 俺用語はまずくて俺OSはいいわけですか。そうですか。
(゚д゚) ハルダナァオイ
新スレの季節だねぇ
944 :
デフォルトの名無しさん :03/05/09 21:11
そうだねぇ。
演 出 過 多
>> 935 > xnuです。 ありがとうございます。いま登録しました。 > あと以前誰かが言ってましたが、 > 引用符">"と引用文の間に空白を入れておかないと > 数字が行頭に来たときにリンクだと誤認識されてうざいです 失礼しました。m(__)m >> 937 > なぜα版品質にもなってないのにβ名乗ってるの?>Mona > αとかβとかの意味わかってる?>ヒゲポソたん するどいですねぇ。 まああまり気にしないでください。(笑)
>>948 乙彼〜
ところでちょっとした疑問なんですが何故日本語で書かないんですか?
それだけでも厨房にとっては読みやすさが月とすっぽんです〜
海外の開発者を呼び込もうって言うならそもそもsf.jpじゃなくてsf.net使うべきだし……
>>949 doxgenで日本語を扱いづらいからだと思う
このぐらいの英語で困る人もあまり居ないだろうし
>>949 > ところでちょっとした疑問なんですが何故日本語で書かないんですか?
> それだけでも厨房にとっては読みやすさが月とすっぽんです〜
> 海外の開発者を呼び込もうって言うならそもそもsf.jpじゃなくてsf.net使うべきだし……
そうですね。一応海外の開発者を呼び込もうという目論見でしたが
呼び込まれていません。(笑)
>> part6 36さん これはいいものを見せてもらいました。 デザインパターンにそった非常にまとまりのいいコードのようなので、 読みやすいです。コメントが日本語なのも心強いです(笑 言語自体も、型を取り去って、簡略化したJavaみたいなものなので、 分かりやすく、気楽な感じでイイと思います。 Wabaだとクラスファイルへのコンパイラを用意しないといけないのですが、 これならその必要もないですし、このへんからやってみるのもいいかなと思っています。
まもなくここは 乂1000取り合戦場乂 となります。 \∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,, /三√ ゚Д゚) / \____________ ,,、,、,,, /三/| ゚U゚|\ ,,、,、,,, ,,、,、,,, ,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/ //三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ∪ ∪ ( ) ( ) ( ) ) ,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ,,、,、,,, ( ) ( ) ( ) ( )
956
957
958
959
960
961
962
963
964
965
966
967
968
969
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987 654321
>>987 最初何のことか分からなかったけど気付いて笑っちゃった
989
990
991
>>1000 1000ゲットにふさわしい書き込みを期待していますよ
993
994
995
996
997
998
999
1000 :
1000 :03/05/13 00:59
,rn r l l n | 、. !j ゝ .f _ | | ,r'⌒ ⌒ヽ、 ,」 L_ f ,,r' ̄ ̄ヾ. ヽ. ヾー‐' | ゞ‐=H:=‐fー)r、) | じ、 ゙iー'・・ー' i.トソ ひげぽんマンセー \ \. l、 r==i ,; |' \ ノリ^ー->==__,..-‐ヘ___ \ ノ ハヽ |_/oヽ__/ /\ \ / / / |. y' /o O ,l |
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。