トップページ⇒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/
0002デフォルトの名無しさんNGNG
調子どう?
がんばってねん。
0003ひげぽんNGNG
■勝手にリンク
OSASK
http://www.imasy.or.jp/~kawai/osask/
NWSOS
http://homepage2.nifty.com/nowsmart/nwsos.htm
????
http://sourceforge.jp/projects/higepos/
0004FreeDOS教徒NGNG
新スレおめ〜♪
0005ひげぽんNGNG
>>4
ありがとうございます。
ブートコード問題が一段落したのでほっと一息です。
ついでにA20問題も一応対処しました。
0006うえぽんNGNG
>ひげぽん
忙しいとは思いますが、がんばってください。
僕も大学の後半からプログラミング初めて、
趣味でi486(386)エミュレーションなど体験し
遊びました。(なかなか安定しませんが)
結局マクロアセンブラなどはあまり解りませんが、
楽しく板を読ませて頂いております。
忙しいけど、またエミュはじめたいなあ。
0007デフォルトの名無しさんNGNG
2げっと
0008LightCone ◆sSJBc30S5w NGNG
 firstboot.asm の readsector ですが、bx=0以外のときには対応して
ないと思うのですが、それより問題になると思うのが、

laddr = (es * 16 + bx)

から始まるバッファが、64KB の境界をまたぐとき、PC/AT 機の BIOS
が対応していない(機種がある)ことです。

>Because of the architecture of the DMA channel, an error will
>occur if the buffer in memory for the sectors overlaps a 64K page
>boundary. A 64K page boundary is a memory location which is one of
>the following (10000h, 20000h, 30000h, etc.). Ensure that no part
>of your buffer falls on such a boundary. If it does, create a new
>buffer or start the buffer just after the boundary.

とあります。
0009LightCone ◆sSJBc30S5w NGNG
 お節介なようですが、もう一つ気になる所があります。

 以前にも書きましたが、cf = 1 で返ってきた時の処理です。PC/AT の
DISK BIOS は、失敗した時に自分でリトライするのですが、単に繰り返すだ
けでは駄目で、ah = 0 で、"RESET" する必要があることです。
たしか、ハード的に現在のシリンダの絶対位置を取得することができないが、
シリンダ0へだけは正確にシークできるそうで、"RESET"はそうする
そうです(相対的には、盲目的にではあっても正確に動かせるそうです。)。

以下を参考までに。

>If an error is encountered reading a sector, use Service 0 to
>reset the drive and retry the operation. It is recommended that at
>least 3 retries be attempted before an error is signalled, since
>the error may have resulted from the diskette motor not being up
>to speed.
0010FreeDOS教徒NGNG
>>LightCone氏
そこら辺は私が提供したのですが、明らかに手抜きしてました。

DMA境界をまたぐ時これじゃ問題ですよね。
早いうちに修正します。
0011LightCone ◆sSJBc30S5w NGNG
>>10

FreeDOS教徒 様。

少なくとも、今のところ、

>mov ax, 0x0100 ; 512 byte from 0040:0000 is BIOS work area
>mov es, ax ; ... but usually it wasn't use only 256 byte
>xor bx, bx
>mov ax, 0x0001 ; read kernel from next sector
>mov di, 0x0040 ; 64 sectors
>call readsector

となっていて、512 BYTE * 64 SEC = 8000h バイトに対して、
ES:BX=100:0 ---> 線形アドレス=1000h

ということで、1000h〜9000h のバッファなので、#8の方は現状は問題ない
んですね。
0012FreeDOS教徒NGNG
>>11
まだ32KB程度ですが、すぐ64KBを超えると思います。
640KBに近付いたらまた別の対策が必要でしょうね。
0013LightCone ◆sSJBc30S5w NGNG
>>12
 多分、基本的なファイルシステムを含めて、カーネルの基本部分は、
640 KB のイメージに収まるでしょうから、それを超える部分は、
カーネル起動後の正式なファイルシステムを利用できるのではないで
しょうか。

 NWSOS では、まず、BIOS がブートセクタを読み込み、
そのブートセクタが、2KB程のローダーを読み込んで、
さらに、そのローダーが、FAT 情報を見ながら、通常のファイル形式の
カーネルイメージ(Ver 0.030現在で110KB程度)をロードする仕掛けを
採っています。

 JIS フォントを 216KB ロードする必要があるのですが、それは、
カーネルの持つ正式なファイルシステムを用いてロードしています。
フォントが読み込まれるまでは、まだ、表示系統がある意味では不完全
な状態ではあるのですが、もし、このときにエラーが起きて表示するときは、
JIS FONT相当の部分は、いわゆる「豆腐」を表示すれば暴走は防げます
ので。
0014ひげぽんNGNG
>>6 うえぽんさん
ありがとうございます、私もなかなかアセンブラが得意でなく
苦労しています(→勉強しろって感じですが・・・)
この機会にまた始められたらどうでしょうか。
0015ひげぽんNGNG
LightConeさん、FreeDOS教徒さん

