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

OSを作ろうpart5

■ このスレッドは過去ログ倉庫に格納されています
0001(・∀・)yossy ◆FlasH.X1/s NGNG
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

Monaプロジェクトページ
ttp://mona.sourceforge.jp/

OSをつくろうpart4
http://pc3.2ch.net/test/read.cgi/tech/1037096449/
OSをつくろうpart3
http://pc3.2ch.net/tech/kako/1027/10270/1027080631.html
OSをつくろうpart2
http://pc3.2ch.net/tech/kako/1024/10244/1024411711.html

プロジェクトメンバーになりたい方は、
[email protected] までメールをどうぞ。

最新のイメージファイルは以下のURLから落とせます。
ttp://mona.sourceforge.jp/Download.html

ソースファイルの閲覧はここからできます。
ttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/mona/mona_v1.0/
0002ひげぽんNGNG
ズサ━━━━⊂(゚Д゚⊂⌒`つ≡≡≡━━━━!!
0003デフォルトの名無しさんNGNG
新スレおめ
0004デフォルトの名無しさんNGNG
3GET、ごめんなさい・・・(確○犯
0005デフォルトの名無しさんNGNG
あ・・・
0006デフォルトの名無しさんNGNG
嗚呼・・・
0007デフォルトの名無しさんNGNG
嗚呼…
0008デフォルトの名無しさんNGNG
乙
0009山崎渉NGNG
(^^)
0010デフォルトの名無しさんNGNG
読んでみた。
前半は難解だったけど最後まで読んだら
ネットについての理解が格段に深まった。
ありがとう。

他の人も、煽ってばかりじゃなくて
一度読んでみるといいと思う。
0011デフォルトの名無しさんNGNG
age
0012デフォルトの名無しさんNGNG
>>10
何を読んだの?
>>1 のソース?
0013デフォルトの名無しさん NGNG
俺も暇だからブートの部分だけ勉強してみよ
0014デフォルトの名無しさんNGNG
前スレ落ちた?
0015デフォルトの名無しさんNGNG
>>14
落ちたみたい

もっとガンガン埋めとくべきだった、、、
0016山崎渉NGNG
(^^)
0017デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/os/1031404041/904

>Mona が Unix user にちょっとだけ出てた

だそうですが、読んだ人いませんか?
0018デフォルトの名無しさんNGNG
>>17
bochsの記事で、bochsのデバッグ機能が『mona』のブート部分の開発に役立った
というものでした。
001917NGNG
>>18

ありがとうございますた。
0020デフォルトの名無しさんNGNG
>>18
なんかそれだけみると。bochsの何のために有るか分からん機能が
monaに役に立った。って書いてあるように見えるなぁ。
0021デフォルトの名無しさんNGNG
>>18
ひげぽん「また落っこちました〜」
まわり「だからbochsのログだせやぁ」

の流れを思い出しました。w
0022ひげぽんNGNG
>>21
>の流れを思い出しました。w
あの時も、今もたくさんの人のお世話になっているということですね(笑)

ところで今日は、TSSを使わないタスクスイッチの簡易実験に成功しました。
eflags, csがいまいち更新されてなくて怪しいなど
不確定な要素満載ですが、一歩前に進みました。

アドバイスを下さったたくさんの方々、本当にありがとうございました。m(__)m
0023デフォルトの名無しさんNGNG
マーはニーしる!
を思い出しました。
0024デフォルトの名無しさんNGNG
>22
「タスク切り替え」なんてものは、定義が適当だし、今の段階では
実際的な「タスク切り替え」とは程遠いので、あんまり大したこと
ではない。
0025ひげぽんNGNG
>>24
>「タスク切り替え」なんてものは、定義が適当だし、今の段階では
>実際的な「タスク切り替え」とは程遠いので、あんまり大したこと
>ではない。
全くおっしゃるとおりです。
ただ今回の実験を通していろいろ勉強できたので
自分的には収穫は大きいです。
0026デフォルトの名無しさんNGNG
何か最近Monaの進歩状況がよくわかんないな〜
知りたきゃCVSから取ってこいってのは敷居高くない?
わざわざトップページ更新するほどじゃないのかもしれんが、
SF.jpに日記機能あるんだし、開発日誌みたいなの公開しないの?
https://sourceforge.jp/developer/diary.php?diary_user=2006

CVSを取ってこないと分からない例
1. STLがどうなったのか
2. VPC対応がどうなったのか
3. タスク切り替えがどうなったのか

あと64bitの話が出てたがどう考えてるの?
新規開発者が加入されたようだけどHP更新されてなくて可哀想...

ま、辛口だったかもしれんが、応援してるんで頑張ってちょ
0027ひげぽんNGNG

>何か最近Monaの進歩状況がよくわかんないな〜
>知りたきゃCVSから取ってこいってのは敷居高くない?

ご意見ありがとうございます。
こういうところは、なかなか自分で気付かない所なので
ご指摘は大変ありがたいです。

以下ひとつずつ、回答いたします。

>わざわざトップページ更新するほどじゃないのかもしれんが、
>SF.jpに日記機能あるんだし、開発日誌みたいなの公開しないの?
>https://sourceforge.jp/developer/diary.php?diary_user=2006

開発のソースレベルの変更をお知りになりたいのであれば
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/mona/mona_v1.0/src/ChangeLog
よりChangeLogを見ていただくのが良いかと思います。
CVSにコミットする場合は何らかのコメントを入れています。

それ以外に必要であれば、どこかに近況を入れようかと思いますが
どこが良いでしょうか。皆さんのご意見をうかがいたいです。

(1)sourceforge.jpの日記
(2)MonaBBS
(3)Monaトップページ
(4)作ろうスレ(ここ)
(5)メーリングリスト作成(現在非公開の開発者用メーリングリストはあります)
(6)その他
0028ひげぽんNGNG
長くなってしまったので分けて。

>1. STLがどうなったのか

STLPortが使えるようになりました。
カーネルの実装にはまだ用いていませんが、いずれ使う事になると思います。
特にコレクションなど。

>2. VPC対応がどうなったのか

昨日にやっと、VPCでのブートとタスクスイッチが動作しました。
ただイメージとして公開している物は古いバージョンなので
VPCでは動きません。

イメージとして最新版を公開していないのは
現在タスクスイッチ(TSSを使用しないバージョン)の動作がまだあやしいためです。
安定後公開したいと思います。

もしどうしても最新版のイメージがほしい場合は、Make環境を整えていただくか
ひげぽんに言っていただければ、何とかいたします。

>3. タスク切り替えがどうなったのか

ここ最近、ずっと実験中かつ、実験が失敗していたので特に進捗はありませんでした。
昨日やっと、少しめどがたったのでいろいろな実機で実験しようと思っています。
0029ひげぽんNGNG
>あと64bitの話が出てたがどう考えてるの?

IA32アーキテクチャの理解もままならないのでしばらくは
64bit化を見据えた開発はしないと思います。
ただ、どなたか詳しい方がいらっしゃって
アドバイスいただけるのであれば、積極的に今からある程度
準備するのはありだと思っています。

>新規開発者が加入されたようだけどHP更新されてなくて可哀想...

すいません、なるべく早く追加いたします。
yuryuさんこれを見ていたら、開発者メーリングリスト宛に
メールください。

>ま、辛口だったかもしれんが、応援してるんで頑張ってちょ

貴重なご意見ありがとうございました。
他にも同じような事を思われていた方もいらっしゃると思うので
できるだけ改善していきたいと思っています。
0030デフォルトの名無しさんNGNG
> ここ最近、ずっと実験中かつ、実験が失敗していたので特に進捗はありませんでした。
> 昨日やっと、少しめどがたったのでいろいろな実機で実験しようと思っています。
こういうようなことを、自分の言葉で書ける日記は特別な意味があると思う。
→「あれやった、でも駄目だった、と思ったら勘違いだった」みたいな
他人にとっても泥臭さを通じてmonaを身近に感じる人もいるだろうし、
後で自分のやってきたことを見返すときにもきっと役立つ。
0031デフォルトの名無しさんNGNG
>1. STLがどうなったのか
こういう書き方だと、
2chブラウザとかで >>1 と混同される

これに限らないがこの手の混同を避けるため
引用符と引用文の間はスペースを空ける慣習があるんだよ
0032デフォルトの名無しさんNGNG
何でひげぽんさんはこっちではトリップ付けないの?
MonaBBSではこんなにはじけちゃってるのに(藁
> (´∇`)ヒゲポソ ◆Ngzcp/NZpA

