はりぼて日記
2007 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 10
2006 | 11 | 12
1月 18 (木曜日) 2007
22:56
ちょっと脱線(LDTがわからん)
 
まずはGDTをもう一度復習。P110から読み直し!

GDTはセグメントの情報を管理する表。で、メモリに存在する。GDTはかならずセットしないとセグメントが使えないのでこまるが、GDTをどこから始めるのかは勝手に決めてよいようだ。(GDTRに書きこめばよいらしい。)

for (i = 0; i < 8192; i++) {
set_segmdesc(gdt + i, 0, 0, 0);
}

ええと、これが約8000個分あるGDTの各行の設定のパターン。(ここではforで回して、一旦ぜーんぶのGDTに0を入れている。

   set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, 0x4092);
   set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a);

このパターンで個々のGDTをセットアップしている。細かく言えば、

set_segmdesc(gdt + GDT番号, 大きさ, 開始番地, 属性);

と、こうなる。ちなみに属性は少々ややこしいが、P126のカッコ内をとりあえず下二桁にあてはめればいいようだ。

なので、上記 GDT1番、GDT2番はそれぞれ、「92なので、システム専用の読み書き可能セグメント。実行はできない」「9aなので、システム専用の実行可能セグメント。読み込みもOK。書き込みはできない」と、こうなる。

P292。
マルチタスクする場合、切り替える前のレジスタの情報全てを一旦どこかに退避させ、別のタスクに切り替える。(ちょうどレジスタを丸ごとバックアップするようなもの)
その退避場所(104バイト必要)をTSSという。TSSはプログラム上で勝手に適当な変数を作ってやるのではない。セグメントの一種としてあつかう。なので、上記のGDTの設定と同じようにしないといけない。(大きさと属性だけが決まっている。あとは適当でいい)

 set_segmdesc(gdt + 3, 103, (int) &tss_a,AR_TSS32);

(AR_TSS32は0x0089のこと。とにかくこの数値を当て込むと、そのセグメントはTSSという特殊なセグメントになる)

P312から汎用なタスク操作のプログラムが始まっている。
これを見ると、「task」という構造体を用意し、これがおのおののタスクに必要なデータを管理and記憶していることがわかる。

task->sel  簡単に言えば、GDTの何番のセグメントを使うのかという情報。
task->flags  使用中かそうでないかのフラグ
task->tss  このタスクが使うtss構造体


task_init 関数を使い、これらを初期化している。初期化はいったいなにをやっているかというと

for (i = 0; i < MAX_TASKS; i++) {
taskctl->tasks0[i].flags = 0;
taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8;
set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32);
}














・・・・あーーー。だめだぁ・・・わっかんねぇ〜・・・・

今日はもう寝る!
 
30日を過ぎたBlogにはコメントできません。

Referer  (8)
21:26
27日目
 
27日目

[1]
なるほど。納得〜。

[2]
え〜? これいいのかな?。 いや、プログラムはわかるけど、こういう仕様でええんかなぁ・・・。だってWinのコンソールもこういうふうにはなってないような・・・??

[3]
むむむ? ほんとだ。いかれちゃった。

・・・うーむ。なるほどぉ。OSのガードが固いので、アプリのほうをおかしくしちゃうと。考えたもんだなぁ。(コードの意味もわかるぞ。)

[4]
んんん?LDT?。なんだそれ?
えーー! こりゃ便利! タスクごとにGDTを設置できるの?(子GDTみたいな感じか!)

あっれ〜?。わっかんねぇなぁ。ええと・・・どういうことなのかな???

LDTがメモリのどこにあるのかはGDTの中にLDTセグメントを作って教えてあげます

・・・これの意味がどうしてもわからんなぁ・・・。コードから読み取らないとわからないかな???
 
30日を過ぎたBlogにはコメントできません。
18:04
26日目2
 
26日目

[4]
・・・あれぇぇぇ? ここ、どうも意味がわからないなぁ。いや、FIFOが空っぽになってから書き換えるってのは意味解るけど、そうなるとマウスが止まるまで再描画をしないっていう理屈にならない??
(でも実際は、移動中もウインドゥがついてくるわけで・・・)

わからーーん!


[5]〜[8]
うーむ。task_aがまだ動いていたとは!
しかし、逆にいえば、こういう内部での処理をするタスク(監視タスクとでもいうのかな?)が必要ということだよね??

[9]
ツルツル〜

[10]
むむむ! また失敗オチ!?
 
30日を過ぎたBlogにはコメントできません。
17:34
26日目
 
26日目

[1]
なっるほどなぁ。たしかこういうテクニックって前にもどこかでやったよね?。
一見、コードが長くなるように見えなくもないけど、無駄なif(しかもforのせいで数万回分の)がなくなるので相当変化があると思われる。

[2]〜[3]
ふむ。これはつまり、こういうことだよね??

普通に8バイト書き込む

               ┌──────┐
MOV [0x00001000],0x11  →│ 0x11   │0x00001000
               ├──────┤
MOV [0x00001001],0x12  →│ 0x12   │
               ├──────┤
MOV [0x00001002],0x13  →│ 0x13   │
               ├──────┤
MOV [0x00001003],0x14  →│ 0x14   │ :
               ├──────┤ :
MOV [0x00001004],0x15  →│ 0x15   │ :
               ├──────┤
MOV [0x00001005],0x16  →│ 0x16   │
               ├──────┤
MOV [0x00001006],0x17  →│ 0x17   │
               ├──────┤
MOV [0x00001007],0x18  →│ 0x18   │0x00001007
               └──────┘

※ 合計8回もMOV命令を実行しないといけない。
=================================================================
32bit命令で8バイト書き込む

                  ┌──────┐
MOV [0x00001000],0x14131211  →│ 0x11   │0x00001000
                  ├──────┤
                 →│ 0x12   │
                  ├──────┤
                 →│ 0x13   │
                  ├──────┤
                  │ 0x14   │ :
                  ├──────┤ :
MOV [0x00001004],0x1817161515 →│ 0x15   │ :
                  ├──────┤
                →│ 0x16   │
                  ├──────┤
                 →│ 0x17   │
                  ├──────┤
                 →│ 0x18   │0x00001007
                  └──────┘

※ たった二回のMOV命令の実行で同じ結果になる。



むむむ・・・こりゃややこしいな。でもやっていることはわかるな。



 
30日を過ぎたBlogにはコメントできません。

Referer  (4)
13:57
25日目2
 
25日目

[2]〜[3]
え”え”え”??
なんだこれ? gb2palはパズルだと? わっかんねぇぇぇ。
たしかにどう見ても、これだけでできるとは思えないんだけどなぁ。
くやしいな。いつか挑戦してやるぞ! <え!今やらないの?

[4]
ツルツル〜っと。

[5]
他コンソール化。ふむ。まずはとりあえず配列タイプへ改造と。

[6]
なるほどなぁ。確かに格納変数一個しかないもんな。でも、これをどうやって振り分ける??。

なるほどぉぉぉ。
タスクの構造体というより、おのおののセグメント内の番地に担当させるっていうほうが適当かもな??

[7]
ん??? え?あれ? そうだっけ??
・・・あー!ほんとだ!確かにそうだね。
しかしそうなると、セグメント番号もまた、SHEETやタスクのように管理する必要があるよね? (わー!ややこしい!)

うむむ。すでの持っている数値(task->sel)に簡単な計算をして出てくる数値を使おうと・・・。なるほどなるほど。(でもあとで当て込みの位置が動いたりしたらややこしそうだかな・・・)

[8]
オケオケ。そのとおりだね。ツルツル〜

[9]〜[10]
ん〜と。これはとりあえず暫定処置だよね?このままじゃFIFOも二個しか初期化してないわけだから。(たぶんタスク起動させる段階でこの初期化がなされるように変更される悪寒)
 
30日を過ぎたBlogにはコメントできません。
(1) 

PopnupBlog V3 Denali created by Bluemoon inc.