ひげぽんが考慮漏れしているところをいろいろとご指摘
していただきありがとうございます。

とりあえずLightConeさんのおっしゃっている

> 多分、基本的なファイルシステムを含めて、カーネルの基本部分は、
>640 KB のイメージに収まるでしょうから、それを超える部分は、
>カーネル起動後の正式なファイルシステムを利用できるのではないで
>しょうか。

ということを踏まえて、ファイルシステム部構築に取り組もうかと思っています。
0016LightCone ◆sSJBc30S5w NGNG
>>14
 私は、アセンブラは擬似命令などは結構慣れていても、アセンブラで
書くと良く間違いをするタイプの人です。大き目の関数などだと、
C言語で書いたときより、開発やデバッグに何倍も時間がかかります。

特に最初から書いていくときはまだしも、後から修正したい場合なども、
アセンブラの場合は、関数全体のソースコードをかなり理解してから
でないと大抵正しく修正できないのでめちゃくちゃ大変です。
0017LightCone ◆sSJBc30S5w NGNG
>>16
例えばの話、FILE_MAX みたいなマクロがあったとしても、GREP置換で、
g_maxFile みたいな変数に置き換えて、再コンパイルするだけで修正
完了となる所が、アセンブラだと、一々ソースを眺めて

xxx [ebx],FILE_MAX

みたいな部分なら、
mov eax,g_maxFile
xxx [ebx],eax
見たいに修正するわけですが、もし、eax が使われているなら、
ecx や edx が使えるかどうか探してどれも駄目なら、push eax, pop eax
で囲って、というような判断を手作業でやっていくしかないですから、
めちゃくは大変です。
0018ひげぽんNGNG
> 私は、アセンブラは擬似命令などは結構慣れていても、アセンブラで
>書くと良く間違いをするタイプの人です。大き目の関数などだと、
>C言語で書いたときより、開発やデバッグに何倍も時間がかかります。

これは分かります。
そんなに大きいものは書いたことがありませんが
いくら賢く書いたつもりもでもやはりメンテナンス性は
なかなか上がらないです。

>push eax, pop eaxで囲って
これは良く見かけますね・・・

賢い人の書いた良いソースに触れる機会があって、さらにバリバリ自分でも
書くようにすれば多少は進歩するとは思うのですが
どちらもやっていません・・・
0019デフォルトの名無しさんNGNG
ファイルシステムをカーネルには組み込まないのが一番だと思われます。
スレッド管理、プロセス管理、メモリ管理などのみをカーネルに組み込み
ファイルシステムは、特殊1プロセスに過ぎない存在にすることをお奨めします。

ちなみにlinuxのカーネルは圧縮しても512kbを越えて大変なことになった時期が
あるそうです
0020LightCone ◆sSJBc30S5w NGNG
>>519
マイクロカーネルですね。

NWSOSでは、今のところカーネル内に持っていますが、DLL形式にして
分離すれば効率を落とさずに済むのでしょうか。

そういえば、マイクロカーネル方式だと、瞬間瞬間では、1プロセスのみが、
ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
並列製が落ちる可能性はありませんか。

モニリシックカーネルだと、複数プロセスが同時にカーネルコードを
走行できるので、タスク間の並列性が上がったりするのではないかと
思うのですが。
0021うえぽんNGNG
>>14 ひげぽんさん
>>6 では敬称略などしてしまい、申し訳ありませんでした。
x86エミュレーションの保護モード部の実装のために、マニュアルでは
解りにくい動作を実機で調べたりするのですが(i486搭載pc9821使用)
タスクやページングを使おうとすると DDEB.EXEなどではもうお手上げです。
エミュレーションの方はもう少し動作原理を理解すれば、
安定性が上がりそうな気もしますが・・・実モード部も遅くて不安定だし(泣)

>>16 LightCone ◆sSJBc30S5w さん
なるほど。
かなりの経験者の方でも、Cのように気軽に組んでいくのではなくて、
根気が必要なわけですね。たしかにマクロアセンブラでも、レジスタ資源
が限られているわけだから、そういった苦労がつきものですね。

擬似命令も結構わからない部分が多いですが、少しづつ勉強しながら
レスを読ませていただきます。
0022デフォルトの名無しさんNGNG
ライトコーソタンのマンコ見たい。
0023超先生@OS板 ◆leaf/RYZgY NGNG
>そういえば、マイクロカーネル方式だと、瞬間瞬間では、1プロセスのみが、
>ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
>並列製が落ちる可能性はありませんか。