トリップは自衛の手段なんだから。
偽者がめちゃくちゃ書く可能性を自分で作ることになるよ。
こっちでもはじけちゃいなよ(藁
0033デフォルトの名無しさんNGNG
>>32
なんかあってからそのトリップつけりゃいんじゃない?
0034デフォルトの名無しさんNGNG
おまい、しんでからシートベルトつけても遅いんだぞ
0035デフォルトの名無しさんNGNG
つーか、書いてる内容でだいたいわかるだろ。
荒らすような偽者には、このスレは敷居高いと思う。
003633NGNG
>>34
ぬ、MonaBBSで >>32 のトリップ使ってるのかと思ったんだが、
どうやらさっき確認した限りではそういう例が見つからなかった。
勘違いですた。

というか、トリップなんて後で適当に決めちゃってもオフイシャルページで宣言しちゃえば問題ないじゃん。

>>35
まぁね。分かるよね。騙すにはそれなりに技術レベルも必要だし。
0037デフォルトの名無しさんNGNG
>>36
一体全体、どこ探したの???
http://pc3monaos.hp.infoseek.co.jp/cgi-bin/2ch/test/read.cgi/entrance/1042291353/l50

あと誰も書き込まないMonaBBSで付けてるのに
荒らしの巣窟の2chで付けないことをなぜ擁護するか理解できん。
0038デフォルトの名無しさんNGNG
> 荒らすような偽者には、このスレは敷居高いと思う。
ひげぽんさんが登場するのはこのスレだけではないと思われ
それこそOSASKとかNWSOSとかの絡みでしょっちゅう引き合いに出されてるし
0039デフォルトの名無しさんNGNG
ていうか前はトリップ付けてたけど…
004033NGNG
ほんとだpart3みたらついてる、、、
0041デフォルトの名無しさんNGNG
にしても、NWSOSの進行が速いな。さっき最新版ダウソしたら
いつのまにか、いろんなGUIアプリが動いてた。ってかメモ帳程度の
ものが当たり前に動いてるし、

なんなんだ、いったい
0042デフォルトの名無しさんNGNG
MONAもNWSOSも自作組み立て機で動いた。わーい

#会社のPCなんで、linux入れてProxyキャッシュサーバとして稼動させる
のが本来の予定だったんだけど、NWSOS動かしたら周りの人が、なにそれなにそれ
みたいな感じで群がってきた。MONAは、今のところBIOSっぽい画面なんで
BIOSと思われてるらしく、あまり注目されてなかった。
ってことで、MONA頑張れ。
0043デフォルトの名無しさんNGNG
>>41-42

桜?
頑張れ。
0044デフォルトの名無しさんNGNG
>>43 は友達がいないタイプだな
0045ひげぽんNGNG
>>31
> 引用符と引用文の間はスペースを空ける慣習があるんだよ
了解しました。

> 何でひげぽんさんはこっちではトリップ付けないの?
> MonaBBSではこんなにはじけちゃってるのに(藁

>>32-40
面倒だったので付けていませんでした。>トリップ
なのでつけてみました(笑)
トリップを付けるかどうかは、結構気分かもです。ごめんなさい。

>>42
> みたいな感じで群がってきた。MONAは、今のところBIOSっぽい画面なんで
> BIOSと思われてるらしく、あまり注目されてなかった。
> ってことで、MONA頑張れ。

NWSOSと比べられたら、大負けですね。
というか、どのOSと比べても負けてる。
もっといえばBIOSのほうがすごい・・・
でもがんばります、ありがとうございます。
0046ひげぽん ◆Ngzcp/NZpA NGNG
トリップ失敗。。。

さてMonaの進行状況は技術的なことであれば、なるべくここに書いていこうと
決めました。

昨日はタスクスイッチ実験成功コードを見直していたところ
どうも動いていたのは奇跡かもという結論に達しました。

iretではなくretで切り替わっていた模様。
なのでEFLAGS,CSチェンジが起こっていなかった。

またスタックに積まれていると予期していたものと
実際でいろいろ勘違いがありました。

ある時点でスタックに積まれている内容を
そこで処理がとまっていいので表示したい場合は
汎用レジスタにpopして表示でいいんですよね?自信なし

自分でスタックを初期化して作ったプロセスのほうは
popaように0を積んで、eflags,cs,eipとやってiret
切り替えられました。(process2)
0047ひげぽん ◆Ngzcp/NZpA NGNG
ただ起点となる(process1)の切り替えがうまくいかない
timerHandler
    schedule
        switchProcess
            ここで切り替え

インテルのマニュアルを読むと
エラーでない割り込みであれば
/* EFLAGS */
/* CS     */
/* EIP    */
と積まれているはずなのに、うまくいかないっす。
それぞれtimerHandler,scheduleのアドレスが
pushされているかと二つpopしてやってみたがうまくいかず・・・
0048ひげぽん ◆Ngzcp/NZpA NGNG

スタックの内容が表示できるよう
#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?
かなあ。
0049ひげぽん ◆Ngzcp/NZpA NGNG
表示が乱れてしまいました。
すいません。

> ところでCSて16bitだけど
> 割り込みでスタックに積まれる時は32bit?
> かなあ。

32bitのようです。
サンクスmitkoさん。
0050デフォルトの名無しさんNGNG
非プログラマブル部分があるからね>CS32BIT
0051デフォルトの名無しさんNGNG
もうおそいけど、次スレ作る際に現行スレのコピーとっておいて、
どこかのWEBページで見れるように保存しておいてほしかったなぁ。
前スレがDAT落ちしまくって後から来たものにはなにがどうなってるのか
分からない罠。

前スレの保存公開は禁じられてるのなら仕方ないけど。
0052FreeDOS教徒NGNG
>>51さんがこう言ってるんだし、
とりあえず過去ログどっかに置いていいんじゃない?>ひげぽん

とか言うのもナンなのでHTML化されるまで出しておきます。
ttp://guriponn.tripod.co.jp/archives/os-part4.htm
0053デフォルトの名無しさんNGNG
>freedos教徒さん

ご苦労様です。
ありがたく拝見されていただきます。
0054デフォルトの名無しさんNGNG
↑拝見させて、だね
0055デフォルトの名無しさんNGNG
>>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");
}
とかするとよろし。
0056デフォルトの名無しさんNGNG
しまった。タブ入れ欄内の忘れてた。スマソ
0057デフォルトの名無しさんNGNG
漢字むちゃくちゃだ。モチツケ漏れ
0058ひげぽんNGNG
まさに今スタックのぞきみを思案中です
インラインとprintfでやってますがうまくいかないです
0059デフォルトの名無しさんNGNG
>>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 で終わるので注意。(前スレあたりでがいしゅつ)
- 例外の場合はエラーコードがプッシュされる場合があるので注意。

なんか要約したつもりが余計長くなってしまった。
0060デフォルトの名無しさんNGNG
>>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
0061デフォルトの名無しさんNGNG
(昔の雰囲気が戻った)
0062ひげぽん ◆Ngzcp/NZpA NGNG
#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);
}
0063ひげぽん ◆Ngzcp/NZpA NGNG
皆さんのご教授をもとに作って見ました。
とりあえずこれを使って、昨晩はtimerHandler突入後のスタックを
調べてみましたが
CS=0x08らしきものすらスタックに積まれている様子がなくて
戸惑っています。

