Open4

Rikan

ISATOISATO

day03a

Kernel部分をやるためにはカスタムターゲットが必要そう

こういうふうに全部書くのついらいので、なんか楽したいなぁと思ったら
x86_64-unknown-none をベースにできるのではと仮説

$ rustc +nightly -Z unstable-options --print target-spec-json --target x86_64-unknown-none
{
  "arch": "x86_64",
  "code-model": "kernel",
  "cpu": "x86-64",
  "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128",
  "disable-redzone": true,
  "executables": true,
  "features": "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float",
  "is-builtin": true,
  "linker": "rust-lld",
  "linker-flavor": "ld.lld",
  "llvm-target": "x86_64-unknown-none-elf",
  "max-atomic-width": 64,
  "panic-strategy": "abort",
  "position-independent-executables": true,
  "relro-level": "full",
  "stack-probes": {
    "kind": "call"
  },
  "static-position-independent-executables": true,
  "target-pointer-width": "64"
}

ぽい。

ISATOISATO

env: day03c

QEMUでOVMFを用いてBOOTX64.efiを起動する際に、BOOTZ64.efiのstart addressに示しているアドレスロードされるとは限らない
デバッグの都合上、どこにロードされるかわかるといいのだが、これはログを出力することでできる。

QEMUに以下のようなオプションを渡しながら起動すると、ファイルにいい感じログが吐き出される

QEMU_OPTS="-debugcon file:debug.log -global isa-debugcon.iobase=0x402" make run

0x402の意味はわからない

ちなみにログを見るとこんな感じ

1762   │ FSOpen: Open '\EFI\BOOT\BOOTX64.EFI' Success
1763   │ [Bds] Expand PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0) -> PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/\E
       │ FI\BOOT\BOOTX64.EFI
1764   │ [Security] 3rd party image[0] can be loaded after EndOfDxe: PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/\EFI\BOO
       │ T\BOOTX64.EFI.
1765   │ InstallProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B 3E7A8440
1766   │ ConvertPages: failed to find range 140000000 - 1402A5FFF
1767   │ Loading driver at 0x0003E138000 EntryPoint=0x0003E13BDB0
1768   │ InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 3F2B0318
1769   │ ProtectUefiImageCommon - 0x3E7A8440
1770   │   - 0x000000003E138000 - 0x00000000002A6000
1771   │ FSOpen: Created new directory entry 'memmap'
1772   │ FSOpen: Open '\memmap' Success
1773   │ FSOpen: Open '\kernel' Success
ISATOISATO

env: day03c

linkerでmsvcを指定する場合、そのオプションは https://learn.microsoft.com/en-us/cpp/build/reference/linker-options?view=msvc-170 が参考になる

また、bootloader側で(つまり、uefi-unkownなやつ)でdebug symbolを出すためには、
https://github.com/bean1310/Rikan/pull/7/commits/83e57f1f924d04852c62ff66cd22b6ab9dd12094 のようなものを書く必要がある。
デフォルトだと出ないので、カスタムターゲットを作る感じ