subsystemサーバープロセスのスレッド数を、プロセッサ数×n (※)などで
決め打ちしておき、message-queueで処理するとか。(nまで再入可能)

※ threadが極めて軽量な実装ならば、ユーザー側スレッドのトータル数でもいいかも。
0024ひげぽんNGNG
>>19さん曰く
>ファイルシステムをカーネルには組み込まないのが一番だと思われます。
>スレッド管理、プロセス管理、メモリ管理などのみをカーネルに組み込み
>ファイルシステムは、特殊1プロセスに過ぎない存在にすることをお奨めします。

LightConeさん曰く
>マイクロカーネルですね
以下略ですすいません。

higeposは一応マイクロカーネルを目指しています。
また、ファイルシステムが容易に差し替え可能である手段として
ファイルシステムをカーネルに組み込まないというのはありだと思っています。

そのばあいは、やはりプロセス管理からはじめないといけないですよね。
minixのファイルシステムとカーネルの関係がいまいちつかみきれていないので
勉強中です。
0025ひげぽんNGNG
>>21うえぽんさん
>>14 ひげぽんさん
>>6 では敬称略などしてしまい、申し訳ありませんでした。
全然気にしてないです、というかひげぽんで良いですよ。

>x86エミュレーションの保護モード部の実装のために、マニュアルでは
>解りにくい動作を実機で調べたりするのですが(i486搭載pc9821使用)
この辺の姿勢には全く頭が下がります。見習わなくては・・・
0026ひげぽんNGNG
プロセス管理のほうを
ファイルシステムよりも先に実装したほうがよさそうな気がしてきました。
ここは考えどころですね。
マイクロカーネルの勉強もしないといけない。
0027デフォルトの名無しさんNGNG
ひげぽん、この辺よんでみなよ。
http://www.qnx.co.jp/products/manuals/index.html
おもしろいよ。

ところで、たんねんばうむの本はどのくらい進んだ?
0028デフォルトの名無しさんNGNG
>>27
こんなおもしれーマニュアルが、、、知らんかった。
情報サンクスポ
0029ひげぽんNGNG
>>27
有用なリンク紹介ありがとうございます。

>ところで、たんねんばうむの本はどのくらい進んだ?
一応ソース以外は、斜め読みしたのですが
結局辞書代わりになっていますね。
あの辺にこんなことが書いてあったはず、みたいな感じで
何回も読み返しています。
003022NGNG
おい、乱子交濡(ライトコーン)。
てめえさっさとやらせろやおけ!
0031ひげぽんNGNG
動作テストは、主にbochsで行っています。
そして大きな変更があったときや、CVS commitする前に
実機で動作確認を行っています。

他のOS製作者の方々は、どういう手段を用いているのでしょうか。
bochsではいずれ限界が来るのかな・・・
vm wareも以前評価版を入れていましたが、本格的に使うとなると
買わなきゃいけないんでしょうね。
OS開発者はタダ!!みたいなライセンスではないだろうな・・・
0032デフォルトの名無しさんNGNG
そのうちどうしても実機が必要になると思われる。
0033デフォルトの名無しさんNGNG
VS.NETのMSDNデラックスっていうのを買って登録したら
OSやらサーバーやらオフィスやらいろいろ送られてきたから、
何人かで分けて使ってるけど、これって違法じゃないよね?
マイクロソフトから何か言われた人いる?
0034デフォルトの名無しさんNGNG
http://pc3.2ch.net/test/read.cgi/tech/1037433921/のコピペですな
0035デフォルトの名無しさんNGNG
>>34
オマエうざいよ。
0036デフォルトの名無しさんNGNG
>>30
マムコ見たかったんじゃないの?
0037ひげぽんNGNG
OS名を Mona に正式改名いたしました。

sourceforge.jpのPJも移動しました。
http://sourceforge.jp/projects/mona/

今後ともよろしくお願いいたしますm(__)m
0038ひげぽんNGNG
当面の目標は、タスク(プロセス)管理です。
2つのタスクの実行の切り替えの実験から始まると思います。
一から勉強します。
0039デフォルトの名無しさんNGNG
>>37
で、Monaの由来どうするの?

Micro Kernel
Operating System
with
Network Suit
Architecture

とかにするの?
0040ひげぽんNGNG
こんばんは

>Micro Kernel
>Operating System
>with
>Network Suit
>Architecture

なかなか良いですね
がんばって早く、Network Suitにしないと(笑)
0041デフォルトの名無しさんNGNG
MONA
OS is
Not
Abone

