rpi_start.Sを読む (第6回)
第3回で154行目まできていましたが、第4回と第5回のMMU_INITマクロでずいぶんと寄り道してしまいました。
今回は、第3回の154行目から空行をはさんで、156行目から始めましょう。
レジスタに名前を付ける、と思っていればよさそうです。r0はl1tableと呼びますよ、ということでしょうね。ここから先が読みやすくなっていいですねぇ。
それでは次です。
先に進みます。
Ll1_s_frameは後ろのほうに定義されています。
ということで、l1sfrm = 0xFFF00000;になります。
ということで、今回は実質3行だけでした。Cっぽく書いてみます。
今回は、第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行目
コメント(0件)
- TB-URL http://www.tokuda.net/diary/0808/tb/