Mikan OSを自作してみる #6
今回やった内容
- メモリマップについて学んだ
- ポインタについて学んだ
メモリマップとは
メモリマップとはメインメモリのどの部分がどの用途で行われているかが載っている地図のこと
(メインメモリは揮発性のRAMであり、作業領域のイメージ )
フィールド名 | 型 | 説明 |
---|---|---|
Type | UNIT32 | メモリ領域の種別 |
PhisicalStart | EFI_PHYSICAL_ADDRESS | メモリ領域先頭の物理メモリアドレス |
VisualStart | EFI_VIRTUAL_ADDRESS | メモリ領域先頭の仮想メモリアドレス |
NumberOfPages | UNIT64 | メモリ領域の大きさ(4KB ページ単位) |
Attribute | UNIT64 | メモリ領域が使える用途を示すビット集合 |
アドレスとポインタ
ポインタは、指すという意味があり、C言語では変数のアドレスという整数値を格納する変数である。(ポインタ変数)
int x; /* xはint型の変数 */ x = 5; /* 変数xに5を代入 */ printf(" x:%d\n", x); /* xの値を表示 */ printf(" &x:%p\n", &x); /* xのアドレスを表示 */ int *p_x; /* p_xはポインタ変数 */ p_x = &x; /* ポインタ変数p_xにxのアドレスを代入 */ printf(" p_x:%p\n", p_x); /* p_xの値を表示 */ printf("*p_x:%d\n", *p_x); /* *p_xの値を表示 */ 結果 x:5 &x:0x7ffeed0dca38 (ランダム) p_x:0x7ffeed0dca38 *p_x:5
演算子 | 名前 | 説明 |
---|---|---|
& | アドレス演算子 | オブジェクトのアドレスを取り出す |
* | 関接演算子 | それが指し示すものの中身(オブジェクト(アドレス)に格納されている値) |
ポインタのポインタ
ポインタ変数にアドレス演算子&を適用すること 、UEFIプログラミングでは頻繁に使うらしい。
void f(int* p){ *p = 42; } int g() { int x = 1; int* p = &x; f(p); return x; } g()を実行すると戻り値は42になる int xの初期値は1だが、f(p)の中で42に書き換わった。