トップページ⇒tech
982コメント407KB

OSをつくろうpart4

■ このスレッドは過去ログ倉庫に格納されています
0001ひげぽんNGNG
独自にOSを作っているまたは、作ろうとしている人たちのための
スレッドになればと思います。

前々スレッド
OSをつくろうpart2
http://pc3.2ch.net/test/read.cgi/tech/1024411711/

前スレッド
OSをつくろうpart3
http://pc3.2ch.net/test/read.cgi/tech/1027080631/
0331LightCone ◆sSJBc30S5w NGNG
>>330
 まず基本的なことから知りたいのですが、sh,csh,bashなどは、
「コンソールの枠」としての「kterm」中で起動し、エスケープ
シーケンスの処理は、kterm がやっている、ということなんで
しょうか。


 どうやら、kterm のエスケープシーケンスとMS-DOS のそれとは互換性が
あるようですが、あってるでしょうか。
0332LightCone ◆sSJBc30S5w NGNG
エスケープシーケンス Google検索:

http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&q=xterm+ESC+%5B&lr=
0333デフォルトの名無しさんNGNG
>>329
> カーソルを移動したり色を変えたりするエスケープコードみたいなものが
> 決まってるんでしょうか。

termcap/terminfo
0334LightCone ◆sSJBc30S5w NGNG
>>333
 termcap や terminfo を変えれば、「UNIXの端末使用(xterm,kterm)」と
同じでなくても emacs等が動くかもしれない、ということでしょうか?
0335LightCone ◆sSJBc30S5w NGNG
使用--->仕様
0336デフォルトの名無しさんNGNG
>>334
プログラム中にエスケープシーケンスをハードコーディングしたりすると特定端末でしか動かなくなるから、Unix ではカーソル制御ライブラリを使うのが定石。
これによって、プログラムはカーソルの論理的な動きを記述すれば良い。
実際にエスケープシーケンスへの変換は、カーソル制御ライブラリが行う。
更に、各種の端末に対応するため端末毎に変換規則をデータベース化してある。(termcap/terminfo は、データベースの名前。)
だから、カーソル制御機能がある端末に対応した termcap/terminfo が書ければ、どんな変な端末でも emacs とか動くよ。
0337LightCone ◆sSJBc30S5w NGNG
>>336
>実際にエスケープシーケンスへの変換は、カーソル制御ライブラリが行う。
>更に、各種の端末に対応するため端末毎に変換規則をデータベース化してある。

 解説有難うございます。UNIXでのカーソル制御や文字装飾制御は、
思った以上に柔軟性が高く、

1. アプリ--->カーソル制御ライブラリ

2. カーソル制御ライブラリ--->エスケープシーケンス
(termcap/terminfoでカスタマイズ可能)

3. エスケープシーケンス--->端末(xterm, kterm)

の3段構えだったんですね。

興味深いのは、アプリやカーネルを対応しなくても、各種環境に

1. カーソル制御ライブラリの置き換え
2. termcap/terminfo の書き換え
3. 端末(kterm/xterm)の書き換え

などで対応できそうな点です。
0338デフォルトの名無しさんNGNG
大変なことになってる。
http://pc.2ch.net/test/read.cgi/os/1039075591/l50
0339デフォルトの名無しさんNGNG
>>284
遅レスですまんが・・・
cmd *.doc *.txt の'*'は自明のとおりshellが展開する。
copy *.doc *.txt みたいなことは基本的にできない。
できないというより、copy Src dst っていうアトミックな
機能だけをコマンドが提供し、ループはshellが担当する
ってのが機能分割の面でメリットあると考えられたからだと
思う。

もし、copy がファイル名を展開できたとしても、次にmove という
コマンドを作るとしたら、同じようにコマンドがファイル名展開
できないと違和感あるし、コマンドの作者が違うと、ルールの
統一をするのも大変だし・・・

あとshell scriptを書かなくちゃいけないって疑問は半分正解で
半分違うと思う。
shell はスクリプトの入力先が、ファイルでも標準入出力でも
気にしないので、コマンドラインから while を打ち込んでも全然
問題ないし。

だから、コマンドラインから直接、
$ for i in *.doc
do
j=`echo $i | sed 's/doc$/txt/'`
cp $i $j
done
やるしね。

