アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
書込み禁止領域に書きたければ (スコア:1)
str[ 0 ] = 'x';
とか?
でも実際に動かしてみると、
Segmentation fault
だって。
アタクシだめぽ (スコア:1)
けど、とりあえず(ここ大事)ソースに書いてコンパイルしてみたところ
コンパイラさんは
警告: 代入が読み込み専用領域で行われました
で、実行させたら
セグメンテーション違反です
ですって。
マニヤックな解説 (スコア:2)
を
char *str = "afo";
としても結果は同じでした。
コンパイルで警告が出ないところは違いますが。
# コードとしてタチが悪いものの今回の現象が解りやすいのは後者かも知れない
で、この "afo" っていう文字列は「文字列定数」なのです。"afo"は"afo"として使わねばならず、"xfo"とは出来ません。もしそういう使い方をしたいなら、
static char const str[] = "afo";
char buff[ 4 ];
strncpy( buff, str, sizeof( buff ) );
buff[ 0 ] = 'x';
とします(書き換え可能な領域は別に用意する必要があり
Re:マニヤックな解説 (スコア:1)
s/よそのプロセス/アクセスに特権が要るリソース/てなもんでしょうか。
よそのプロセスはそもそも見えないし。
# マニヤックな記述で文字列定数使うなら*"" = 'x';とかですかね。
Re:マニヤックな解説 (スコア:1)
仰せのとおり、他プロセスのメモリは見えませんね。
メモリディスクリプタテーブルのエントリが異なるので。
# 8086→80286→80386の進化ではこのメモリディスクリプタテーブルの辺りが一番面白いと思います。
見えてない部分を (スコア:1)
買うという意図を達することができそうな気がするんですが
どうなんでしょう?
なんとなーくWebを眺めていたら、VxWorksさんがバージョンアップして
いままで苦手だったメモリプロテクションなどを手がけるようになった
みたいですね。セミナに行くとサンプルコードが貰えそうな勢いですが、
会社に転がっている各種の評価用OSで試すことが出来たら面白いかもねー、
なんて妄想中です。
日記に書いた
見えてない部分を無理矢理書き込む (スコア:1)
それでもって、見えない部分に書くというのが、「他プロセスの持ち物だけど、自分から見えていないと思われる場所にあてずっぽうで書く」 というのであれば、絶対に無理です。
自分のプロセスのメモリ空間(論理アドレス)にマッピングされていない領域なので。
というわけで「メモリディスクリプタテーブル」が避けて通れなくなりました。
# さすがに、コレを直接見たりいじったりする用が無いので、正しく説明できるかどうか怪しいのですが…
# 間違ってたらバシバシ指摘してください>みなさま
大雑把に言って、どの論理アドレス
んと、えと。 (スコア:1)
1.セグメント内空間
2.リニアアドレス
3.物理アドレス
みたいになってます。
# 286ではページングできないので2と3は一緒です。
セグメントは1-2間の変換に使います。なのでセレクタ:オフセットの組で指
定できるのは2のリニアアドレスです。
2-3の変換にはページテーブルを用います。具体的にはCR3でページテーブル
の集合であるページディレクトリの物理アドレスを指定してページテーブル群
を指定します。んで、このページテーブル群が
ありがとうございます (スコア:1)
補足ありがとうございます。
80286と80386でアドレス変換の手順が一つ増えたハズだと思っていたのですが、それがページテーブルだったのですね...思い出してきました。
# 昔本を読んだ時にも、その辺りの関係がちっとも理解できず、苦労した記憶が…
# 「ディスクリプタ」とか「ディレクトリ」とか、ファイルシステ
いやいや大した事は (スコア:1)