MONA OSは落ちません。
0042デフォルトの名無しさんNGNG
>>41
ワラタ
0043 ◆Db/E231N/A NGNG
MONA
OS
does
Never
Abone
は、どうよ?
0044デフォルトの名無しさんNGNG
>>43
決まり。

まぁ、落ちるんだろうけどな。
0045デフォルトの名無しさんNGNG
2ch生まれだから『MONA』それでいかんの?
0046ひげぽんNGNG
>>41
>>43
いいですねぇ。

>>44
>まぁ、落ちるんだろうけどな。
なるべく落ちないようにがんばりまふ。

>>45
>2ch生まれだから『MONA』それでいかんの?
という意見もありますね。
0047デフォルトの名無しさんNGNG
MONA・・・モナー・・・マナー・・・マナマナ・・・ガクガク(((゚д゚;)))ブルブル
0048デフォルトの名無しさんNGNG
MinOr kNown Application
0049デフォルトの名無しさんNGNG
MONA・・・モナー・・・マナー・・・マナカナ・・・ガクガク(((゚д゚;)))ブルブル
0050デフォルトの名無しさんNGNG
>>43
doesは不要かと。

Mona is a Operating system Never Abone

とか。
というかaboneなどという英単語は無いし。
Abortならわからんではない。


MOna is Not A giko
MOna is Not Asso

とか。

MOna is Not an Application
Mona is an Operationg system, Not an Application

あれ?これガイシュツかな?
0051デフォルトの名無しさんNGNG
>というかaboneなどという英単語は無いし。

いや、あってたまるか。と。
0052ひげぽんNGNG
>>50
>>51
笑いました。
ところでvmwareって高いですね。ちょっと手が出ない(笑)

LightConeさん
nwsosのソースって公開されているんでしょうか。
ちょっと見てみたいなあと最近思います。
すんません独り言です、気にしないでください・・・
0053デフォルトの名無しさんNGNG
>>52
nwsosは商用を目指しているので、ソース公開はあり得ないんじゃないかな?
個人的には、商用クローズ開発と、オープン開発、お互いにどういう経路で
発展していくか?に興味あるので、nwsosとmonaに激しく注目している。

今のところ、さすがにnwsosとは比較にならない工事段階だけど、
比較対照としてはおもしろいと思ってます。
0054デフォルトの名無しさんNGNG
簡単にソース見ちゃ詰まらないと思いますよ。
現在の段階では、識者からアドバイスを受けて成長するのが一番。
このスレの存在意義に、ひげぽんさんの成長も含まれていると思う漏れ。
0055ひげぽんNGNG
>>52
>nwsosは商用を目指しているので、ソース公開はあり得ないんじゃないかな?
>個人的には、商用クローズ開発と、オープン開発、お互いにどういう経路で
>発展していくか?に興味あるので、nwsosとmonaに激しく注目している。
そうですよね。
商用であるということ&今までクローズでやってきた事から
オープンにするメリットは少ないかもしれませんね。

>簡単にソース見ちゃ詰まらないと思いますよ。
>現在の段階では、識者からアドバイスを受けて成長するのが一番。
>このスレの存在意義に、ひげぽんさんの成長も含まれていると思う漏れ。
そうなんですよね。
簡単にソースを見ちゃあいけない・・・分かっています。
ただ、煮詰まったときに 賢い人の書いたソースを見ると
目から鱗ですごく自分の成長になるんですよね。
もう少し煮詰まるまでがんばってみます。


0056デフォルトの名無しさんNGNG
Mysterious Occult Night Affair

神秘的で超自然的な夜の出来事
0057デフォルトの名無しさんNGNG
つーか、意図的にxはずしたってことはPOSIX互換にしたくないってことなの???

なんのために???
0058LightCone ◆sSJBc30S5w NGNG
>>そういえば、マイクロカーネル方式だと、瞬間瞬間では、1プロセスのみが、
>>ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
>>並列製が落ちる可能性はありませんか。
>subsystemサーバープロセスのスレッド数を、プロセッサ数×n (※)などで
>決め打ちしておき、message-queueで処理するとか。(nまで再入可能)
>※ threadが極めて軽量な実装ならば、ユーザー側スレッドのトータル数でもいいかも。

ご返答有難うございます。

これは、例えば、ファイルシステムのプロセスが、内部的に固定的に、
5個のスレッドを持っているような状況を想像すればいいのでしょうか。

 こういう仕組みでも一応「1プロセス」と言えなくもないわけですね。
これだと、確かに並列性は落ちないかもしれませんね。


 マイクロカーネルは、それぞれのサブシステムがシングルスレッドしか
持ってないのだとに思っていたので、もっと並列性が落ちるのかと思って
ました。
0059LightCone ◆sSJBc30S5w NGNG
>>52
残念ながら、今のところ公開はされてません。

