πŸ’Ύ 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

View Raw

More Information

⬅️ Previous capture (2023-09-28)

🚧 View Differences

-=-=-=-=-=-=-

squβ±―t v0.0.1

Π‘++11 ΠΊΠΎΠ΄, запускаСмый Π½Π° aarch64 ΠΆΠ΅Π»Π΅Π·Π΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° располоТСн Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… исходных Ρ„Π°ΠΉΠ»Π°Ρ…:

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ собираСтся ΠΈ запускаСтся с использованиСм простого `Makefile`.

MPIDR_EL1, Multiprocessor Affinity Register

PrimeCell UART (PL011) Technical Reference Manual

QEMU: β€˜virt’ generic virtual platform

UPD(2023-09-12): Бвязи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ARM Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ запросы ΠΊ своСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ· Π Π€, Π½ΠΈΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ссылки Π½Π° локально сохранённыС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Arm Architecture Registers

PrimeCell UART (PL011)

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сборки

Для сборки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈΠ· состава 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