考えられる可能性は
・_sysdumpStack()がバグっている
・_sysdumpStack()の前にすでにスタックが破壊されている
・ひげぽんの大きな勘違い
・その他。

とりあえずいきづまったので寝てから、もう一度冷静に考えてみます。
0064ひげぽん ◆Ngzcp/NZpA NGNG
>>52
FreeDOS教徒さん
フォローありがとうございます。
yossyさんと検討してみます。>過去ログ
0065超先生@OS板 ◆leaf/RYZgY NGNG
< `ー´>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]
0066デフォルトの名無しさんNGNG
ちなみに、関数のプロローグは、標準的には、
push ebp
mov ebp,esp
sub esp,(AUTO変数のサイズ)

で、しかも、csとeipの順序が反対なので、

// <- esp
// [AUTO変数領域
// ...
// AUTO変数領域]
// [ebp ] <- ebp
// [eip  ]
// [cs  ]
// [eflags]
// [外側esp](もしあれば)
// [外側ss](もしあれば)

と夢の中でお告げがありましたのでご報告いたし上げます(南無)。
0067LightCone ◆sSJBc30S5w NGNG
だって。
0068ひげぽん ◆Ngzcp/NZpA NGNG
>>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));       \
}
0069ひげぽん ◆Ngzcp/NZpA NGNG
スタック覗き見作戦ということで
やってみました。

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は出来るけど途中で動きが止まってしまうようなやつを
コミットしても良いかと迷うのですがどうなのでしょうか。
0070ひげぽん ◆Ngzcp/NZpA NGNG
ソースチェックアウトしてMakeしたけど
スタックダンプしてとまるぞと、怒られそうで・・・

定常的にチェックして、
ソースからMakeしている人っているのだろうか。。。
0071デフォルトの名無しさんNGNG
C++なんだから、マクロなんか使わないで、インライン関数にしては?>>ヒゲポソタソ
0072デフォルトの名無しさんNGNG
>>69
そのためのブランチでしょ。
新しい実験を開始するたびにブランチすればいい。
0073デフォルトの名無しさんNGNG
>>71
スタック扱うのに?
0074デフォルトの名無しさんNGNG
>>73
インラインですが何か?
0075デフォルトの名無しさんNGNG
>>74
保証ない
0076デフォルトの名無しさんNGNG
>>75
逆汗してみ
0077デフォルトの名無しさんNGNG
>>76
コンパイルオプションを変えただけで動かなくなるかもしれない方法を薦めないように
0078デフォルトの名無しさんNGNG
>>78
だから逆汗してみっていってるでしょ
インラインアセンブラで書いた部分が最適化の影響を受けるとは初耳
0079デフォルトの名無しさんNGNG
>>78
インライン関数がインライン展開される保証は無いのですが
VisualC++なら__forceinlineなんてものがありますが
0080デフォルトの名無しさんNGNG
>>71
今回みたいにちょこっと実験してみるにはマクロが便利でつ
コンパイルオプションとかコンパイラとか、なるべく関係ないように書くには
アセンブリ言語が一番だけどナー
0081デフォルトの名無しさんNGNG
で、実際に逆汗してみた香具師いるわけ?
-O付けなければ一切インライン展開されない。
-Oが付いていればレベルに関係なく100%インライン展開される。
よって>>77は正しいが、-Oさえあれば保証はある。

ま、普通のコードでさえ-O3以上だとまれにバグるので、
環境に一切左右されないのは>>80の言うようにオール汗だな。
今のmonaの開発方針とは正反対になるけど。
だから最終的には気持ちの差。

############# 終 了 #############
0082ひげぽん ◆Ngzcp/NZpA NGNG
>>71
スタックを扱うので、ちょっとインライン関数は怖かったです。

>>72
ありがとうございます。
CVSコミットしちゃいました。

関係ありそうな箇所について-Sオプションでアセンブラコードを出してみました。
http://mona.sourceforge.jp/higepon/

timerHandler()
 ProcessManager::schedule()
  ProcessManager::swtichProcess2()
0083超先生@OS板 ◆leaf/RYZgY NGNG
< `ー´>y-~~ やっぱりinline展開されてない様子。 >switchProcess2
initProcessでtimerHandlerへの戻り先他を積んでおかないとダメか。