ところで、公開されていると、逆に詰まらなくなったりしませんか?
0060LightCone ◆sSJBc30S5w NGNG
>>19, >>23

なんだか、NWSOSも、マイクロカーネルを採用したくなってきました。


 ファイルシステムのプロセスが、メモリ空間的に分離されている別
プロセスのバッファを扱う仕組みを1分くらい考えてみたのですが、
どのようなものが考えられるでしょうか。

 ちょっと思いついたのは、個々の一般ユーザープロセス内に、DLL の形で
「ファイルシステム-サポートライブラリ」みたいなものをロードして、
ファイルシステム本体のプロセスと通信するようなものです。
 サポートライブラリ自体は、それぞれのユーザープロセスの全メモリが
可視なので、共通メモリなどを介して(コピーして)ファイルシステム本体
と通信をする、という方法です。
(ちょっと難しくなりそうですが、ページングを駆使すれば、コピーせずに
済ますこともできるかもしれませんが。)


 仮想メモリ(固定ディスクとのSWAP)などとの連携も難しそうですが。
0061LightCone ◆sSJBc30S5w NGNG
>>55

>煮詰まったときに 賢い人の書いたソースを見ると
>目から鱗ですごく自分の成長になるんですよね。

 私のコードにも恥かしながら汚い場所がいっぱい有り、それが公開に
踏み切れない理由の一つでも有ります。

 他人のソースを見ると目から鱗、というのは、確かにありますね。
0062デフォルトの名無しさんNGNG
、、、
このスレでもやってるな
58と60、59と61は一つのレスにまとめられるだろうに。
行き当たりばったりでレスせずに、もっと思慮を入れろよ
0063LightCone ◆sSJBc30S5w NGNG
>>62
「まとめた方が良い」ということが絶対的に正しいのですか。
0064デフォルトの名無しさんNGNG
少なくともレス数の節約にはなるだろ
0065LightCone ◆sSJBc30S5w NGNG
>>64
逆に、スレを分けた方が分かりやすいと思う人がいたとしたら?
0066デフォルトの名無しさんNGNG
それは文章の書き方次第。工夫すれば読みやすい文章はいくらでも書ける。
0067デフォルトの名無しさんNGNG
>>65
とりあえず、文章書いたあと30分位置いてみる。
これくらいの流れなら、多少寝かせても亀になることはなかろう。
0068LightCone ◆sSJBc30S5w NGNG
>>67
文章が汚い、読みにくい、まとまりが無い、ということは認めます。
そういうことなら納得です。ついつい、殴り書きみたいな感じで書いて、
一度も読み返さない癖がありますので、、、(読み返すと何故かイライラ
するんです。)。
0069デフォルトの名無しさんNGNG
今くだらん論争でレス数を無駄に消化してるという自覚はないの?お前ら。
0070デフォルトの名無しさんNGNG
少々レスが多いほうが、見てて楽しいのですが。
技術的なウンチクばかりじゃ飽きますし、頭も痛くなります。
0071デフォルトの名無しさんNGNG
レスが多いのは結構な事だが、
同一人物の連続投稿はウザいだけ
0072ひげぽんNGNG
プロセス管理について勉強しつつ
あーでもないこーでもないと考えるのが楽しいですね。
二つのプロセスの切り替え実験をやろうと思うのですが
設計の段階でいろいろと欲張りすぎて・・・破綻
の無限ループに陥ったりします。
0073デフォルトの名無しさんNGNG
自作自演大好きなひげぽんがウザいだけ
定期ageするひげぽんがウザいだけ
0074デフォルトの名無しさんNGNG
荒れてきたね( ̄ー ̄)ニヤリッ
0075デフォルトの名無しさんNGNG
>(ちょっと難しくなりそうですが、ページングを駆使すれば、コピーせずに
>済ますこともできるかもしれませんが。)
既存のOSには見られない傾向ではあるんですが、ここは思い切って
アプリケーションが読み込みエリアを指定することができないファイルAPI作ってみては
いかがでしょ?通常、freadなどはポインタも指定しますが、これを指定させない。
で、かわりに、FileOpen時にメモリハンドラを貰う。
アプリはこのメモリハンドラ経由でアクセス。
OSがメモリプールを責任もって確保。

posixにあるようなfreadとかって前時代的な仕様だと思うんですよ。
アプリ屋のミスで不法なメモリでも平気でガツガツ書き込んでしまうし。
保護例外で止まってくれればまだありがたいんですがね。
0076LightCone ◆sSJBc30S5w NGNG
>>75
>アプリケーションが読み込みエリアを指定することができないファイルAPI作ってみては
>いかがでしょ?通常、freadなどはポインタも指定しますが、これを指定させない。
>で、かわりに、FileOpen時にメモリハンドラを貰う。
>アプリはこのメモリハンドラ経由でアクセス。
>OSがメモリプールを責任もって確保。

 一度聞いてみたいアイデアなような気がしますので、