ここらへんは文化背景になっちゃうから軽くながしておいてね。
0340デフォルトの名無しさんNGNG
>>338
ワラタ。
0341デフォルトの名無しさんNGNG
光円錐タン。。
0342デフォルトの名無しさんNGNG
LightConeマヂギレ!!!
0343名無しさんNGNG
俺は、LightCore氏が連続カキコしてても気にならないけどなあ・・。
0344名無しさんNGNG
前スレがあがっていたのでage
0345デフォルトの名無しさんNGNG
名無しで連続カキコしてるやつもいるからな。コテハンだから目立つだけだよ。
# っていうか俺は全然気にしてないけど。低脳な話してるわけじゃないんだし。
0346デフォルトの名無しさんNGNG
Emacsがどうとかシェルがどうとかはどうでもイイ話だろ?
LightConeは餓我なのか?あんま度がすぎるとム板に
NWSOSの開発スレ作ってやるぞ
0347ひげぽんNGNG
タスクスイッチに実験中(いまだ成功せず)なのですが

Monaでは

secondboot.asmにてGDT上に
セグメント 0x08 type=0x9a(特権レベル0,コードセグメント)
セグメント 0x10 type=0x92(特権レベル0,データセグメント)
セグメント 0x18 type=0x96(特権レベル0,スタックセグメント)
とセットしてブートしています。

ブート後sgdtを実行して
GDTの中身を表示してみると
セグメント 0x10 type=0x93(特権レベル1,データセグメント)
セグメント 0x18 type=0x97(特権レベル1,スタックセグメント)

特権レベルがデータセグメント・スタックセグメントで変更されています。

これのせいでタスクスイッチ時にfault0dが発生しているような気が
するのですが、どこでこのような状況に陥ったかが
つかめていない状況です。

どなたかアドバイスいただけないでしょうか。
よろしくお願いいたします。
0348デフォルトの名無しさんNGNG
それはアクセスビットがたっただけではないでしょうか?
原因は別だと思います。
0349LightCone ◆sSJBc30S5w NGNG
>>347
NWSOSの初期化コードです。参考にして下さい。
このコードは、16BITコード(USE16)です。

OPER_PREFIXequdb66h

moveax,cr0
;AM=0(アラインメントチェックをしない)
;PG=0(ページングをしない)
;CD=NW=0(WriteThrough キャッシュ有効)
andeax,01ffbff10h
;ET ビット有効
oreax,1;PE=1,PG=0(ページングは無し)
movcr0,eax

;nosmart
;”16ビット”のプロテクトモードへ入る。
db0e9h;jmpnear ptr Init1
dw0

Init1:;本当の32ビットプロテクトモードへ入る
OPER_PREFIX
db0eah;jmp far ptr(Direct Inter Segment)
dd0
dwGDT_INIT32_CODE

Mona の場合、0eah が、16BIT版を使ってますが、このコードでは、
32BIT版を使ってます。
0350LightCone ◆sSJBc30S5w NGNG
>>348
確かにそうですね。
0351ひげぽんNGNG
>>348
>それはアクセスビットがたっただけではないでしょうか?
>原因は別だと思います

アドバイスありがとうございます。
ということなので現在の状況を書かせていただきます。
もし何か気になる点がありましたら、ご指摘いただけたらと思います。

「はじめて読む486」のようにprocess1(),process2()という関数を
作成して実行の切り替えを試みています。

■前提条件
0x08 CS
0x10 DS
0x18 SS
0x20 TSS process1用
0x28 TSS process2用
0352ひげぽんNGNG
■やってみた事

/* グローバル変数 */
TSS tss[2];
byte stack[512];
{

/* process2用のTSSを用意 */
setTSS(tss + 1, 0x08, 0x10, process2Tester, 0x200, stack, 0x10, 0, 0);

/* GDT 0x20, 0x28にtssのアドレス等をセット */
/* gdt_はgdtr.base */
setDT(gdt_ + 4, (dword)tss , sizeof(TSS), TypeTSS);
setDT(gdt_ + 5, (dword)(tss + 1), sizeof(TSS), TypeTSS);

/* 現在のタスクはprocess1ですよ */
ltr(0x20);

/* 開始 */
process1();

}
0353ひげぽんNGNG
void process1() {

    while (true) {
        _sys_printf("process1");
        
        /* プロセス2へ切り替え */
        asm volatile("jmp $0x28, $0\n");
    }
    return;
}