そもそもコンテキストスイッチをesp切り替えでやるのはあまりお勧めできないが・・・。
0084デフォルトの名無しさんNGNG
>>83
CVSでCFLAGSを見る限り、-Oが付いてないですね。
これではインライン展開されないです。

>>82
インライン関数はなるべくヘッダに書いた方が良いですよ。
他のクラスから使うのであれば絶対に。
0085ひげぽん ◆Ngzcp/NZpA NGNG
>>83
超先生さん
>initProcessでtimerHandlerへの戻り先他を積んでおかないとダメか。
なるほど
二つ手があると思っています。
(1)switchProcess2()は、インライン展開されていないので
schedule()からtimerHandler()に戻るために
initProcessでスタックにtimerHandlerへの戻り値を
格納しておく。
そしてtimerHandler()でiret
(2)iret(つまりタスクスイッチ)をswitchProcess2()で行ってしまう。
この場合はinitProcess()で初期化する場合には
timerHandler()への戻り値を格納しておく必要はなく
適当な値を積んで置く。
そしてタスクスイッチの前にスタックの値を
ひとつ捨てる。
(捨てられるのはtiemrHandelerのアドレスか初期化時に設定された適当な値)

うーんどちらがよいのでしょうか。
0086ひげぽん ◆Ngzcp/NZpA NGNG
>そもそもコンテキストスイッチをesp切り替えでやるのはあまりお勧めできないが・・・。

