過程が大事

学んだことを適当にアウトプットします

Mikan OSを自作してみる #5

今回やった内容

  • メモリマップについて学んだ
  • ポインタについて学んだ

メモリマップとは

メモリマップとはメインメモリのどの部分がどの用途で行われているかが載っている地図のこと
(メインメモリは揮発性のRAMであり、作業領域のイメージ )

f:id:recursive1414:20211112141505p:plain
メモリマップの中身

フィールド名 説明
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に書き換わった。 '''