OSをつくろうpart4
■ このスレッドは過去ログ倉庫に格納されています
0001ひげぽん
NGNGスレッドになればと思います。
前々スレッド
OSをつくろうpart2
http://pc3.2ch.net/test/read.cgi/tech/1024411711/
前スレッド
OSをつくろうpart3
http://pc3.2ch.net/test/read.cgi/tech/1027080631/
0263ひげぽん
NGNGみとこ さん
>>他にもいろいろとやってるので開発ペースが安定してません。
>>なるべくめぐに時間を注いでますが。。。
なるほどみとこさんは、めぐに時間を注ぎ
ひげぽんは、モナーに時間を注ぐのですね(笑)
冗談はさておき、やはりOS作成には時間がかかりますね。
一応私は5年計画ですが。。。
>LightCone さん
>PC/AT機版の元となったOSを開発を始めたのはだいぶ前です。
>そのとき数ヶ月開発し、そのまま放置していたのを、2002年に
>なってから移植し始めました(4月頃かな?)。
なるほど、NWSOSと比べてMonaは2年分くらいの差があると感じてます。
全くの私の主観ですが・・・
もっとがんばらなくては・・・
0264みとこ ◆AEqcy/sQU6
NGNG今のコードベースは一年くらいかな
0265ひげぽん
NGNG>PROJの最初から考えるともう5年以上たったかもしれない、、、
>今のコードベースは一年くらいかな
ひえー、大先輩ですね。
今後ともよろしくお願いいたします。
0266257
NGNGひげぽんさん、LightConeさんも、お暇なら是非来てください
0267超先生@OS板 ◆leaf/RYZgY
NGNG<後ろ頭> y-~~~ 面白そうになってきたな。
私もちょいと昔のを引っ張りだしてこようかな。
0269デフォルトの名無しさん
NGNG煽るなよ
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG普段は組み込み機器でリアルタイムLINUXのカスタマイズを仕事にしてます。
mips系ばかりでx86は初めてですが、NWSOSを追い抜くべく頑張ります。
BIOSがかなり整備されてるっぽいところが、唯一の月明かり・・・
0272デフォルトの名無しさん
NGNG><後ろ頭> y-~~~ 面白そうになってきたな。
おー。超先生、も参戦ですか?
0273LightCone ◆sSJBc30S5w
NGNG>その代わり、全体的に複雑で統制の取れていない設計があちこちにある。
>このために、プログラムを作るのに覚えることがたくさんあって大変だし、サブシステム毎に思想がばらばらだから同じようなことをしようとしても苦労が絶えない。
それは同感。
0274デフォルトの名無しさん
NGNG0275LightCone ◆sSJBc30S5w
NGNG使えるシェルを正式公開しました。テキストエディタや gnu-sed も付いてます。
NWSOS Ver 0.030 :
http://homepage2.nifty.com/nowsmart/nwsos.htm
sed をパイプで起動したスクリーンショットがあります。
なお、テキストエディタは、SHIFT+ESC で出力を取り込んでエディタが
起動できます。
0276LightCone ◆sSJBc30S5w
NGNG>なお、テキストエディタは、SHIFT+ESC で出力を取り込んでエディタが
>起動できます。
テキストエディタのことではなく、SHELL のことです。
SHELL が、Vz エディタのように、SHIFT+ESCで、コンソール出力を
エディタに取り込んで編集モードに入れるようになってます。
0277LightCone ◆sSJBc30S5w
NGNG他の目的で使うメモリが不足すると、ファイルバッファの内容をディスクに
フラッシュして、ファイルバッファのサイズを小さくし、メモリとして
利用できるようにしたいです。
でも、まだ漠然として上手い方法が今一よくわかりません。
一応、今のところ思いついた必要条件っぽいものは、
・ディスクにフラッシュしようとした際に、ファイルシステム自体が
新たにメモリを要求してはいけない(?)。
・もし、マイクロカーネルでこれを行う場合、メモリを必要とするタスクは、
一時的に停止状態にし、その間に
「ファイルサブシステムのタスク」がディスクにフラッシュする(?)。
(ちょっと不思議)
・仮想記憶(SWAP IN, OUT) と上手く折り合いをつけないといけない。
そもそも、SWAP OUTしてはいけない部分も有りそうだし、、、。
0278デフォルトの名無しさん
NGNG>エディタに取り込んで編集モードに入れるようになってます。
おいらの指は、この10年間、Viに慣れきったんで
ViがNWSOSに移植されれば、遊びに行くYO。
sedがパイプで使えるってことは、Viが移植される日も近い?
0279デフォルトの名無しさん
NGNG数ヶ月ぶりにFDにインストールして、起動してみたんだけど、開発は順調みたいだね。
テキストエディタ(かなり前からあるようだけど)も、HD上のファイルから
S-JISが問題なく読み込めたし、HDアクセス中も、FireDEMOが止まらないし。
難いえば、マウスカーソルが異様に遅いことかな?
現状、Windows2.0程度といったところ。
もっと頑張れ!
0280デフォルトの名無しさん
NGNGしたんだろうけど。
というか、unix系ツールはほとんどコンパイルしなおせば動くんでないの?
これら基盤ツールはGPLで構わんと思うよ。
実行ファイルとして分離されてるんだし、NWSOSとGPLとは無縁でいられる。
Lightタンは、カーネル、Windowマネージャなどは、NWSOSとしてがっちり
開発し、周辺ツールはソース込みでこれら古典的なツールをGPLでがんがん
出してみてはいかが?
0281LightCone ◆sSJBc30S5w
NGNG>というか、unix系ツールはほとんどコンパイルしなおせば動くんでないの?
理想的にはそうであって欲しいのですが、SEDの場合は、いったん、
Visual C++でコンパイルできるように修正(確認)してから、NWSOS
用にさらに微妙に修正する必要がありました。
POSIX互換(風)のライブラリを整備していけば、だんだん改善されていく
と期待してるのですが。
>周辺ツールはソース込みでこれら古典的なツールをGPLでがんがん出してみて
>はいかが?
そうしたいです(有志の人に手伝って欲しいです。)。
0282LightCone ◆sSJBc30S5w
NGNG>NWSOSの最新バージョンみたよ!
有難うございます。
>難いえば、マウスカーソルが異様に遅いことかな?
これは、単に移動速度が遅い(1カウントあたりの座標の変化が少ない)と
いうことですか? それとも、、、。
0283LightCone ◆sSJBc30S5w
NGNG>おいらの指は、この10年間、Viに慣れきったんで
>ViがNWSOSに移植されれば、遊びに行くYO。
>sedがパイプで使えるってことは、Viが移植される日も近い?
sedよりは大変かもしれませんが、多分、気合を入れれば移植できると思います。
0284LightCone ◆sSJBc30S5w
NGNG変更可能なんですが、UNIX 系だとシェルスクリプトを書くしかないの
でしょうか?
UNIX では、ワイルドカードはシェルの段階で展開してしまうので、
cmd *.doc *.txt としても、doc と txt が一列に並んでしまうので、
cmd側は区別できませんよね。
(DOSだと、copy *.c *.old とかも使えたのですが。)
0285LightCone ◆sSJBc30S5w
NGNGと書いたときに、
cmd x1.doc x2.doc x3.doc dlm y1.txt y2.txt y3.txt
のように、間に dlm という「仮想ファイル名」を渡してしまい、
dlm をオープンすると、nul デバイスのように働くようにするとか。
0286LightCone ◆sSJBc30S5w
NGNG0287LightCone ◆sSJBc30S5w
NGNG行頭に ! を書くとワイルドカードを展開しないことにする。
!rename *.doc *.txt
と書くと、renameコマンドは、
argv[0]=rename
argv[1]=*.doc
argv[2]=*.txt
という引数を受け取る。
0288LightCone ◆sSJBc30S5w
NGNG「ファイル名変換支援ツール」 fncnv.exe を用意して、
x1.doc, x2.doc, x3.doc
と言うファイルがカレントディレクトリにあるとき、
!fncnv *.doc *.txt とすると、例えば、
x1.doc x1.txt x2.doc x2.txt x3.doc x3.txt
という文字列を標準出力に出すようにして、これを個別のコマンドで
利用する手も考えました。
0289デフォルトの名無しさん
NGNGマウスカーソルがカコ(・へ・)ヨクナイ!
0290デフォルトの名無しさん
NGNGという仕様が一般的な気がします。
sh/csh系だけの話なのかもしれませんが。
0291LightCone ◆sSJBc30S5w
NGNG実は既に現状のNWSOSでもそうなってはいるのですが、
rename "*.doc" "*.txt"
と書くのがなんとなく納得行かないことと、どんな記法で書いたとところで、
最終的に
argv[0]=xxx.exe
argv[1]=*.doc
argv[2]=*.txt
となってしまうのなら、各xxx.exeでの判定が必要になるので、
しっくり来ません。
#288では、fncnv.exe と連携して、
xxx.exe x1.doc x1.txt x2.doc x2.txt x3.doc x3.txt x4.doc x4.txt ...
と展開してやることを思いついたのですが。
0293デフォルトの名無しさん
NGNG0294みとこ ◆AEqcy/sQU6
NGNG0295デフォルトの名無しさん
NGNGもう使えるのかな?試してないんでわからないんだけど
0296デフォルトの名無しさん
NGNGてか、NWSOSスレでやろうよ>LightConeたんほか
0297デフォルトの名無しさん
NGNG0298名無しさん
NGNG0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG漏れはやっとVBとかCができる程度ですが、
(ヘボですが)Webデザインなら多少応援してあげられますけど。。。
これからも、がむばってください!
0301ひげぽん
NGNG>漏れはやっとVBとかCができる程度ですが、
ありがとうございます。VBとCができるだけで既に
すごいです。VBは良く分からんです。
>(ヘボですが)Webデザインなら多少応援してあげられますけど。。。
Monaプロジェクトは、慢性的WEBデザイナー不足なので
もしお力を貸していただけるのであれば
[email protected]までメールくださいm(__)m
0302ひげぽん
NGNGやはりLightConeさんはすごいですね。
Monaはタスクスイッチ実験中です。
あまりうまくいっていませんが、少しずつ前に進んでます。
0303LightCone ◆sSJBc30S5w
NGNGネットワークにも対応したいんですが、WEB-BROWSERも、GUIを
最低限整備しないと作れないわけでして(笑)。
優先順位はやはりGUI>>>>ネットワークかと。
0304LightCone ◆sSJBc30S5w
NGNGOS作りでひとつの山場っぽいですよね。
割り込み中でメモリ空間やスタックを切り替えるのは、普段絶対に
経験しないことですし。
あと、タスクをロードできると言うことは、
メモリ管理やファイルシステムがその程度の使い方ではバグ
フリーになった証拠でもあるわけで。逆にいえば、それらの
支援機能のバックアップがなければタスクをロードできないわけで。
0305ひげぽん
NGNGってMona開発に精を出せって話ですね。
0306デフォルトの名無しさん
NGNGLimeChatがお勧めですよ!
#osdev-j チャンネルに参加してもらえると
かなりうれしいです!!
0307LightCone ◆sSJBc30S5w
NGNG「ネットワーク対応」とは一体どういう状態のことなんでしょう。
COMポートやLANカードのドライバを提供することでしょうか。
それとも、ソケットみたいなものへの対応?
LANカードを直接制御すれば、OSの支援機能がなくてもなんとか
なるんじゃないかと素人考えしてしまうのですが。なんらかの調停が
必要なものなんでしょうか。
0308デフォルトの名無しさん
NGNGTCP/IPスタックとbsd socket互換インターフェースがあり、
物理層としてethernetが使えることを期待しちゃいます。
> OSの支援機能がなくてもなんとか
パフォーマンスを考慮しないのであれば問題ないでしょう。
0309デフォルトの名無しさん
NGNGcuiのftpクライアント一つあるだけで相当便利になると思う
0311デフォルトの名無しさん
NGNG>「ネットワーク対応」とは一体どういう状態のことなんでしょう。
そのネットワーク対応ってのは、俺が言ったものではないけど、俺的希望としては
LANなどで接続されたNWSOS起動中マシンへ実行ファイルなどを送り込み、
runできるという環境が欲しいかな。要はリモート機として機能することね。
これでぐっと、NWSOSのアプリ移植は早まると思うな。
営業妨害するつもりはないが、NWSC-Cは、現状、C++は未対応なんだし、
当分はVC++だとかgccに頼ることになるでしょ?(NWSOSの実行ファイル作るに
しても)
0313LightCone ◆sSJBc30S5w
NGNG物理層のドライバ書くだけでも大変そうですね。
そもそも、LANカードの共通規格は無いんですよね?
でも、LANでつながずに、RS-232Cケーブルでシリアル接続
でいいなら、簡単に出来そうです。ネットワークと言うより、単なる
シリアル通信ですが(笑)。ポケコンとPCの間でもできるぐらいのもの
なので。
話はずれますが、"UNIVERSAL-DRIVER 計画"みたいなのがあるそうです
よね。しかも、あのMSも積極的っぽいらしく。
0314デフォルトの名無しさん
NGNGlinuxのLANカードドライバのソースコードでも引っ張ってきて、
NWSOS向けに移植するしかないのでは?
nwsos上にセルフ環境構築しても人は寄ってこない。
様々な便利なツールが、linuxだとかwindowsにあって、
体や指がそれに慣れきってるから。生理学的な問題ってことで。
てなわけで、nwsosがリモート操作できるという環境ができるならばおいらも賛成。
一番ご利益があるのはむしろ、L氏では?
0315314
NGNGNWSOSのshellはいい線、いってると思う。
バックログがキー操作一発ででき、しかもそのまんま編集が出来てしまう
という環境は、unix系のshellでは見たことない。
shellとeditの融合shell?
この手の、他にはない優位性が標準として実装されればNWSOSの自立性としての
価値が輝いてくると思う。(あーもちろん、カーネル書ける人からみたら
シェルは一アプリケーションに過ぎないことは当然承知の上でな)
0316LightCone ◆sSJBc30S5w
NGNG>shellとeditの融合shell?
Vz Editor からアイデア貰いまくりです。(^_^)
>この手の、他にはない優位性が標準として実装されればNWSOSの自立性としての
>価値が輝いてくると思う。(あーもちろん、カーネル書ける人からみたら
>シェルは一アプリケーションに過ぎないことは当然承知の上でな)
他の もの でも、「ちょっと優位」なだけで輝いて見える場合って意外に多い
ような気もしませんか。
ウォークマンも、「小さい」ことに意義があるのだし、
軽自動車だって走行性能は普通自動車に劣るかもしれないのに人気が有るし
(どちらも「小さい」という共通点が有るのが不思議)。
0317デフォルトの名無しさん
NGNG0318LightCone ◆sSJBc30S5w
NGNGそうですね。
ただ、今のカーネルや SHELL でも、まだまだ至らない部分が多いので、
そちらを先に改良したいです。
ドライバ仕様の確定とDLLへの対応の優先順位はかなり高いと思います。
あと、コマンドをパイプやリダイレクトを使わずに起動しても、
今の shell ではコマンドの stdin に直接データを送れません。
これ改善するには、カーネル側とshellの両方の修正が必要だと
思ってます(パイプ関係で)。
0319デフォルトの名無しさん
NGNG>という環境は、unix系のshellでは見たことない。
M-x shell の環境が近いかな?
tab補完はできるの?
0320LightCone ◆sSJBc30S5w
NGNG>M-x shell の環境が近いかな?
恥ずかしながら、名前も聞いたこと有りいません。
>tab補完はできるの?
今のところ出来ません。
0321デフォルトの名無しさん
NGNG>>M-x shell の環境が近いかな?
>恥ずかしながら、名前も聞いたこと有りいません。
emacs ってエディターの中でシェルを使えるモードがあるんです
tab補完はほしいなぁ、ディレクトリが深くなる場合無いときついです
0322LightCone ◆sSJBc30S5w
NGNGそんなモードがあるとは始めて知りました。
>tab補完はほしいなぁ、ディレクトリが深くなる場合無いときついです
私もそう思ってます、、、。
でも、実の所、そういう機能はいつでも追加できるので優先順位的には
低く思ってるんです。
0323デフォルトの名無しさん
NGNGemacsはUnix系で広く使われているテキストエディタ兼
統合環境です。vi系と人気を二分してきました。
emacs系は、Win環境ではMeadowが広く使われています。
Cygwin環境用のemacsもあります。
emacsは慣れると手放せなくなる良品ですね。
LightConeさんには特にお奨めです。だまされたと思って
試してみてください。
0324LightCone ◆sSJBc30S5w
NGNG>emacsはUnix系で広く使われているテキストエディタ兼
>統合環境です。vi系と人気を二分してきました。
emacs と vi が人気を二分していたとは知りませんで
した。今まで、emacs,nemacs,kemacs(?)が圧倒的に人気が有るのかと。
Muleもemacs系ですか?
>emacsは慣れると手放せなくなる良品ですね。
それはよく聞いてます。LISPマクロ(?)がいいんでしょうか?
最初、カーソルキーが使えなくて面食らったことがありますが。
0325デフォルトの名無しさん
NGNG> それはよく聞いてます。LISPマクロ(?)がいいんでしょうか?
TAGSファイルとか使うと本当に便利ですが、Cのコーディングスタイルが
押しつけられるので、好き嫌いはあると思います。
でも、emacsでアセンブラは二度とやりたくないです。自分でmodeを作る能力が
なかったため、字下げがわけ分からん状態になりました。
0326ひげぽん
NGNGMonaのコーディングはMeadowを使ってます。
確かに便利ですね。
MakeもMeadow上から実行しているので
Meadowがないとつらいですね。
0327デフォルトの名無しさん
NGNGVi系だとかEmacs系などの移植も進むと思われ
0328デフォルトの名無しさん
NGNG0329LightCone ◆sSJBc30S5w
NGNG>とりあえず、NWSOS標準Shellがunixの端末仕様に揃えれば
>Vi系だとかEmacs系などの移植も進むと思われ
カーソルを移動したり色を変えたりするエスケープコードみたいなものが
決まってるんでしょうか。
昔、REMOTE LOGIN で、自宅のDOSで遠くのemacsが動いてびっくりしま
したが。
>>328
>なんつうかそうなっちゃうとたんなる亜種になりさがっちゃう気がして...
基本的な部分を UNIX と似せておくことはプラスになると思います。
Windowsでも POSIX(UNIXの標準仕様みたいなもの)に大まかに対応し
てますが、Winを UNIX と思う人はいないわけで。
0330デフォルトの名無しさん
NGNG>カーソルを移動したり色を変えたりするエスケープコードみたいなものが決まってるんでしょうか。
http://vt100.net/
この辺でしょうか?ちゃんと読んではいませんが。
0331LightCone ◆sSJBc30S5w
NGNGまず基本的なことから知りたいのですが、sh,csh,bashなどは、
「コンソールの枠」としての「kterm」中で起動し、エスケープ
シーケンスの処理は、kterm がやっている、ということなんで
しょうか。
どうやら、kterm のエスケープシーケンスとMS-DOS のそれとは互換性が
あるようですが、あってるでしょうか。
0332LightCone ◆sSJBc30S5w
NGNGhttp://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&q=xterm+ESC+%5B&lr=
0333デフォルトの名無しさん
NGNG> カーソルを移動したり色を変えたりするエスケープコードみたいなものが
> 決まってるんでしょうか。
termcap/terminfo
0334LightCone ◆sSJBc30S5w
NGNGtermcap や terminfo を変えれば、「UNIXの端末使用(xterm,kterm)」と
同じでなくても emacs等が動くかもしれない、ということでしょうか?
0335LightCone ◆sSJBc30S5w
NGNG0336デフォルトの名無しさん
NGNGプログラム中にエスケープシーケンスをハードコーディングしたりすると特定端末でしか動かなくなるから、Unix ではカーソル制御ライブラリを使うのが定石。
これによって、プログラムはカーソルの論理的な動きを記述すれば良い。
実際にエスケープシーケンスへの変換は、カーソル制御ライブラリが行う。
更に、各種の端末に対応するため端末毎に変換規則をデータベース化してある。(termcap/terminfo は、データベースの名前。)
だから、カーソル制御機能がある端末に対応した termcap/terminfo が書ければ、どんな変な端末でも emacs とか動くよ。
0337LightCone ◆sSJBc30S5w
NGNG>実際にエスケープシーケンスへの変換は、カーソル制御ライブラリが行う。
>更に、各種の端末に対応するため端末毎に変換規則をデータベース化してある。
解説有難うございます。UNIXでのカーソル制御や文字装飾制御は、
思った以上に柔軟性が高く、
1. アプリ--->カーソル制御ライブラリ
2. カーソル制御ライブラリ--->エスケープシーケンス
(termcap/terminfoでカスタマイズ可能)
3. エスケープシーケンス--->端末(xterm, kterm)
の3段構えだったんですね。
興味深いのは、アプリやカーネルを対応しなくても、各種環境に
1. カーソル制御ライブラリの置き換え
2. termcap/terminfo の書き換え
3. 端末(kterm/xterm)の書き換え
などで対応できそうな点です。
0338デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/os/1039075591/l50
0339デフォルトの名無しさん
NGNG遅レスですまんが・・・
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ワラタ。
0341デフォルトの名無しさん
NGNG0342デフォルトの名無しさん
NGNG0343名無しさん
NGNG0344名無しさん
NGNG0345デフォルトの名無しさん
NGNG# っていうか俺は全然気にしてないけど。低脳な話してるわけじゃないんだし。
0346デフォルトの名無しさん
NGNGLightConeは餓我なのか?あんま度がすぎるとム板に
NWSOSの開発スレ作ってやるぞ
0347ひげぽん
NGNGMonaでは
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
NGNGNWSOSの初期化コードです。参考にして下さい。
このコードは、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版を使ってます。
0351ひげぽん
NGNG>それはアクセスビットがたっただけではないでしょうか?
>原因は別だと思います
アドバイスありがとうございます。
ということなので現在の状況を書かせていただきます。
もし何か気になる点がありましたら、ご指摘いただけたらと思います。
「はじめて読む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ひげぽん
NGNGwhile (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ひげぽん
NGNGLDTが必要と言われているっぽいので
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ありがとうございます。
一部とはいえ、NWSOSのコードを見たのは初めてです。
0356超先生@OS板 ◆leaf/RYZgY
NGNG0357ひげぽん
NGNGいつもお世話になっております。m(__)m
>TSS中のLDT SegmentSelectorやFS/GSレジスタが正しく埋まってないとか・・・?
LDTセグメントセレクタは 0x30としています。
gs,fsは0に設定しています。
そもそもLDTってこの場合必須なのでしょうか。
だいぶ煮詰まってきました。
0358LightCone ◆sSJBc30S5w
NGNG今後数百回はこういう作業の繰り返しになると思います。
最終的には誰にも頼れないかもしれませんが。
0359ひげぽん
NGNG>今後数百回はこういう作業の繰り返しになると思います。
>最終的には誰にも頼れないかもしれませんが。
本当ですね。非常に厄介です。
また実践的な資料をなかなか見つけられないのがつらいですね。
ちょっとした間違いで失敗しているのも、全く見当違いのことをしているのも
見た目上、区別がつかないです。(特に独りよがりになっていると・・・)
そこは、LightCone さんや、超先生@OS板さんのような
先人のアドバイスを頂きながら進めると良いなあと勝手に思ってたりします。
いつか、私もOSを作ろうとしている人たちにアドバイスできるほどになりたいです。
0360LightCone ◆sSJBc30S5w
NGNGsetTSS()や、setDT()の中身が正しいか、TSSの構造体が定義通りになって
いるか等を丹念に調べることと、きちっとCPUの動作を理解するしかないです。
0361LightCone ◆sSJBc30S5w
NGNGとりあえず、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 さんのおかげです。
厚くお礼を申し上げます。
成功した瞬間に、背筋がぞくぞくっと来ました。
どうもありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています