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/
0002デフォルトの名無しさん
NGNGがんばってねん。
0003ひげぽん
NGNGOSASK
http://www.imasy.or.jp/~kawai/osask/
NWSOS
http://homepage2.nifty.com/nowsmart/nwsos.htm
????
http://sourceforge.jp/projects/higepos/
0004FreeDOS教徒
NGNG0005ひげぽん
NGNGありがとうございます。
ブートコード問題が一段落したのでほっと一息です。
ついでにA20問題も一応対処しました。
0006うえぽん
NGNG忙しいとは思いますが、がんばってください。
僕も大学の後半からプログラミング初めて、
趣味でi486(386)エミュレーションなど体験し
遊びました。(なかなか安定しませんが)
結局マクロアセンブラなどはあまり解りませんが、
楽しく板を読ませて頂いております。
忙しいけど、またエミュはじめたいなあ。
0007デフォルトの名無しさん
NGNG0008LightCone ◆sSJBc30S5w
NGNGないと思うのですが、それより問題になると思うのが、
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そこら辺は私が提供したのですが、明らかに手抜きしてました。
DMA境界をまたぐ時これじゃ問題ですよね。
早いうちに修正します。
0011LightCone ◆sSJBc30S5w
NGNGFreeDOS教徒 様。
少なくとも、今のところ、
>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の方は現状は問題ない
んですね。
0013LightCone ◆sSJBc30S5w
NGNG多分、基本的なファイルシステムを含めて、カーネルの基本部分は、
640 KB のイメージに収まるでしょうから、それを超える部分は、
カーネル起動後の正式なファイルシステムを利用できるのではないで
しょうか。
NWSOS では、まず、BIOS がブートセクタを読み込み、
そのブートセクタが、2KB程のローダーを読み込んで、
さらに、そのローダーが、FAT 情報を見ながら、通常のファイル形式の
カーネルイメージ(Ver 0.030現在で110KB程度)をロードする仕掛けを
採っています。
JIS フォントを 216KB ロードする必要があるのですが、それは、
カーネルの持つ正式なファイルシステムを用いてロードしています。
フォントが読み込まれるまでは、まだ、表示系統がある意味では不完全
な状態ではあるのですが、もし、このときにエラーが起きて表示するときは、
JIS FONT相当の部分は、いわゆる「豆腐」を表示すれば暴走は防げます
ので。
0014ひげぽん
NGNGありがとうございます、私もなかなかアセンブラが得意でなく
苦労しています(→勉強しろって感じですが・・・)
この機会にまた始められたらどうでしょうか。
0015ひげぽん
NGNGひげぽんが考慮漏れしているところをいろいろとご指摘
していただきありがとうございます。
とりあえずLightConeさんのおっしゃっている
> 多分、基本的なファイルシステムを含めて、カーネルの基本部分は、
>640 KB のイメージに収まるでしょうから、それを超える部分は、
>カーネル起動後の正式なファイルシステムを利用できるのではないで
>しょうか。
ということを踏まえて、ファイルシステム部構築に取り組もうかと思っています。
0016LightCone ◆sSJBc30S5w
NGNG私は、アセンブラは擬似命令などは結構慣れていても、アセンブラで
書くと良く間違いをするタイプの人です。大き目の関数などだと、
C言語で書いたときより、開発やデバッグに何倍も時間がかかります。
特に最初から書いていくときはまだしも、後から修正したい場合なども、
アセンブラの場合は、関数全体のソースコードをかなり理解してから
でないと大抵正しく修正できないのでめちゃくちゃ大変です。
0017LightCone ◆sSJBc30S5w
NGNG例えばの話、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マイクロカーネルですね。
NWSOSでは、今のところカーネル内に持っていますが、DLL形式にして
分離すれば効率を落とさずに済むのでしょうか。
そういえば、マイクロカーネル方式だと、瞬間瞬間では、1プロセスのみが、
ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
並列製が落ちる可能性はありませんか。
モニリシックカーネルだと、複数プロセスが同時にカーネルコードを
走行できるので、タスク間の並列性が上がったりするのではないかと
思うのですが。
0021うえぽん
NGNG>>6 では敬称略などしてしまい、申し訳ありませんでした。
x86エミュレーションの保護モード部の実装のために、マニュアルでは
解りにくい動作を実機で調べたりするのですが(i486搭載pc9821使用)
タスクやページングを使おうとすると DDEB.EXEなどではもうお手上げです。
エミュレーションの方はもう少し動作原理を理解すれば、
安定性が上がりそうな気もしますが・・・実モード部も遅くて不安定だし(泣)
>>16 LightCone ◆sSJBc30S5w さん
なるほど。
かなりの経験者の方でも、Cのように気軽に組んでいくのではなくて、
根気が必要なわけですね。たしかにマクロアセンブラでも、レジスタ資源
が限られているわけだから、そういった苦労がつきものですね。
擬似命令も結構わからない部分が多いですが、少しづつ勉強しながら
レスを読ませていただきます。
0022デフォルトの名無しさん
NGNG0023超先生@OS板 ◆leaf/RYZgY
NGNG>ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
>並列製が落ちる可能性はありませんか。
subsystemサーバープロセスのスレッド数を、プロセッサ数×n (※)などで
決め打ちしておき、message-queueで処理するとか。(nまで再入可能)
※ threadが極めて軽量な実装ならば、ユーザー側スレッドのトータル数でもいいかも。
0024ひげぽん
NGNG>ファイルシステムをカーネルには組み込まないのが一番だと思われます。
>スレッド管理、プロセス管理、メモリ管理などのみをカーネルに組み込み
>ファイルシステムは、特殊1プロセスに過ぎない存在にすることをお奨めします。
LightConeさん曰く
>マイクロカーネルですね
以下略ですすいません。
higeposは一応マイクロカーネルを目指しています。
また、ファイルシステムが容易に差し替え可能である手段として
ファイルシステムをカーネルに組み込まないというのはありだと思っています。
そのばあいは、やはりプロセス管理からはじめないといけないですよね。
minixのファイルシステムとカーネルの関係がいまいちつかみきれていないので
勉強中です。
0025ひげぽん
NGNG>>14 ひげぽんさん
>>6 では敬称略などしてしまい、申し訳ありませんでした。
全然気にしてないです、というかひげぽんで良いですよ。
>x86エミュレーションの保護モード部の実装のために、マニュアルでは
>解りにくい動作を実機で調べたりするのですが(i486搭載pc9821使用)
この辺の姿勢には全く頭が下がります。見習わなくては・・・
0026ひげぽん
NGNGファイルシステムよりも先に実装したほうがよさそうな気がしてきました。
ここは考えどころですね。
マイクロカーネルの勉強もしないといけない。
0027デフォルトの名無しさん
NGNGhttp://www.qnx.co.jp/products/manuals/index.html
おもしろいよ。
ところで、たんねんばうむの本はどのくらい進んだ?
0028デフォルトの名無しさん
NGNGこんなおもしれーマニュアルが、、、知らんかった。
情報サンクスポ
0029ひげぽん
NGNG有用なリンク紹介ありがとうございます。
>ところで、たんねんばうむの本はどのくらい進んだ?
一応ソース以外は、斜め読みしたのですが
結局辞書代わりになっていますね。
あの辺にこんなことが書いてあったはず、みたいな感じで
何回も読み返しています。
003022
NGNGてめえさっさとやらせろやおけ!
0031ひげぽん
NGNGそして大きな変更があったときや、CVS commitする前に
実機で動作確認を行っています。
他のOS製作者の方々は、どういう手段を用いているのでしょうか。
bochsではいずれ限界が来るのかな・・・
vm wareも以前評価版を入れていましたが、本格的に使うとなると
買わなきゃいけないんでしょうね。
OS開発者はタダ!!みたいなライセンスではないだろうな・・・
0032デフォルトの名無しさん
NGNG0033デフォルトの名無しさん
NGNGOSやらサーバーやらオフィスやらいろいろ送られてきたから、
何人かで分けて使ってるけど、これって違法じゃないよね?
マイクロソフトから何か言われた人いる?
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNGオマエうざいよ。
0036デフォルトの名無しさん
NGNGマムコ見たかったんじゃないの?
0037ひげぽん
NGNGsourceforge.jpのPJも移動しました。
http://sourceforge.jp/projects/mona/
今後ともよろしくお願いいたしますm(__)m
0038ひげぽん
NGNG2つのタスクの実行の切り替えの実験から始まると思います。
一から勉強します。
0039デフォルトの名無しさん
NGNGで、Monaの由来どうするの?
Micro Kernel
Operating System
with
Network Suit
Architecture
とかにするの?
0040ひげぽん
NGNG>Micro Kernel
>Operating System
>with
>Network Suit
>Architecture
なかなか良いですね
がんばって早く、Network Suitにしないと(笑)
0041デフォルトの名無しさん
NGNGOS is
Not
Abone
MONA OSは落ちません。
0042デフォルトの名無しさん
NGNGワラタ
0044デフォルトの名無しさん
NGNG決まり。
まぁ、落ちるんだろうけどな。
0045デフォルトの名無しさん
NGNG0046ひげぽん
NGNG>>43
いいですねぇ。
>>44
>まぁ、落ちるんだろうけどな。
なるべく落ちないようにがんばりまふ。
>>45
>2ch生まれだから『MONA』それでいかんの?
という意見もありますね。
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNG0049デフォルトの名無しさん
NGNG0050デフォルトの名無しさん
NGNGdoesは不要かと。
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いや、あってたまるか。と。
0052ひげぽん
NGNG>>51
笑いました。
ところでvmwareって高いですね。ちょっと手が出ない(笑)
LightConeさん
nwsosのソースって公開されているんでしょうか。
ちょっと見てみたいなあと最近思います。
すんません独り言です、気にしないでください・・・
0053デフォルトの名無しさん
NGNGnwsosは商用を目指しているので、ソース公開はあり得ないんじゃないかな?
個人的には、商用クローズ開発と、オープン開発、お互いにどういう経路で
発展していくか?に興味あるので、nwsosとmonaに激しく注目している。
今のところ、さすがにnwsosとは比較にならない工事段階だけど、
比較対照としてはおもしろいと思ってます。
0054デフォルトの名無しさん
NGNG現在の段階では、識者からアドバイスを受けて成長するのが一番。
このスレの存在意義に、ひげぽんさんの成長も含まれていると思う漏れ。
0055ひげぽん
NGNG>nwsosは商用を目指しているので、ソース公開はあり得ないんじゃないかな?
>個人的には、商用クローズ開発と、オープン開発、お互いにどういう経路で
>発展していくか?に興味あるので、nwsosとmonaに激しく注目している。
そうですよね。
商用であるということ&今までクローズでやってきた事から
オープンにするメリットは少ないかもしれませんね。
>簡単にソース見ちゃ詰まらないと思いますよ。
>現在の段階では、識者からアドバイスを受けて成長するのが一番。
>このスレの存在意義に、ひげぽんさんの成長も含まれていると思う漏れ。
そうなんですよね。
簡単にソースを見ちゃあいけない・・・分かっています。
ただ、煮詰まったときに 賢い人の書いたソースを見ると
目から鱗ですごく自分の成長になるんですよね。
もう少し煮詰まるまでがんばってみます。
0056デフォルトの名無しさん
NGNG神秘的で超自然的な夜の出来事
0057デフォルトの名無しさん
NGNGなんのために???
0058LightCone ◆sSJBc30S5w
NGNG>>ファイルシステムのコードを走行するのでしょうか。もしそうだとすると
>>並列製が落ちる可能性はありませんか。
>subsystemサーバープロセスのスレッド数を、プロセッサ数×n (※)などで
>決め打ちしておき、message-queueで処理するとか。(nまで再入可能)
>※ threadが極めて軽量な実装ならば、ユーザー側スレッドのトータル数でもいいかも。
ご返答有難うございます。
これは、例えば、ファイルシステムのプロセスが、内部的に固定的に、
5個のスレッドを持っているような状況を想像すればいいのでしょうか。
こういう仕組みでも一応「1プロセス」と言えなくもないわけですね。
これだと、確かに並列性は落ちないかもしれませんね。
マイクロカーネルは、それぞれのサブシステムがシングルスレッドしか
持ってないのだとに思っていたので、もっと並列性が落ちるのかと思って
ました。
0060LightCone ◆sSJBc30S5w
NGNGなんだか、NWSOSも、マイクロカーネルを採用したくなってきました。
ファイルシステムのプロセスが、メモリ空間的に分離されている別
プロセスのバッファを扱う仕組みを1分くらい考えてみたのですが、
どのようなものが考えられるでしょうか。
ちょっと思いついたのは、個々の一般ユーザープロセス内に、DLL の形で
「ファイルシステム-サポートライブラリ」みたいなものをロードして、
ファイルシステム本体のプロセスと通信するようなものです。
サポートライブラリ自体は、それぞれのユーザープロセスの全メモリが
可視なので、共通メモリなどを介して(コピーして)ファイルシステム本体
と通信をする、という方法です。
(ちょっと難しくなりそうですが、ページングを駆使すれば、コピーせずに
済ますこともできるかもしれませんが。)
仮想メモリ(固定ディスクとのSWAP)などとの連携も難しそうですが。
0061LightCone ◆sSJBc30S5w
NGNG>煮詰まったときに 賢い人の書いたソースを見ると
>目から鱗ですごく自分の成長になるんですよね。
私のコードにも恥かしながら汚い場所がいっぱい有り、それが公開に
踏み切れない理由の一つでも有ります。
他人のソースを見ると目から鱗、というのは、確かにありますね。
0062デフォルトの名無しさん
NGNGこのスレでもやってるな
58と60、59と61は一つのレスにまとめられるだろうに。
行き当たりばったりでレスせずに、もっと思慮を入れろよ
0064デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNGとりあえず、文章書いたあと30分位置いてみる。
これくらいの流れなら、多少寝かせても亀になることはなかろう。
0068LightCone ◆sSJBc30S5w
NGNG文章が汚い、読みにくい、まとまりが無い、ということは認めます。
そういうことなら納得です。ついつい、殴り書きみたいな感じで書いて、
一度も読み返さない癖がありますので、、、(読み返すと何故かイライラ
するんです。)。
0069デフォルトの名無しさん
NGNG0070デフォルトの名無しさん
NGNG技術的なウンチクばかりじゃ飽きますし、頭も痛くなります。
0071デフォルトの名無しさん
NGNG同一人物の連続投稿はウザいだけ
0072ひげぽん
NGNGあーでもないこーでもないと考えるのが楽しいですね。
二つのプロセスの切り替え実験をやろうと思うのですが
設計の段階でいろいろと欲張りすぎて・・・破綻
の無限ループに陥ったりします。
0073デフォルトの名無しさん
NGNG定期ageするひげぽんがウザいだけ
0074デフォルトの名無しさん
NGNG0075デフォルトの名無しさん
NGNG>済ますこともできるかもしれませんが。)
既存のOSには見られない傾向ではあるんですが、ここは思い切って
アプリケーションが読み込みエリアを指定することができないファイルAPI作ってみては
いかがでしょ?通常、freadなどはポインタも指定しますが、これを指定させない。
で、かわりに、FileOpen時にメモリハンドラを貰う。
アプリはこのメモリハンドラ経由でアクセス。
OSがメモリプールを責任もって確保。
posixにあるようなfreadとかって前時代的な仕様だと思うんですよ。
アプリ屋のミスで不法なメモリでも平気でガツガツ書き込んでしまうし。
保護例外で止まってくれればまだありがたいんですがね。
0076LightCone ◆sSJBc30S5w
NGNG>アプリケーションが読み込みエリアを指定することができないファイルAPI作ってみては
>いかがでしょ?通常、freadなどはポインタも指定しますが、これを指定させない。
>で、かわりに、FileOpen時にメモリハンドラを貰う。
>アプリはこのメモリハンドラ経由でアクセス。
>OSがメモリプールを責任もって確保。
一度聞いてみたいアイデアなような気がしますので、
ここでおっしゃる「メモリハンドラ」というものの詳細や、この方式での
具体的なファイルアクセスの手順を聞ければ幸いです。
>posixにあるようなfreadとかって前時代的な仕様だと思うんですよ。
>アプリ屋のミスで不法なメモリでも平気でガツガツ書き込んでしまうし。
>保護例外で止まってくれればまだありがたいんですがね。
アプリ側が不法なバッファアドレスを指定した場合、fread() API 内部で、
スーパーバイザ権限で「身代わりアクセス」してしまうことを指摘されて
いるのですね。
ご存知かもしれませんが、これを防ぐ手は一応存在していて、API の処理冒頭
で、メモリが合法かどうかをソフト的にチェックするルーチンをかませば、
跳ね返せます。CPUの保護機能だけでは無理で、通常のCPU命令を用いて
ページテーブルやセグメントの属性やフラグ類をチェックしなければならない
ので、確かに煩わしいのですが。
0077ひげぽん
NGNGたいしたコンテンツはありませんが、最新版ブートイメージが
ダウンロードできます。
http://mona.sourceforge.jp/
タスク切り替えを試みているのですが
実際の切り替え部分(セグメント間ジャンプ)て、
インラインアセンブラでも可能でしょうか?
いろいろとやっているのですが、もし不可能なことを
試みているのであれば、方向転換が必要です。
0078LightCone ◆sSJBc30S5w
NGNG>タスク切り替えを試みているのですが
>実際の切り替え部分(セグメント間ジャンプ)て、
>インラインアセンブラでも可能でしょうか?
単体のアセンブラでさえ、通常はOS作成を前提にしていない場合が多い
ため、far jmp、その中でも特殊セグメントへの jmp 命令は記述が無理か、
または、出来たとしても特殊なOBJファイルを掃いてしまう場合があるため、
一番安心なのは、db 命令で直接埋め込む方法かもしれません。
あと、IA32の場合、タスク切り替え用の jmp 命令は、通常の命令の
組み合わせで書けてしまいます。フラグ類の設定を通常命令の組み合わせ
でやってしまうだけです。実はそちらの方が楽だったりします。
0079LightCone ◆sSJBc30S5w
NGNGIA32には、「タスク間jmp/call」「レベル遷移jmp/call」など色々
用意されていますが、なんのことはない、メモリ中のデータ構造のフラグ
変更と、レジスタセットの値の変更を超えるものではないんですね。
ページディレクトリの物理アドレスを保持するcr3、ローカルセグメント
のテーブルを設定する ldtr、Protect/V8086 モードを区別するeflags、
TSSセグメントセレクタtr などの設定を変えることや、全レジスタの
保存・復帰以外とには、特にやることは無かったと思います。
(tr から全ての情報がたどれますが、ltr 命令だけでは、確かcr3や、
ldtr は変更されなかったような気がします。)
0080ひげぽん
NGNG> 単体のアセンブラでさえ、通常はOS作成を前提にしていない場合が多い
>ため、far jmp、その中でも特殊セグメントへの jmp 命令は記述が無理か、
>または、出来たとしても特殊なOBJファイルを掃いてしまう場合があるため、
>一番安心なのは、db 命令で直接埋め込む方法かもしれません。
目から鱗です。db命令で埋め込むとは気づきませんでした・・・
最悪の場合この手があるのですね。ありがとうございます!!!
> あと、IA32の場合、タスク切り替え用の jmp 命令は、通常の命令の
>組み合わせで書けてしまいます。フラグ類の設定を通常命令の組み合わせ
>でやってしまうだけです。実はそちらの方が楽だったりします。
これは一応認識していたのですが、
たしかに、おっしゃる通りかもしれません。
0082ひげぽん
NGNGsecondboot.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というのが違和感があります。
何か大きな勘違いをしてそうで・・・
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNG>>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新たにTSSを追加をする場合
dt分のスペースをお尻に確保しなければならないことに気がつきました。
secondboot.asmで仮に設定しておいて
C++に移行してからもう一度設定しなおしたほうがいいのでしょうか。
うーん勉強が足りません。
0088ひげぽん
NGNGを立ち読みしてみました。
初めて読んだときはさっぱり分からなかったですが
難易度的にちょうど良く、自分の知りたいことが
たくさん書いてあるので欲しい。。。でも高い。
http://www.amazon.co.jp/exec/obidos/tg/detail/-/books/4873110483/reviews/ref%3Ded%5Fer%5Fdp%5F1%5F1/249-3833329-4800325
どこかの古本屋に売ってないかな・・・
図書館でも良いな。
0089デフォルトの名無しさん
NGNGあれってソースがただ印刷されて、コメントが日本語訳されてるだけじゃなかった?
役に立つような解説はなかったような。
カーネルをダウンロードして読むってのじゃだめなのかな?
009089
NGNGこっちと勘違いしてた。上のは見たことない。
http://www.amazon.co.jp/exec/obidos/ASIN/4797820063/qid=1038350048/sr=1-6/ref=sr_1_2_6/250-3155597-6663410
0091デフォルトの名無しさん
NGNGhttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3313-4.html
0092LightCone ◆sSJBc30S5w
NGNG詳細Linuxカーネル 5800円:高いですが参考になりそうなので一ヶ月ほど前に購入。
Linux2.4 インターナル 3200円:内容は上記より少なめですが、短いので読みやすいかも。
OS そのものとは関係有りませんが、SHELL プログラミングでお勧めなのが、
SOFT BANK「入門UNIXシェルプログラミング」Bruce Blinn著 山下 哲典 訳
0093LightCone ◆sSJBc30S5w
NGNG(恐らく)転送時間が1レベル増えるであろうことを気にしないなら単純でよさそうな方法
ですね。
セクタの内容をキャッシュするセクタバッファの他に、ファイルごとに
キャッシュするファイルバッファというものがあるそうですが、後者を
うまく使えばバッファの転送時間もかなり減らせるかもしれませんが。
0094LightCone ◆sSJBc30S5w
NGNG>そうではなく、fread() に間違ったアドレス指定して、自分で使う領域を
>壊したりするのを防ぎたいんだと思う。最近のコンピュータウィルスで使わ
>れるバッファーオーバーランとかを避けたいだけじゃないでしょうか。
fread()の場合は取得サイズをアプリ側が指定するので特に問題は
ないと思うのですが、OS側から可変長のデータを取得する時には
その問題を感じます。
例えば、何らかの文字列データ(例では他のタスクの名称)をOSから
取得したい時、APIによっては次のような形式を用いますが、ちょっと問題
を感じます。
<<続く>>
0095LightCone ◆sSJBc30S5w
NGNG//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ここで問題となるのは、hTaskの名前が二度のGetTaskName()呼び出しの
間に変化する可能性です。起動後のタスクではタスク名が絶対変化しないよう
なシステムだと問題なくても、SetTaskName()のようなAPIが用意されている
場合に問題が起きます。
もし、今の例の様に、GetTaskName()を二度呼ぶような仕様だと、
何らかのロック処理が必要になるはずですが、現実のよく知られたOSでは
私の知る限りそれが出来ないケースがあります。
このような場合には、
const char *GetTaskName2(void);
のようなAPIの方が簡単では有ると思います。ただし、これにも短所が
あります。空システムメモリ空間が圧迫される可能性があることです。
0097ひげぽん
NGNG>こっちと勘違いしてた。上のは見たことない。
おお、こんなのもあるんですね。
指定されたURLのレビューを見ると詳解の後に
読むことを薦めていますね。
>>92 LightConeさん
>詳細Linuxカーネル 5800円:高いですが参考になりそうなので一ヶ月ほど前に購入。
えっと、だいぶ背中を押されました(笑)
たぶん買います、いやきっと買うでしょう。
>OS そのものとは関係有りませんが、SHELL プログラミングでお勧めなのが、
>SOFT BANK「入門UNIXシェルプログラミング」Bruce Blinn著 山下 哲典 訳
これ会社の同僚が持っていた気がします。仕事でcshを使うので
ちょっと見せてもらってみます。
0098ひげぽん
NGNG>BSDだけどこれがお勧め
>http://www.ascii.co.jp/books/detail/4-7561/4-7561-3313-4.html
これ安いですねぇ。
内容の難易度的にはどうなんでしょうか。
今度本屋で探してみます。
0099LightCone ◆sSJBc30S5w
NGNGOS作りでは、実はコマンドラインSHELLがかなり重要なのではないかと
思えてきた今日この頃です。
UNIX好きの人でも、CYGWIN環境があれば満足してしまう人も多いようで、
一番大きな理由が、UNIX互換のシェルが使えるからだそうです。
UNIXは、カーネルも優れた側面を持っていると思いますが、
シェル、特にシェルスクリプトの機能(その一行切り出しとしての
コマンドライン解釈部)が強力なことも見逃せないと思います。
それにしても UNIX のシェルはいいですね。
0100デフォルトの名無しさん
NGNGC言語でモニタとコルーチンを実装(ライブラリを作成)したいのですが、
WEBで探してもなかなか合った文献がみつかりません。
どなたか、実装方法教えてくれませんか?
WEBや書籍でもいいのでお願いします。
*Modula-2からCへの移植を行うため、モニタとコルーチン機能がCで必要になりまし
た。
0101デフォルトの名無しさん
NGNG中級ぐらいと思う。
メインはデバドラとブートコード。
「詳解Linuxカーネル」はあまりLinux板では評判よくなかった。
自分ももってるけどLinuxOSの概念の説明で
具体的なコードが書かれてないからすきじゃない
■ このスレッドは過去ログ倉庫に格納されています