KDOC 226: 任意のアドレスに読み書きする
この文書のステータス
- 作成
- 2024-08-24 貴島
- レビュー
- 2024-09-09 貴島
概要
メモリアドレスを直接指定して、値を読み書きしてみるコードを見る。
0x2b67 アドレスに値 111 を書き込み、後からアドレス直接指定で値を読み込むようなアセンブリが生成できている。
無効な範囲を指定すると、Segmentation Faultになり書き込みできない。
int main() {
*((int *) 0x0001) = (int) 111;
}
int main() {
int x = 1;
printf("0x%08X: x -> %i\n", &x, x);
*((int *) &x) = (int) 999999;
printf("0x%08X: x -> %i\n", &x, x);
}
0x4423DD04: x -> 1
0x4423DD04: x -> 999999
セグメント内なら、任意のメモリにアクセスできる。
int main() {
int x = 2;
printf("0x%08X: x -> %i\n", &x, x);
int load1 = *((int *) &x-0x100000);
int load2 = *((int *) &x+0x100);
int load3 = *((int *) &x+0x2);
printf("load1(-0x100000): 0x%08X\n", load1);
printf("load2(+0x100): 0x%08X\n", load2);
printf("load3(+0x2): 0x%08X\n", load3);
}
0x9EBD7178: x -> 2
load1(-0x100000): 0x00000000
load2(+0x100): 0x00001000
load3(+0x2): 0x00001000
int main() {
char base = 0;
char a = 'a';
char b = 'b';
char c = 'c';
printf("0x%08X: base\n", &base);
printf("0x%08X: a\n", &a);
printf("0x%08X: b\n", &b);
printf("0x%08X: c\n", &c);
printf("\n");
printf("a: 0x%08X\n", *((char *) &base+0x1));
printf("b: 0x%08X\n", *((char *) &base+0x2));
printf("c: 0x%08X\n", *((char *) &base+0x3));
}
0x5FD01F44: base
0x5FD01F45: a
0x5FD01F46: b
0x5FD01F47: c
a: 0x00000061
b: 0x00000062
c: 0x00000063
関連
抽象。
- 保護された範囲の外は拒否されるが、範囲内なら意図しない場所にも触れられる
関連。
- 参照: KDOC 202: 『30日でできる! OS自作入門』。出てきたコードを確認した
- 疑問: アクセス可能な範囲がどういうことになっているのか調べる
- 前提: KDOC 162: セグメンテーションとページングの違いを見る。メモリをセグメントに分けて割り当てる方式を扱っている
- 補足: KDOC 141: Cのポインタ操作をアセンブリで見る。ポインタが値の置き場所を指すことを、アセンブリで確かめている