πΎ Archived View for any-key.press βΊ squat βΊ reports βΊ 0.0.1.gmi captured on 2024-05-10 at 10:41:54. Gemini links have been rewritten to link to archived content
β¬ οΈ Previous capture (2023-09-28)
-=-=-=-=-=-=-
Π‘++11 ΠΊΠΎΠ΄, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ Π½Π° aarch64 ΠΆΠ΅Π»Π΅Π·Π΅.
ΠΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»Π°Ρ :
ΠΡΠΎΠ΅ΠΊΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ `Makefile`.
MPIDR_EL1, Multiprocessor Affinity Register
PrimeCell UART (PL011) Technical Reference Manual
QEMU: βvirtβ generic virtual platform
UPD(2023-09-12): Π‘Π²ΡΠ·ΠΈ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ARM Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ· Π Π€, Π½ΠΈΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ½Π½ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ.
ΠΠ»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ ΠΈΠ· ΡΠΎΡΡΠ°Π²Π° LLVM. ΠΠ»Ρ ΡΡΠ΅ΡΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π³Π΄Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ±ΠΎΡΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°ΠΉΠ» `config.mk`.
Π‘Π±ΠΎΡΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² Π΄Π²ΡΡ arm64-ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ :
$ cat config.mk OBJCOPY = llvm14-objcopy
$ cat config.mk AS = /usr/local/bin/clang CXX = /usr/local/bin/clang++ LD = /usr/local/bin/ld.lld OBJCOPY = /usr/local/bin/llvm-objcopy
Π‘Π±ΠΎΡΠΊΠ° (ΠΊΠΎΠΌΠ°Π½Π΄Π° `make`) ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ:
The LLVM Compiler Infrastructure
Π£ΡΠΈΠ»ΠΈΡΡ `llvm-objdump` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ `.elf` ΡΠ°ΠΉΠ»Π°:
$ llvm-objdump -d squat.elf squat.elf: file format elf64-littleaarch64 Disassembly of section .text.boot: 0000000000000000 <_start>: 0: a0 00 38 d5 mrs x0, MPIDR_EL1 4: 00 5c 40 92 and x0, x0, #0xffffff 8: 60 00 00 b4 cbz x0, 0x14 <_first_processor> 000000000000000c <_idle>: c: 5f 20 03 d5 wfe 10: ff ff ff 17 b 0xc <_idle> 0000000000000014 <_first_processor>: 14: 60 14 00 10 adr x0, #652 18: 41 14 00 10 adr x1, #648 000000000000001c <_zero_bss>: 1c: 1f 84 00 f8 str xzr, [x0], #8 20: 1f 00 01 eb cmp x0, x1 24: cb ff ff 54 b.lt 0x1c <_zero_bss> 28: c0 fe ff 10 adr x0, #-40 2c: 1f 00 00 91 mov sp, x0 30: 02 00 00 94 bl 0x38 <kernel_entry_point> 34: f6 ff ff 17 b 0xc <_idle> Disassembly of section .text: 0000000000000038 <kernel_entry_point>: 38: fd 7b bf a9 stp x29, x30, [sp, #-16]! 3c: fd 03 00 91 mov x29, sp 40: 25 00 00 94 bl 0xd4 <_ZN5Board4Uart10initializeEv> 44: 1f 20 03 d5 nop 48: a0 10 00 10 adr x0, #532 4c: 04 00 00 94 bl 0x5c <_ZN12_GLOBAL__N_116uart_send_stringEPKc> 50: 18 00 00 94 bl 0xb0 <_ZN12_GLOBAL__N_119uart_echo_test_modeEv> 54: fd 7b c1 a8 ldp x29, x30, [sp], #16 58: c0 03 5f d6 ret
Π’ΡΡ ΡΡΠΎΠΈΡ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ²Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ `mrs x0, MPIDR_EL1` ΠΈΠΌΠ΅Π΅Ρ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ `a0 00 38 d5`.
Π ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ _ΠΏΠ»ΠΎΡΠΊΠΈΠΉ_ `.img` ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ `hexdump`:
$ hexdump -C squat.img 00000000 a0 00 38 d5 00 5c 40 92 60 00 00 b4 5f 20 03 d5 |..8..\@.`..._ ..| 00000010 ff ff ff 17 60 14 00 10 41 14 00 10 1f 84 00 f8 |....`...A.......| 00000020 1f 00 01 eb cb ff ff 54 c0 fe ff 10 1f 00 00 91 |.......T........| 00000030 02 00 00 94 f6 ff ff 17 fd 7b bf a9 fd 03 00 91 |.........{......|
Π’ΡΡ ΡΡΠΎΠΈΡ ΡΠ½ΠΎΠ²Π° Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² Π½Π°ΡΠ°Π»Π΅ Π΄Π°ΠΌΠΏΠ° ΠΌΡ ΡΠ½ΠΎΠ²Π° Π²ΠΈΠ΄ΠΈΠΌ Π·Π°Π²Π΅ΡΠ½ΡΠΉ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ `a0 00 38 d5`, ΡΠΎ Π΅ΡΡΡ Π½Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ `mrs x0, MPIDR_EL1`. ΠΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ.
ΠΠΎΡΡΠΏΠ°ΡΡ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ `make qemu`:
$ make qemu qemu-system-aarch64 -M virt -cpu cortex-a53 -kernel squat.img -nographic -monitor none -serial stdio Squat entry point UART echo test mode >
Π ΡΠ°ΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠ΄ ΠΆΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΡΠ΅ΡΠ΅Π· UART, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΡΡΠ»Π°Π΅Ρ Π΅Π³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ QEMU Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `make gdb-remote`. Π ΠΎΡΠ»ΠΈΡΠΈΠΈ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° (`make qemu`) ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ qemu Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ `-s -S`, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ ΠΈ ΠΆΠ΄ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠΌ Π±ΡΠ΄Π΅ΠΌ Π²ΡΡΡΡΠΏΠ°ΡΡ `lldb`, ΠΊΠΎΡΠΎΡΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡ ΠΊ QEMU ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΡ `1234`:
$ lldb (lldb) gdb-remote 1234