iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

今日的行程:
辦公室:9:30 - 19:30
讀書室:19:30 - 21:00

正片開始

Unaligned Access

  • Memory 分為 device memory 和 normal memory
    • 如果沒有 enable MMU,那麼對 RAM 的存取會是對 device memory 的存取,此時的 unalign access 會觸發一個 alignment 異常
    • 如果 enable MMU,那麼對 RAM 的存取會是對 normal memory 的存取
      • 如果 SCTLR_ELx 的 A bitfield 是 1: 觸發 alignment 異常
      • 如果 SCTLR_ELx 的 A bitfield 是 0: 系統處理 unalign access
ldr x6, <label>    // x6 為 64 bit register
                   // 所以如果 label 沒有 align 8 byte,就會是 unalign access
ldr w6, <label>    // 同理,4 byte align

Register size matters

  • Register 的大小是重要的,如果儲存 64 bit 資訊到 32 bit register,也會觸發 exception

觀察 Linux head.S

b       primary_entry
--> primart_entry
        bl record_mmu_state    // 設定 Endian,
                               // kernel 有個 CONFIG_CPU_BIG_ENDIAN config,
                               // 並且清掉 SCTLR_ELx_M
        bl preserve_boot_args  // 非常字面上意思 XD
        ...
        adrp    x0, init_idmap_pg_dir // idmap 應該是 identity mapping 
                                      // (VA == PA)
        ...
        bl      __pi_create_init_idmap  // 不太確定 __pi_ 這個 prefix 
                                        // 怎麼安上去的,實作應該是在 
                                        // arch/arm64/kernel/pi/map_range.c 的
                                        // create_init_idmap
        ...
        bl init_kernel_el                // 設定 EL 的樣子XD
        bl __cpu_setup                   // arch/arm64/mm/proc.S
        b __primary_switch
        
        --> primary_switch
                ...
                bl __enable_mmu             // enable mmu
                ...
                ldr     x8, =__primary_switched
                adrp    x0, KERNEL_START    // __pa(KERNEL_START)
                br      x8
                
                --> __primary_switched
                        ...
                        bl start_kernel     // 接下來都是 C code 了        

上述都是 boot hart 的流程,other hart 會在前一級的 boot loader 裡面 parking (透過 spin table 機制或是 PCSI 機制),直到 boot hart 執行到 smp_init (boot_secondary) function,才會透過 interrupt 機制讓 other hart 跳到 kernel head.S 含有 secondary 字眼的 function 執行。

總結


上一篇
[鐵人賽] Day 18 ARM 第 6 章節 A64指令集(4) -- Other Important Instructions
下一篇
[鐵人賽] Day 20 RISC-V Kernel Page Table
系列文
上班辦公室,下班讀書室:RISC-V / ARM64 體系結構編程與實踐26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言