void process2() {

    while (true) {
        _sys_printf("process2");
    }
    return;
}

■ひげぽんの予想する結果
process1process2process2process2process2process2・・・
■bochs上での実際の結果

00000431987i[CPU  ] task_switch: bad LDT segment
00000431987i[CPU  ] task switch: posting exception 10 after commit point
00000431987p[CPU  ] >>PANIC<< can_push(): SS invalidated.
0354ひげぽんNGNG
■やってみたこと2

LDTが必要と言われているっぽいので

GDT ldt[1];
GDT sss[1];

それぞれのtssに tss->ldt = 0x30;

/* GDT に0x30 LDT用追加 */
setDT(gdt_ + 6, (dword)(ldt), sizeof(GDT), TypeLDT);
setDT(ldt , (dword)(sss), sizeof(GDT), TypeLDT);
setDT(sss , (dword)(0), sizeof(GDT), TypeLDT);
lldt(0x30);

■結果
0000487970e[CPU ] load_seg_reg ss: LDT: index > limit
0000487996e[CPU ] prefetch: running in bogus memory

■やってみたこと3

GDT ldt[1];→GDT ldt[2];

■結果
process1fault0dと表示される。
コンソールには

002547802e[CPU ] prefetch: running in bogus memory
と表示されます。
0355ひげぽんNGNG
LightCone さん
ありがとうございます。
一部とはいえ、NWSOSのコードを見たのは初めてです。
0356超先生@OS板 ◆leaf/RYZgY NGNG
TSS中のLDT SegmentSelectorやFS/GSレジスタが正しく埋まってないとか・・・?
0357ひげぽんNGNG
こんにちは超先生@OS板さん
いつもお世話になっております。m(__)m

>TSS中のLDT SegmentSelectorやFS/GSレジスタが正しく埋まってないとか・・・?

LDTセグメントセレクタは 0x30としています。
gs,fsは0に設定しています。

そもそもLDTってこの場合必須なのでしょうか。
だいぶ煮詰まってきました。
0358LightCone ◆sSJBc30S5w NGNG
こういう部分がOS作りで厄介な所ですよね、、、。
今後数百回はこういう作業の繰り返しになると思います。
最終的には誰にも頼れないかもしれませんが。
0359ひげぽんNGNG
>こういう部分がOS作りで厄介な所ですよね、、、。
>今後数百回はこういう作業の繰り返しになると思います。
>最終的には誰にも頼れないかもしれませんが。

本当ですね。非常に厄介です。
また実践的な資料をなかなか見つけられないのがつらいですね。

ちょっとした間違いで失敗しているのも、全く見当違いのことをしているのも
見た目上、区別がつかないです。(特に独りよがりになっていると・・・)

そこは、LightCone さんや、超先生@OS板さんのような
先人のアドバイスを頂きながら進めると良いなあと勝手に思ってたりします。
いつか、私もOSを作ろうとしている人たちにアドバイスできるほどになりたいです。
0360LightCone ◆sSJBc30S5w NGNG
 今のケースは、 
 setTSS()や、setDT()の中身が正しいか、TSSの構造体が定義通りになって
いるか等を丹念に調べることと、きちっとCPUの動作を理解するしかないです。
0361LightCone ◆sSJBc30S5w NGNG
>>359

とりあえず、MonaのSourceに一箇所間違いを見つけました。

void ProcessManager::setTSS(TSS* tss, word cs, word ds, void (*f)(), dword eflags
, byte* esp, word ss, byte* esp0, word ss0) {

memset(tss, 0, sizeof(TSS));
tss->cs = cs;
tss->ds = ds;
tss->eip = (byte)f;
tss->eflags = eflags;
tss->esp = (byte)esp;
tss->ss = ss;
tss->esp0 = (byte)esp0;
tss->ss0 = ss0;
tss->ldt = 0x30;
return;
}

 何箇所か、(byte) でキャストしてますが、(byte *)か、(dword)の
間違いだと思います。

 これは明らかに間違った挙動を起こすはずです。
0362ひげぽんNGNG
LightCone さん
貴重なお時間を割いていただいて大変恐縮です。

ご指摘の部分を修正したところ、ばっちり二つのタスクが交互に動くようになりました!!!!
ひとえにLightCone さんのおかげです。
厚くお礼を申し上げます。