現状は、この方法しかわからないというのが真実です。
ほかに、もっとよい方法があるのでしたら
簡単でよいので教えていただけないでしょうか。
0087ひげぽん ◆Ngzcp/NZpA NGNG
>>84さん
アドバイスありがとうございます。

> CVSでCFLAGSを見る限り、-Oが付いてないですね。
> これではインライン展開されないです。

了解しました。
この辺の-Oオプションに詳しいサイト等ありましたら
教えていただけないでしょうか。
できれば、必ずインライン展開される/されない等
の情報があればありがたいです。

> インライン関数はなるべくヘッダに書いた方が良いですよ。
> 他のクラスから使うのであれば絶対に。

はい一応認識しています。
一応私の方針としてクラスメンバ関数のうち
インライン化するのはprivateなものだけにしようと
思っています。
まあなんとなくですが・・・
0088デフォルトの名無しさんNGNG
>>81
> -Oが付いていればレベルに関係なく100%インライン展開される。

この情報のソースある ?

VC では、forceinline 指定にもかかわらず、インラインにならない時があるんだけど。
0089デフォルトの名無しさんNGNG
>>88
monaのソースを逆汗して確認。
0090デフォルトの名無しさんNGNG
>>89
それってたまたまそうなってたってことじゃないのか ?

