今回読むのは次の部分です。
これで終わりです。だと面白くないので、ちょっと振り返ってみましょう。
第6回から第8回までは、第3回でゼロに初期化したL1テーブルを設定する一連の処理でした。
処理は、
mmu_init_tableは、次のようなテーブルでした。
これが、L1テーブルに格納されるころには次のようになり、
L1テーブルは次のように設定されたということになります。
186 .unreq va
187 .unreq pa
188 .unreq n_sec
189 .unreq attr
190 .unreq itable
191 .unreq l1table
192 .unreq l1sfrm
これは、157行目からの
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
に対して、反対のことをしているわけですね。これで終わりです。だと面白くないので、ちょっと振り返ってみましょう。
第6回から第8回までは、第3回でゼロに初期化したL1テーブルを設定する一連の処理でした。
処理は、
- mmu_init_tableに設定された三つのva, pa, n_sec, attrによるループ
- n_secによるループ
mmu_init_tableは、次のようなテーブルでした。
| va | pa | nsec | attr |
|---|---|---|---|
| 0x0 | 0x0 | 0x643033 | 0x412 |
| 0xC0000000 | 0x0 | 0x643033 | 0x041E |
| 0xF2000000 | 0x20000000 | 0x010FFFFF | 0x0412 |
| va | pa | n_sec |
|---|---|---|
| 0x0000 | 0x00000412 | 0x06 |
| 0x2000 | 0x0000041E | 0x06 |
| 0x3C80 | 0x20000412 | 0x10 |
| L1 offset | L1 entry |
|---|---|
| 0000 | 0x00000412 |
| 0004 | 0x00000412 |
| 0008 | 0x00000412 |
| 000C | 0x00000412 |
| 0010 | 0x00000412 |
| 0014 | 0x00000412 |
| 0018 | 0x00000000 |
| 001C | 0x00000000 |
| (中略) | |
| 1FF8 | 0x00000000 |
| 1FFC | 0x00000000 |
| 2000 | 0x0000041E |
| 2004 | 0x0000041E |
| 2008 | 0x0000041E |
| 200C | 0x0000041E |
| 2010 | 0x0000041E |
| 2014 | 0x0000041E |
| 2018 | 0x00000000 |
| 201C | 0x00000000 |
| (中略) | |
| 3C78 | 0x00000000 |
| 3C7C | 0x00000000 |
| 3C80 | 0x20000412 |
| 3C84 | 0x20000412 |
| 3C88 | 0x20000412 |
| 3C8C | 0x20000412 |
| 3C90 | 0x20000412 |
| 3C94 | 0x20000412 |
| 3C98 | 0x20000412 |
| 3C9C | 0x20000412 |
| 3CA0 | 0x20000412 |
| 3CA4 | 0x20000412 |
| 3CA8 | 0x20000412 |
| 3CAC | 0x20000412 |
| 3CB0 | 0x20000412 |
| 3CB4 | 0x20000412 |
| 3CB8 | 0x20000412 |
| 3CBC | 0x20000412 |
| 3CC0 | 0x00000000 |
| 3CC4 | 0x00000000 |
| (以下略) | |