成功した瞬間に、背筋がぞくぞくっと来ました。
どうもありがとうございました。
0363LightCone ◆sSJBc30S5w NGNG
>>362
何よりですね。(^_^)
0364LightCone ◆sSJBc30S5w NGNG
>>362
 そういえば、Monaのソースでは既にコンストラクタやデストラクタは
正常に動作するようになってるんでしょうか。
 OSを書くときに非常に便利そうなんですが。
0365ひげぽんNGNG
>>363,364
どうもありがとうございます。

>そういえば、Monaのソースでは既にコンストラクタやデストラクタは
>正常に動作するようになってるんでしょうか。
>OSを書くときに非常に便利そうなんですが

正常に動作しています。
ただし継承関係のあるクラスできちんと動くかどうかは
確かめていないです。
きちんとカプセルかできるだけでもかなりのメリットです。
0366LightCone ◆sSJBc30S5w NGNG
 NWSCも、メンバ関数とコンストラクタ、デストラクタだけに
対応する位でも相当便利になるんでしょうけれども。。。
 でも、デストラクタを呼び出すタイミングが意外に厄介そう
だし。
0367LightCone ◆sSJBc30S5w NGNG
goto文でコンストラクタを迂回した時にエラーを出したりするのが
メンドクサそうなのでやってないんですが。
0368ひげぽんNGNG
>NWSCも、メンバ関数とコンストラクタ、デストラクタだけに
>対応する位でも相当便利になるんでしょうけれども。。。
>でも、デストラクタを呼び出すタイミングが意外に厄介そう
>だし。
なるほどあまり深く考えていませんでした。
今のところインスタンスを大量に作ったりしないので
問題になっていないですが・・・
覚えておきます。
0369LightCone ◆sSJBc30S5w NGNG
>>368
 #366では、コンパイラを作る時のボヤキだったんですが、
OSを作る上でも、もしかしたら、デストラクタの呼び出し
タイミングとかが問題になる可能性もあるかもしれませんね。

 でも、きっと、純粋なCで書くより開発効率は上がると
思います。羨ましい。
0370デフォルトの名無しさんNGNG
c++の本領が発揮するのはSTLだと思う。
でもOSを記述するなら、list vector などを void* ポインタ限定に
してしまえば、cでもSTLもどきは実現できる。
0371LightCone ◆sSJBc30S5w NGNG
>>370
>c++の本領が発揮するのはSTLだと思う。
>でもOSを記述するなら、list vector などを void* ポインタ限定に
>してしまえば、cでもSTLもどきは実現できる。

リストを自動化できれば便利ですよね。NWSOSでは、おっしゃっているような
方法を用いてます。同じリスト関数群で色んなリストに適用してます。
0372ひげぽんNGNG
LightConeさんのおかげでマルチタスク実験に成功しました。
記念にimgファイルを↓におきました。
http://mona.sourceforge.jp/に

今回の件は、Monaにとって大きな節目だと考えています。
イメージサイズも33kbになりました。
FreeDOS教徒さんのブートコードも順調です!!

今までアドバイスいただいた方、手伝って下さった方々に
深く感謝いたします。m(__)m
0373FreeDOS教徒NGNG
>>ひげぽん
マルチタスク化おめ〜♪
0374LightCone ◆sSJBc30S5w NGNG
 それにしても、当初アセンブラも余り使われた事のないような状態から
よくこんな状態にたどり着きましたね。未だに信じられません。
0375ひげぽんNGNG
>>373 FreeDOS教徒さん
ありがとうございます。
これからもよろしくお願いしますね(必須)(笑)

>>374 LightCone さん
>それにしても、当初アセンブラも余り使われた事のないような状態から
>よくこんな状態にたどり着きましたね。未だに信じられません。