もしそうなら、「100%インライン展開される」とか書くなよ。
0091デフォルトの名無しさんNGNG
>>90
とりあえず、確認もせずにえらそうなことを言うのはやめてくれ。
インラインにならない経験があるんだったら、
それと同じケースがmonaの開発に使っている環境で再現することを示せば
背理法で何も議論する必要ないんだから。
0092デフォルトの名無しさんNGNG
>>91
要するに、100% インラインになることは、保証されてないわけね。

議論以前の問題だよ。
0093デフォルトの名無しさんNGNG
と、とにかく、、コンパイルOPTIONによって動くとか
動かないとかいうのはシステム的になんか嫌だな・・・。
OS作る前にもっとコンパイラとかオブジェクトコードの勉強しないと。。。
0094デフォルトの名無しさんNGNG
>>92
何一人で熱くなってんの?
とりあえず、Monaをダウンロードして、コンパイルしないと始まらないよ。
手を動かしましょうよ。そう思って逆汗逆汗って言ったのに。

Inline Limitを超えなければInlineになることは保証されてる。
それくらい自分で見つけると思ったんだけどなあ。
0095デフォルトの名無しさんNGNG
>>94
わかった、わかった。
貴方の環境では、100% インラインになるわけね。

これでいい ?

俺の環境で、100% 保証されない事がわかればどうでもいいです。
0096デフォルトの名無しさんNGNG
>>94
殺伐とした雰囲気には余りしたくないんだが、、、一つだけ言わせてもらう。
>>90 が言うように「たまたま」そうかもってのは考えた方がいいと思う。
注意事項とか、前提条件、仮定とかはなるべく少ない方がいいからな。
そういうのが多いと、人には理解してもらいづらいし、自分で書いたソースだって
一月もたてば結構忘れてしまうから、用心するには越したことがない。

0097デフォルトの名無しさんNGNG
>>95
はい、結構です。で、本題。
興味の方向から考えるに、貴殿は組み込み用のOSを手がけておられるとお見受けしますが、
タスクスイッチはどういう風に実装しておられましたか?
0098デフォルトの名無しさんNGNG
けんか(・A・)イクナイ!
0099デフォルトの名無しさんNGNG
>>96
と言うか、inline にする/しないなんて、コンパイラのバージョンで変わったりしそうでしょ ?
それに依存するのは、あまり良くないと思ってる。

>>97
> 興味の方向から考えるに、貴殿は組み込み用のOSを手がけておられるとお見受けしますが、
> タスクスイッチはどういう風に実装しておられましたか?

普通に TCB (Task Control Block) にレジスタセーブして、SP を再設定するだけ。
当時は、メモリ管理などはなかった。
また使ってた、68020 は、SP がユーザー/システム/割り込みで独立していたから、結構綺麗に書けた。
0100デフォルトの名無しさんNGNG
一人インライン信者がいるだけ
0101デフォルトの名無しさんNGNG
インラインスケート信者?
■ このスレッドは過去ログ倉庫に格納されています