rpi_start.Sを読む (第6回)
2013/11/09(土) 27:46 NetBSD はてブ情報 はてブに登録 はてブ数

第3回で154行目まできていましたが、第4回と第5回のMMU_INITマクロでずいぶんと寄り道してしまいました。

今回は、第3回の154行目から空行をはさんで、156行目から始めましょう。
    156 	/* Now create our entries per the mmu_init_table. */
    157 	l1table	.req r0
    158 	va	.req r1
    159 	pa	.req r2
    160 	n_sec	.req r3
    161 	attr	.req r4
    162 	itable	.req r5
    163 	l1sfrm	.req r6
    164 
    165 	adr	itable, mmu_init_table
    166 	ldr	l1sfrm, Ll1_s_frame
    167 	b	3f
まずは、mmu_init_tableのエントリーを作ります。というコメントからスタートです。
    156 	/* Now create our entries per the mmu_init_table. */
    157 	l1table	.req r0
    158 	va	.req r1
    159 	pa	.req r2
    160 	n_sec	.req r3
    161 	attr	.req r4
    162 	itable	.req r5
    163 	l1sfrm	.req r6
157行目から163行目に.recというのが出てきています。これはGNU ASのディレクティブと呼ばれるものだそうです。

レジスタに名前を付ける、と思っていればよさそうです。r0はl1tableと呼びますよ、ということでしょうね。ここから先が読みやすくなっていいですねぇ。

それでは次です。
    165 	adr	itable, mmu_init_table
adrは先ほども出てきた疑似命令です。mmu_init_tableのアドレスをitableにロードします。mmu_init_tableは、第3回と第4回でさんざんやったMMU_INITマクロですね。

先に進みます。
    166 	ldr	l1sfrm, Ll1_s_frame
ldrはロード命令です。l1sfrmにラベルLl1_s_frameの値をロードします。
Ll1_s_frameは後ろのほうに定義されています。
    255 Ll1_s_frame:
    256 	.word	L1_S_FRAME
つまりL1_S_FRAMEの値をl1sfrmにロードするわけです。L1_S_FRAMEは先のpte.hに書かれています。
  #define    L1_S_SIZE    0x00100000    /* 1M */
  #define    L1_S_OFFSET    (L1_S_SIZE - 1)
  #define    L1_S_FRAME    (~L1_S_OFFSET)
  #define    L1_S_SHIFT    20
つまり、L1_S_FRAME = ~(0x00100000 - 1)=0xFFF00000です。

ということで、l1sfrm = 0xFFF00000;になります。
    167 	b	3f
bだけなので無条件ジャンプ。ラベルは3fなので3、つまり175行目にジャンプします。3fのfはなんでしょうか... forwardのfかな?

ということで、今回は実質3行だけでした。Cっぽく書いてみます。
  itable = &mmu_init_table;
  l1sfrm = 0xFFF00000; /* L1_S_FRAME (12bit) */
  goto 175行目

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0808/tb/