私も信じられないです(爆)
LightConeさんにはお世話になりっぱなしです。
0376デフォルトの名無しさんNGNG
     * * *
    *     *
   *  ∧_∧  *
   * (´∀`)  *
   *       *
    *     *
     * * *
       |
       |
Mona マルチタスク化 おめでとー
0377ひげぽんNGNG
>>376
ありがとうございます。
感動しますた。
0378デフォルトの名無しさんNGNG
>>377
耳のずれ方にか?w
0379デフォルトの名無しさんNGNG
全然話題にならないけど
Hurdと"MAC OS X "のコアMachはこのスレの住人的にはどうなのよ?
マイクロカーネルってMachかWindowsNT系以外思いつかんが

いちおリンク
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/mach/public/www/mach.html
http://www.zdnet.co.jp/news/0104/09/e_torvalds.html
0380FreeDOS教徒NGNG
>>ひげぽん
これからもできる限りお手伝いさせて頂きますw;

>>379
当方マイクロカーネル方面に疎いため、
その方式のどこがいいのか分かりません。

モジュールに分割したら、何かいいことがあるのでしょうか。
0381LightCone ◆sSJBc30S5w NGNG
 マイクロカーネルの本質は、サブシステムを独立「プロセス」で動かすと言う
発想であって、論理的なモジュール分けを行うこと自体はモノリシックカーネル
でも行われます。単にカーネルの外にAPIの実装を出すのとも違うので、DLL
でAPIを実行するだけでは、マイクロカーネルとはいえません。

 利点ばかりであれば、大手を上げて賛同したい所ですが、本来の
目的とは裏腹に、下手すると設計がむしろ複雑になる危険性や、
速度パフォーマンスの低下の問題などもあり、反対意見が出てもおか
しくないと思います。

(システムコール発行から結果が出るまでの速度(ターンアラウンド時間)
 において不利な一方、割り込み禁止区間の粒度を「確実に」小さくできる
 利点があったりして悩みどころ。)
0382LightCone ◆sSJBc30S5w NGNG
 はっきり個人的意見を言っちゃうと、どの分野でも「新しい概念」が現れた
ときに、「知りたい」と思う人が沢山出てきて、本当にその概念が「良いもの」
かどうかは別としてその新しい概念の研究が盛んに行われる傾向があるので、
研究が盛んであっても、その都度ちゃんと判断して見極めることが大事だと
思っています。その見極めがどっちに転ぶかは人それぞれということで。
0383LightCone ◆sSJBc30S5w NGNG
 あと個人的な疑問なんですが、日本で独自なOSを研究以外で作ってるのって、
組み込み向けのiTRONと、超漢字(bTRON?)だけなんですか。

 日立やNECのスーパーコンピュータのOSとかはどうなってるんでしょう。

 日本では「研究」は盛んですが、実際に作っている人が少ないと
思うのは気のせいですか? あと、OSの研究とは、OSの歴史分類や概念の
取りまとめのことなんですか? 「実際の作り方」の研究はしない?
0384FreeDOS教徒NGNG
>>LightConeさん
よく分かる説明をありがとうございます。
実装を軽くするにはモノリシックカーネル内でモジュール化
するほうが楽そうですね。参考になりました。
0385LightCone ◆sSJBc30S5w NGNG
 現状、「マイクロカーネル」そのものをテーマに研究が行われること
さえあるのは、独立プロセスとしてサブシステムをどうやって記述すれば
いいかが自明でないからかもしれません。

 仮想記憶とファイルシステムとの結びつき、メモリシステムと仮想記憶の
結びつき、サブシステム用のプロセスのローディングとファイルサブシステム
との結びつきなど、自明とは言いがたい問題が沢山あるため、研究してみな
いとマイクロカーネル自体の利点や問題点さえ正確に把握する事が
できないのかもしれません。


 告白すると、わたしもよく知りません。
0386デフォルトの名無しさんNGNG
Hurdの開発者がマイクロカーネルはそれほど遅くなかったとか言ってたな
0387LightCone ◆sSJBc30S5w NGNG
>>386
実は、マイクロカーネルの最大の問題点は設計が難しいことかもしれません。
0388デフォルトの名無しさんNGNG
>>383
> あと個人的な疑問なんですが、日本で独自なOSを研究以外で作ってるのって、
>組み込み向けのiTRONと、超漢字(bTRON?)だけなんですか。

TRON系を除いて、私の知る範囲で入手可能である非研究OSは
以下のが挙げられます。きっと他にもあるでしょう。

XTAL
ttp://www.xtal.org/xt2.html

Human-OS

NOWSMART-OS
ttp://homepage2.nifty.com/nowsmart/nwsos.htm

H8/OS
ttp://www.linet.gr.jp/~mituiwa/h8/

GR-DOS
ttp://www.nekok.jp/green/k2/gr_dos/gr_dos.htm
> 日本では「研究」は盛んですが、実際に作っている人が少ないと
>思うのは気のせいですか?

気のせいです。
0389FreeDOS教徒NGNG
>>388
GR-DOSはもう一昔前に開発を終了しているはずですが?
あと、確かにこれ以外にも人知れずOSを開発してる人はいます。

世界と比べても、そう少ない割合だとは思いません。
0390LightCone ◆sSJBc30S5w NGNG
32BIT, MultiTask に限定したりすると?
あと、x86、GUI付きに限定したりすると?
0391デフォルトの名無しさんNGNG
Machマイクロカーネルはオーバーヘッドがどうとか言っても
Mac OS Xは動いてるしHurdもいちを実用段階には入ってるんだよね?
Machっていうのは単体で動くものなの?
0392デフォルトの名無しさんNGNG
>>あと、x86、GUI付きに限定したりすると?
なんでx86限定なんだw
たしかにゴミのように今後もあふれるであろう32bit-x86CPUの再利用っていうのは
大事なテーマになると思うが。
0393デフォルトの名無しさんNGNG
マルチタスク化おめでとうございます。
GUI実装目指して頑張ってください
0394デフォルトの名無しさんNGNG
空想マニアのたわごとでゴメンだが、将来的にマイクロカーネルが洗練すれば、
それぞれのサーバプロセスを複数のマシンに分散できたり・・・
カーネルを2台以上のマシンで走らせたり、カーネルマシンが落ちたとしても
ホットスタンバイしてるカーネルマシンにスイッチできたりとか・・・

ドラえもんレベルの空想でごめん。
0395デフォルトの名無しさんNGNG
20年ぐらい前からそう言われてますた。
0396デフォルトの名無しさんNGNG
>あと、x86、GUI付きに限定したりすると?
Windowsがあるし、linuxがあるし、BSDもBeOSもあるし。
特にGUIの性能はWindowsがずば抜けてるし、わざわざ用意する必要がない。
日本の場合、FEPの開発もせねばOSとして使い物にならないことが
多いゆえ、OS開発の敷居は高い。それこそ、「超漢字」などという名前のOSが
あるくらい。

一方、米国人だとか欧州人はとても裕福。
週休4日なんてあたりまえで、いわゆる自分の時間を多く確保しても
メシに困らないほどの経済力がある。だから、余暇でOSやツール群に
夢中になる人の割合が多い。

この差だ。

日立、富士通、NECなどの大手は30年も昔からスパコン用のOSを作ってる。
IBM機OSのエミュがあまりにも互換性が高すぎるゆえ、スパイ罪として逮捕された
事件もあるほど。

うぬぼれるな、青木。もっと見識を「豊か」にしろ。
0397ひげぽんNGNG
>>393
ありがとうございます。

思うところがあって、Linkers&Loadersという本を買いました。
初心者向けっぽいですけど、勉強になりますね。
あと、Monaはマイクロカーネルで行く予定です。(あくまでも予定ですが・・・)
0398LightCone ◆sSJBc30S5w NGNG
>>396
日本製を聞きたかったんですが。
0399LightCone ◆sSJBc30S5w NGNG
FEPとかは、JUST SYSTEM等に任せればいいかと。

出来ないのは単純に技術力がないからだと思ってたんですが。
0400ひげぽんNGNG
gccインラインアセンブラの話なんですが
asm volatile("ljmp $0x20, $0\n");
はOKなのに
word selector = 0x20;
asm volatile("ljmp %0, $0": /* no output */:"g"(selector));
は
Error: suffix or operands invalid for `ljmp'
と怒られます。
この辺詳しい方いらっしゃいましたら教えていただけないでしょうか。
アセンブラ板のほうがいいのかもしれないですが・・・
0401デフォルトの名無しさんNGNG
>一方、米国人だとか欧州人はとても裕福。
日本は世界第二の経済大国ですが。

>日立、富士通、NECなどの大手は30年も昔からスパコン用のOSを作ってる。
それは、マルチタスクや、GUIを持ってましたか。

0402デフォルトの名無しさんNGNG
>>396
足引っ張るな!
0403デフォルトの名無しさんNGNG
>>400
gcc -Sしてみるとわかりますが
ljmp _selector , $0
というふうにインライン展開されています。
asmには定数を渡す必要があるので
#define FOO_CS 0x20
などとしてやる必要があります。

0404ひげぽんNGNG
>>403
ありがとうございます。
ということは、ljmp先は動的に指定できないということでしょうか。
拡張インラインアセンブラの入力パラメータは使えない???
でも、ljmpのオペランドは即値だけでなくメモリ、レジスタもOKだと
思っているのですが・・・

何か大きな勘違いをやらかしてそうです。→私
0405デフォルトの名無しさんNGNG
>404
セレクタだけメモリというわけにはいかないので
struct {
dword ofs;
word sel;
} far_ptr;
こんな感じで6byteのポインタを渡す必要があります。

あとあまりお奨めできない方法として
push word selector
push dword 0
retf
(NASM風記述。gasニーモニックは忘れました。)
0406ひげぽんNGNG
>struct {
>dword ofs;
>word sel;
>} far_ptr;
>こんな感じで6byteのポインタを渡す必要があります

ありがとうございます。
出来ました!!!!
0407LightCone ◆sSJBc30S5w NGNG
ITRONの仕様書:

http://www.ertl.jp/ITRON/SPEC/mitron4-j.html

スケジューリングなどが参考になります。
OSの勉強に使えそう。
0408FreeDOS教徒NGNG
>>LightConeさん
32ビットでマルチタスクのOSといえば、OSASK、NWSOS、EOTA、MEG-OS、Mona
ぐらいしか思いつきません。
x86系、GUI付きOSはそれにMonaを除いてもう1つあります。
0409LightCone ◆sSJBc30S5w NGNG
あと、
 SCE(SONY COMPUTER ENTERTAINMENT), 東芝, 米IBM が、2005年をめどに
新OS を開発中(SONY の AIBOは、Aperios という独自OSが載ってるらしい。)

 大手電機メーカー各社のWorkstationには、UNIXの移植版が
載っている模様。

 スパコンは、UNIXの他、独自OSが載っているのもあるらしい。

 でも多分、ハードメーカーが載せてるUNIXは、海外ソフトメーカーに委託
したか、FreeBSD等を載せているんだと思う。

BTRONは、超漢字,EOTA など。
0410デフォルトの名無しさんNGNG
JUST-SYSTEM が昔作ってた、JUST-Windowというのが国産GUI-OS。
ところが資金力尽きて、ついにWindows帝国に敗北。

正確には、土地バブルに載って購入した土地資産が1/10以下になって撃沈。
実力はあったのに本業をおろそかにして、
駄目だと言われ続けてたWindowsの拡張工事に余念のなかったマイクロソフトに
頭を下げたのが '93だから、あれからはや10年。

元、ジャスト社員より
0411超先生@OS板 ◆leaf/RYZgY NGNG
  ∧_∧
< `ー´>-~~~
PC-98用のMS-DOSについてきたDOS-SHELLは手動タスク切り替えもできたよな・・・。

ところで、高級言語とassembleの比率は今のところどのくらいなんでしょう。 >> NWSOS他
0412LightCone ◆sSJBc30S5w NGNG
>>411
とりあえず、ソースのバイト数:

アセンブラ コード部:754KB
アセンブラ データ部:30.4KB
アセンブラ ヘッダ部:63.4KB
C言語 コード部:362KB
C言語 ヘッダ部:39.8KB

です。

今のところ、アセンブラ部が大きすぎると思うのですが、内訳は
初期化:34KB
カーネル:193KB
ファイル:99KB
割り込み:58KB
メモリ管理:66KB
DISK-DRIVER:37KB
内臓PROMPT:43KB
旧EMS MANAGER:32KB
旧DPMI MANAGER:53KB

このうち最後の3つは、今後削除する可能性があります。
0413みとこ ◆AEqcy/sQU6 NGNG
>>411
DOSSHELLはタスク切り替えというよりタスクスワップの気が

めぐたんは現在フルアセンブリです。
ついでに、最新ビルドでもまだマルチタスクをサポートしてません(つД`)
0414ひげぽんNGNG
>>411
Monaは
アセンブラコード:10KB(ブートからプロテクトモード移行まで)
C++コード:70KB
C++ヘッダ:10KB
ただしC++部には、ごく一部インラインアセンブラが含まれています。
またdoxygenコメントに対応するため、コメント量が多くなっていますので
C++部は実際は半分のサイズくらいだと思います。