ここでおっしゃる「メモリハンドラ」というものの詳細や、この方式での
具体的なファイルアクセスの手順を聞ければ幸いです。


>posixにあるようなfreadとかって前時代的な仕様だと思うんですよ。
>アプリ屋のミスで不法なメモリでも平気でガツガツ書き込んでしまうし。
>保護例外で止まってくれればまだありがたいんですがね。


アプリ側が不法なバッファアドレスを指定した場合、fread() API 内部で、
スーパーバイザ権限で「身代わりアクセス」してしまうことを指摘されて
いるのですね。

ご存知かもしれませんが、これを防ぐ手は一応存在していて、API の処理冒頭
で、メモリが合法かどうかをソフト的にチェックするルーチンをかませば、
跳ね返せます。CPUの保護機能だけでは無理で、通常のCPU命令を用いて
ページテーブルやセグメントの属性やフラグ類をチェックしなければならない
ので、確かに煩わしいのですが。
0077ひげぽんNGNG
暫定版PJホームページを公開しました。
たいしたコンテンツはありませんが、最新版ブートイメージが
ダウンロードできます。
http://mona.sourceforge.jp/

タスク切り替えを試みているのですが
実際の切り替え部分(セグメント間ジャンプ)て、
インラインアセンブラでも可能でしょうか?
いろいろとやっているのですが、もし不可能なことを
試みているのであれば、方向転換が必要です。
0078LightCone ◆sSJBc30S5w NGNG
>>77

>タスク切り替えを試みているのですが
>実際の切り替え部分(セグメント間ジャンプ)て、
>インラインアセンブラでも可能でしょうか?

 単体のアセンブラでさえ、通常はOS作成を前提にしていない場合が多い
ため、far jmp、その中でも特殊セグメントへの jmp 命令は記述が無理か、
または、出来たとしても特殊なOBJファイルを掃いてしまう場合があるため、
一番安心なのは、db 命令で直接埋め込む方法かもしれません。


 あと、IA32の場合、タスク切り替え用の jmp 命令は、通常の命令の
組み合わせで書けてしまいます。フラグ類の設定を通常命令の組み合わせ
でやってしまうだけです。実はそちらの方が楽だったりします。
0079LightCone ◆sSJBc30S5w NGNG
>>78
 IA32には、「タスク間jmp/call」「レベル遷移jmp/call」など色々
用意されていますが、なんのことはない、メモリ中のデータ構造のフラグ
変更と、レジスタセットの値の変更を超えるものではないんですね。

 ページディレクトリの物理アドレスを保持するcr3、ローカルセグメント
のテーブルを設定する ldtr、Protect/V8086 モードを区別するeflags、
TSSセグメントセレクタtr などの設定を変えることや、全レジスタの
保存・復帰以外とには、特にやることは無かったと思います。

 (tr から全ての情報がたどれますが、ltr 命令だけでは、確かcr3や、
ldtr は変更されなかったような気がします。)
0080ひげぽんNGNG
LightConeさん

> 単体のアセンブラでさえ、通常はOS作成を前提にしていない場合が多い
>ため、far jmp、その中でも特殊セグメントへの jmp 命令は記述が無理か、
>または、出来たとしても特殊なOBJファイルを掃いてしまう場合があるため、
>一番安心なのは、db 命令で直接埋め込む方法かもしれません。

目から鱗です。db命令で埋め込むとは気づきませんでした・・・
最悪の場合この手があるのですね。ありがとうございます!!!

> あと、IA32の場合、タスク切り替え用の jmp 命令は、通常の命令の
>組み合わせで書けてしまいます。フラグ類の設定を通常命令の組み合わせ
>でやってしまうだけです。実はそちらの方が楽だったりします。

これは一応認識していたのですが、
たしかに、おっしゃる通りかもしれません。
0081ひげぽんNGNG
>>78, 79
おかげでProcessManagerの設計指針が見えてきました。
ありがとうございます。
0082ひげぽんNGNG
monaでは
secondboot.asmにてgdt関連の設定を行っています。
dw gdt_end - gdt0 - 1 ; gdt limit
dd gdt0 + 0x100 * 16 ; start adderess
プロテクトモード移行後
インラインアセンブラで
asm volatile("sgdt %0\n"
: /* no output */
: "m" (gdtr)
);
_sys_printf("gdtr.limit = %d\n", gdtr.limit);
_sys_printf("gdtr.base = %d\n", gdtr.base);
とやってみると
gdtr.limit = 31
gdtr.base = 0
と表示されます。
limitは意図どおりの値なのですが
baseの値が0というのが違和感があります。
何か大きな勘違いをしてそうで・・・
0083 ◆sVYyxB.646 NGNG
trの参照先のTSSが32bitならcr3があるよ。
ldtrは使ってないんで覚えてないがあるはず。。。
0084デフォルトの名無しさんNGNG
ぶー何処いった?
0085デフォルトの名無しさんNGNG
>75 じゃないから、違っているかもしれないけど...