NWSOSとの規模の差が歴然ですね・・・
0415ひげぽんNGNG
タイマー割り込みハンドラ内でタスクスイッチをしようとして
気づきました。
タスクスイッチの前にEOIは発行しなければいけないと思うのですが
iretは?疑問がいっぱい出てきました。
この辺のことに詳しい資料とかないでしょうか。
そろそろ「はじめて読む486」だけでは限界がきたかもしれません・・・
もし良い資料等ありましたら教えてくださいm(__)m
0416FreeDOS教徒NGNG
>>ひげぽん
インテルのマニュアルさえあればいいと思う。
iret自体は通常のretfにpopfを追加したものだった気がする。

必要なところを探す能力があれば、それなりに役に立つよ。
0417ひげぽんNGNG
>>インテルのマニュアルさえあればいいと思う。
>>iret自体は通常のretfにpopfを追加したものだった気がする。
>>
>>必要なところを探す能力があれば、それなりに役に立つよ。
ありがとうございます。
全くおっしゃるとおりですね。
ちょっと調べてみますです。
0418デフォルトの名無しさんNGNG
>>416
プロテクトモードのiretは結構違います
インテルの命令セットリファレンスに詳しい動作が書いてあります
0419FreeDOS教徒NGNG
>>318
いま手元に確認できる環境がないのですけど、
リアルモードとは勝手が違うのですね。