>>76
>  一度聞いてみたいアイデアなような気がしますので、
> ここでおっしゃる「メモリハンドラ」というものの詳細や、この方式での
> 具体的なファイルアクセスの手順を聞ければ幸いです。

メモリハンドラは、単なるポインタでいいと思う。C で書けば...

File F = fopen("test.txt", "r");
char *p = fread(F, 100);

とかすれば、OS が 100バイトの領域を確保して、そこにデータを読み込んでから、そのアドレスを返してくれるという感じかと...。
C だと、free(p) とかしないとダメだけど、Java とかならそれも必要ないだろうし。これで、fread() が間違ったアドレスにデータを書き込んでしまうことは防げるでしょ ?

> アプリ側が不法なバッファアドレスを指定した場合、fread() API 内部で、
> スーパーバイザ権限で「身代わりアクセス」してしまうことを指摘されて
> いるのですね。

今時、そんなタコな OS は無いでしょう。当然...

> ご存知かもしれませんが、これを防ぐ手は一応存在していて、API の処理冒頭
> で、メモリが合法かどうかをソフト的にチェックするルーチンをかませば、
> 跳ね返せます。

ぐらいはやってはず。そうではなく、fread() に間違ったアドレス指定して、自分で使う領域を壊したりするのを防ぎたいんだと思う。最近のコンピュータウィルスで使われるバッファーオーバーランとかを避けたいだけじゃないでしょうか。

> CPUの保護機能だけでは無理で、通常のCPU命令を用いてページテーブルや
> セグメントの属性やフラグ類をチェックしなければならないので、確かに
> 煩わしいのですが。

プロセサによっては、保護機能を使えるのもありますよ。(68K の moves とかね。)
0086ひげぽんNGNG
>>82
新たにTSSを追加をする場合
dt分のスペースをお尻に確保しなければならないことに気がつきました。
secondboot.asmで仮に設定しておいて
C++に移行してからもう一度設定しなおしたほうがいいのでしょうか。
うーん勉強が足りません。
0087 ◆sVYyxB.646 NGNG
バッファを固定にしてユーザーモードからバッファを転送すれば何も考えなくても保護機能が動きます。(*゚ー゚)
少し無駄ですが、、、
0088ひげぽんNGNG
今日本屋で久しぶりに詳解Linuxカーネル
を立ち読みしてみました。
初めて読んだときはさっぱり分からなかったですが
難易度的にちょうど良く、自分の知りたいことが
たくさん書いてあるので欲しい。。。でも高い。
http://www.amazon.co.jp/exec/obidos/tg/detail/-/books/4873110483/reviews/ref%3Ded%5Fer%5Fdp%5F1%5F1/249-3833329-4800325

どこかの古本屋に売ってないかな・・・
図書館でも良いな。
0089デフォルトの名無しさんNGNG
>>88
あれってソースがただ印刷されて、コメントが日本語訳されてるだけじゃなかった?
役に立つような解説はなかったような。
カーネルをダウンロードして読むってのじゃだめなのかな?
009089NGNG
>>89
こっちと勘違いしてた。上のは見たことない。
http://www.amazon.co.jp/exec/obidos/ASIN/4797820063/qid=1038350048/sr=1-6/ref=sr_1_2_6/250-3155597-6663410
0091デフォルトの名無しさんNGNG
BSDだけどこれがお勧め
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3313-4.html
0092LightCone ◆sSJBc30S5w NGNG
>>88
詳細Linuxカーネル 5800円:高いですが参考になりそうなので一ヶ月ほど前に購入。
Linux2.4 インターナル 3200円:内容は上記より少なめですが、短いので読みやすいかも。

OS そのものとは関係有りませんが、SHELL プログラミングでお勧めなのが、

SOFT BANK「入門UNIXシェルプログラミング」Bruce Blinn著 山下 哲典 訳
0093LightCone ◆sSJBc30S5w NGNG
>>87
 (恐らく)転送時間が1レベル増えるであろうことを気にしないなら単純でよさそうな方法
ですね。

 セクタの内容をキャッシュするセクタバッファの他に、ファイルごとに
キャッシュするファイルバッファというものがあるそうですが、後者を
うまく使えばバッファの転送時間もかなり減らせるかもしれませんが。
0094LightCone ◆sSJBc30S5w NGNG
>>85

>そうではなく、fread() に間違ったアドレス指定して、自分で使う領域を
>壊したりするのを防ぎたいんだと思う。最近のコンピュータウィルスで使わ
>れるバッファーオーバーランとかを避けたいだけじゃないでしょうか。

fread()の場合は取得サイズをアプリ側が指定するので特に問題は
ないと思うのですが、OS側から可変長のデータを取得する時には
その問題を感じます。

 例えば、何らかの文字列データ(例では他のタスクの名称)をOSから
取得したい時、APIによっては次のような形式を用いますが、ちょっと問題
を感じます。

<<続く>>
0095LightCone ◆sSJBc30S5w NGNG
<#94の続き>

//int GetTaskName(HTASK hTask, char *pFilename);

void PutTaskName(HTASK hTask)
{
int size = GetTaskName(hTask, NULL);
if (size == 0) {
put_err("hTask is wrong?");
}
char *pName = malloc(size + 1);
if (ptr == NULL) {
put_err("Memory shortage!!");
}
else {
GetTaskName(hTask, pName);
printf("The name of task(%08X) is %s\n", hTask, pName);
free(pName);
}
}

一言メモ:
 GetTaskName(hTask,pName)は、pName にNULLを指定すると、
受け取るタスク名の長さを返す。通常、二度呼び出して、pNameのバッファ
をアプリ側が確保する。
0096LightCone ◆sSJBc30S5w NGNG
<#95の続き>

 ここで問題となるのは、hTaskの名前が二度のGetTaskName()呼び出しの
間に変化する可能性です。起動後のタスクではタスク名が絶対変化しないよう
なシステムだと問題なくても、SetTaskName()のようなAPIが用意されている
場合に問題が起きます。
 もし、今の例の様に、GetTaskName()を二度呼ぶような仕様だと、
何らかのロック処理が必要になるはずですが、現実のよく知られたOSでは
私の知る限りそれが出来ないケースがあります。


このような場合には、

const char *GetTaskName2(void);

のようなAPIの方が簡単では有ると思います。ただし、これにも短所が
あります。空システムメモリ空間が圧迫される可能性があることです。
0097ひげぽんNGNG
>>90
>こっちと勘違いしてた。上のは見たことない。
おお、こんなのもあるんですね。
指定されたURLのレビューを見ると詳解の後に
読むことを薦めていますね。

>>92 LightConeさん
>詳細Linuxカーネル 5800円:高いですが参考になりそうなので一ヶ月ほど前に購入。
えっと、だいぶ背中を押されました(笑)
たぶん買います、いやきっと買うでしょう。

>OS そのものとは関係有りませんが、SHELL プログラミングでお勧めなのが、
>SOFT BANK「入門UNIXシェルプログラミング」Bruce Blinn著 山下 哲典 訳
これ会社の同僚が持っていた気がします。仕事でcshを使うので
ちょっと見せてもらってみます。




0098ひげぽんNGNG
>>91
>BSDだけどこれがお勧め
>http://www.ascii.co.jp/books/detail/4-7561/4-7561-3313-4.html
これ安いですねぇ。
内容の難易度的にはどうなんでしょうか。
今度本屋で探してみます。
0099LightCone ◆sSJBc30S5w NGNG
>>97
 OS作りでは、実はコマンドラインSHELLがかなり重要なのではないかと
思えてきた今日この頃です。

 UNIX好きの人でも、CYGWIN環境があれば満足してしまう人も多いようで、
一番大きな理由が、UNIX互換のシェルが使えるからだそうです。

 UNIXは、カーネルも優れた側面を持っていると思いますが、
シェル、特にシェルスクリプトの機能(その一行切り出しとしての
コマンドライン解釈部)が強力なことも見逃せないと思います。


 それにしても UNIX のシェルはいいですね。
0100デフォルトの名無しさんNGNG
割込み、すいません。

C言語でモニタとコルーチンを実装(ライブラリを作成)したいのですが、
WEBで探してもなかなか合った文献がみつかりません。

どなたか、実装方法教えてくれませんか?
WEBや書籍でもいいのでお願いします。


*Modula-2からCへの移植を行うため、モニタとコルーチン機能がCで必要になりまし
た。
0101デフォルトの名無しさんNGNG
>>98
中級ぐらいと思う。
メインはデバドラとブートコード。
「詳解Linuxカーネル」はあまりLinux板では評判よくなかった。
自分ももってるけどLinuxOSの概念の説明で
具体的なコードが書かれてないからすきじゃない
■ このスレッドは過去ログ倉庫に格納されています