鋭い指摘ありがとうございます。
0420デフォルトの名無しさんNGNG
前スレで既出ですが一応
http://www.intel.co.jp/jp/developer/download/index.htm
インテルの日本語マニュアルPDF版
0421超先生@OS板 ◆leaf/RYZgY NGNG
 ∧_∧
< `ー´>-~~~ TSSはあまり使ったことがないが・・・・。

IDT上に割り込みハンドラ用のタスクゲートを置くとかできたっけかな。。。
割り込みハンドラをタスクに見立ててTSSを作っておき、
iretの代わりに実行するTSSへ向かってjmpするとか。

for(;;)
{
 /* 割り込み時はここへ飛んで来る */
 ....
 ....
 jmp tss_next_task; /* 次のタスクへ */
}
0422超先生@OS板 ◆leaf/RYZgY NGNG
 ∧_∧
< `ー´>-~~~ TSSはあまり使ったことがないが・・・・。

IDT上に割り込みハンドラ用のタスクゲートを置くとかできたっけかな。。。
割り込みハンドラをタスクに見立ててTSSを作っておき、
iretの代わりに実行するTSSへ向かってjmpするとか。

for(;;)
{
 /* 割り込み時はここへ飛んで来る */
 ....
 ....
 jmp tss_next_task; /* 次のタスクへ */
}
0423デフォルトの名無しさんNGNG
スマソ。なぜか多重書き込みに・・・ABoneのバグか。
0424みとこ ◆AEqcy/sQU6 NGNG
タスクゲートはIDTにも置けます。
割り込みでタスク切り替えするとCR0のNTフラグ?がたって
iret命令でこのフラグチェックするれす。
0425デフォルトの名無しさん ◆mXrBwDDzyw NGNG
記念パピコ
0426デフォルトの名無しさんNGNG
monaに期待
0427ひげぽんNGNG
>>421 超先生@OS板さん
>>424 みとこさん

いろいろとアドバイスありがとうございます。
週末に試してみます。

やっぱり平日はなかなか作業できないっす。
そのかわり年末年始にガツンとがんばります。
0428デフォルトの名無しさんNGNG
わーい、今日はじめてbochsいれてhigepos.bin動かしてみました。
過去ログどおりにやったら動いた。
ちょっと感動。
0429超先生@OS板 ◆leaf/RYZgY NGNG
>424
 ∧_∧
< `ー´>-~~~
ということは割り込み用tssのtask chainに次のタスクを入れてiretすれば楽勝ですな。
元のtssはbusy flagを手動で消さないとダメか・・・。
0430超先生@OS板 ◆leaf/RYZgY NGNG
>424
 ∧_∧
< `ー´>-~~~
ということは割り込み用tssのtask chainに次のタスクを入れてiretすれば楽勝ですな。
元のtssはbusy flagを手動で消さないとダメか・・・。
■ このスレッドは過去ログ倉庫に格納されています