Era el ultimo hueco medible de SDD 25 en esta maquina: H7 tenia el precio en cuatro partes pero no el numero en bytes, que es como se pago H1. Se construyo una copia derivada de linux-generic con UNA sola diferencia en el .config (DEBUG_INFO_DWARF5 + DEBUG_INFO_BTF) y todo lo demas byte a byte igual: bzImage sin BTF : 16 937 984 B bzImage con BTF : 19 473 408 B (+2 535 424 B = +2,42 MiB = +14,97%) seccion .BTF : 7 888 166 B sin comprimir, entran comprimidos 3,11x Contra la unica vara comparable: H1 (MEMCG+PSI) costo +80 KiB / +0,49% del mismo bzImage => BTF cuesta 31 veces eso. No lo decide, pero lo saca de "un re-hasheo y ya". Sobre linux-generic y no sobre linux, que es mas barato: BTF tiene depends on BPF_SYSCALL y el .config sellado de linux lo trae APAGADO, asi que medir ahi habria mezclado dos precios. TRES cosas que salieron construyendo y no leyendo: 1. Una QUINTA parte del precio que nadie habia nombrado: hace falta python3. BTF hace que kbuild descienda a tools/bpf/resolve_btfids, que compila un libbpf vendorizado cuyo Makefile genera bpf_helper_defs.h con un script de Python (Error 127). 2. El numero de Artix fallaba en la direccion CONTRARIA a la esperable. El doc decia que sus 6,4 MB "no dicen nada de uno monolitico y pelado"; el nuestro sale MAS GRANDE, 7,5 MiB. Artix es modular y su .BTF cubre solo el core built-in; el nuestro es monolitico y los tipos de i915+nouveau+radeon+iwlwifi entran todos. 3. Una trampa de kconfig que es CLAUDE.md §3 dentro de make: scripts/pahole-version.sh imprime 0 si pahole no esta en el PATH, el depends on PAHOLE_VERSION >= 122 deja de cumplirse, y olddefconfig BORRA la linea en silencio. El build sale OK y sella un kernel SIN BTF diciendo que todo fue bien. Por eso la receta comprueba el .config PRODUCIDO y sale 1 si no esta. Salio OK, lo que ademas paga la parte (3) del precio: el pahole estatico de ayer se encuentra y se ejecuta DENTRO del sandbox. El artefacto de medicion se borro a proposito: `hammer kernel contract --sealed` lo listaba como SIN COMPROBAR (no declara [[target]], que es lo que exige H8), o sea un aviso permanente en un fichero que el cron commitea cada 30 min. Un aviso fijo que no corresponde a ningun problema es como se deja de leer un vigia. La receta derivada queda en la evidencia. Nada del corpus se re-hasheo: la derivada vive fuera de recipes/ y el catalogo se le presta por symlinks. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
102 lines
6.6 KiB
TOML
102 lines
6.6 KiB
TOML
# ── RECETA DE MEDICIÓN, NO DE CATÁLOGO ────────────────────────────────────────────────────────
|
|
# Copia de `recipes/linux-generic.toml` cuyo ÚNICO propósito es ponerle número a SDD 25 §7-H7: qué
|
|
# cuesta en bytes de bzImage encender `DEBUG_INFO_BTF`. Vive en `work/` —fuera de `recipes/`— para
|
|
# no entrar al grafo compartido como deuda, y el catálogo se le presta por symlinks en el mismo
|
|
# directorio (`hammer build` no tiene `--base-dir`; sólo el fallback al catálogo padre).
|
|
#
|
|
# POR QUÉ SOBRE linux-generic Y NO SOBRE linux (que es más barato de construir): BTF tiene
|
|
# `depends on BPF_SYSCALL`, y el `.config` sellado de `linux` lo trae APAGADO. Medir ahí obligaría a
|
|
# encender BPF_SYSCALL a la vez, y el delta mezclaría dos cosas. `linux-generic` ya lo trae ⇒ la
|
|
# única diferencia con el artefacto sellado son las líneas de DWARF/BTF, y el delta es limpio.
|
|
#
|
|
# BASELINE contra el que se compara: el bzImage del `linux-generic` VIGENTE, 16 937 984 bytes
|
|
# (store/23f1cc43…-linux-generic/boot/bzImage), que es el mismo número que cita §7-H1.
|
|
#
|
|
# `-j2` en vez de `$(nproc)`: con `-g` cada gcc pesa más y momento tiene ~4 G disponibles. El
|
|
# paralelismo NO cambia los bytes del bzImage, que es lo único que se mide acá; capar `-j` en una
|
|
# receta de catálogo sería otra cosa (re-hashea), pero esta receta no es de catálogo.
|
|
|
|
name = "linux-generic-btf"
|
|
version = "7.1.2"
|
|
license = "GPL-2.0-only WITH Linux-syscall-note"
|
|
|
|
[source]
|
|
tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v7.x/linux-7.1.2.tar.gz"
|
|
sha256 = "b43e0a2db2a89fc5a88f54417ea13a3f05fbb17fdaf53015ce16525750a2db83"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
|
|
[deps]
|
|
# `python3`: DESCUBIERTO construyendo (2026-08-31). Encender BTF hace que kbuild descienda a
|
|
# `tools/bpf/resolve_btfids`, que compila un libbpf VENDORIZADO, y su Makefile genera
|
|
# `bpf_helper_defs.h` con un script de Python ⇒ `env: 'python3': No such file or directory`,
|
|
# Error 127. No sale en ninguna documentación de BTF: sale construyendo.
|
|
build = ["flex", "bison", "m4", "openssl", "elfutils", "make", "dwarves", "python3"]
|
|
|
|
# SDD 25 §7-H1: `-e MEMCG -e PSI`. Sin MEMCG el fichero `memory.max` NO EXISTE y
|
|
# `arje-incarnate::cgroup` sólo emite un `warn!` ⇒ la Card corre SIN tope de memoria. Va en la
|
|
# fase configure porque el .config ES la identidad del artefacto (SDD 22 §1): esto re-hashea el
|
|
# kernel a propósito. Comprobable con `hammer kernel contract` sobre el config YA PRODUCIDO.
|
|
[build.phases]
|
|
configure = """
|
|
make ARCH=x86_64 defconfig && \
|
|
scripts/config -d MODULE_SIG -d MODULE_SIG_ALL -d MODULES \
|
|
-e DEBUG_KERNEL -e DEBUG_INFO_DWARF5 -d DEBUG_INFO_REDUCED -d DEBUG_INFO_SPLIT \
|
|
-e DEBUG_INFO_BTF \
|
|
-d UNWINDER_ORC -e UNWINDER_FRAME_POINTER \
|
|
-e BLK_DEV_INITRD -e DEVTMPFS -e DEVTMPFS_MOUNT -e TMPFS \
|
|
-e OVERLAY_FS -e USER_NS -e NAMESPACES \
|
|
-e FANOTIFY -e FANOTIFY_ACCESS_PERMISSIONS \
|
|
-e OVERLAY_FS_REDIRECT_DIR -e OVERLAY_FS_INDEX -e OVERLAY_FS_XINO_AUTO -e OVERLAY_FS_METACOPY \
|
|
-e SECURITY -e SECURITY_LANDLOCK -e AUDIT -e IO_URING -e BPF_SYSCALL \
|
|
-e MEMCG -e PSI -d PSI_DEFAULT_DISABLED \
|
|
-e VIRTIO -e VIRTIO_PCI -e VIRTIO_BLK -e VIRTIO_NET -e DRM_VIRTIO_GPU \
|
|
-e PCI -e PCIEPORTBUS -e ACPI -e FW_LOADER \
|
|
-e EXT4_FS -e SQUASHFS -e SQUASHFS_XZ -e SQUASHFS_ZSTD -e SQUASHFS_LZ4 \
|
|
-e SATA_AHCI -e ATA -e ATA_PIIX -e SCSI -e BLK_DEV_SD -e BLK_DEV_SR -e BLK_DEV_LOOP \
|
|
-e NVME_CORE -e BLK_DEV_NVME \
|
|
-e MMC -e MMC_BLOCK -e MMC_SDHCI -e MMC_SDHCI_PCI -e MMC_SDHCI_ACPI \
|
|
-e USB_SUPPORT -e USB -e USB_PCI -e USB_XHCI_HCD -e USB_XHCI_PCI \
|
|
-e USB_EHCI_HCD -e USB_EHCI_PCI -e USB_OHCI_HCD -e USB_UHCI_HCD -e USB_STORAGE \
|
|
-e HID -e HID_GENERIC -e USB_HID -e HID_MULTITOUCH -e INPUT_EVDEV \
|
|
-e INPUT_KEYBOARD -e KEYBOARD_ATKBD -e INPUT_MOUSE -e MOUSE_PS2 -e INPUT_TOUCHPAD \
|
|
-e SERIO -e SERIO_I8042 -e VT -e VT_CONSOLE \
|
|
-e DRM -e DRM_SIMPLEDRM -e SYSFB_SIMPLEFB -e FB -e FB_EFI -e FB_VESA \
|
|
-e DRM_I915 -e DRM_RADEON -e DRM_NOUVEAU -d DRM_AMDGPU -d DRM_AMD_DC -d HSA_AMD \
|
|
-e DRM_FBDEV_EMULATION -e FRAMEBUFFER_CONSOLE -e FRAMEBUFFER_CONSOLE_DETECT_PRIMARY \
|
|
-e EFI -e EFI_STUB -e EFI_PARTITION -e EFIVAR_FS -e CMDLINE_BOOL \
|
|
-e VFAT_FS -e FAT_FS -e MSDOS_FS -e NLS_CODEPAGE_437 -e NLS_ISO8859_1 -e NLS_UTF8 \
|
|
-e ISO9660_FS -e JOLIET -e DEVTMPFS \
|
|
-e WLAN -e WIRELESS -e CFG80211 -e MAC80211 -e RFKILL \
|
|
-e WLAN_VENDOR_INTEL -e IWLWIFI -e IWLMVM -e IWLDVM \
|
|
-e ETHERNET -e NET_VENDOR_INTEL -e E1000 -e E1000E -e IGB -e IGC \
|
|
-e NET_VENDOR_REALTEK -e R8169 -e NET_VENDOR_BROADCOM -e TG3 \
|
|
-e USB_NET_DRIVERS -e USB_USBNET -e USB_NET_CDCETHER -e USB_NET_CDC_NCM -e USB_NET_RNDIS_HOST \
|
|
-d SOUND -d SND -d MEDIA_SUPPORT -d INFINIBAND -d BT -d NFC -d CAN \
|
|
-d WATCHDOG -d USB4 -d FIREWIRE -d DEBUG_WX \
|
|
-d XFS_FS -d BTRFS_FS -d F2FS_FS -d JFS_FS -d GFS2_FS -d NTFS3_FS && \
|
|
scripts/config --set-str CMDLINE "console=tty0 console=ttyS0,115200 ignore_loglevel" && \
|
|
make ARCH=x86_64 olddefconfig && \
|
|
pahole --version && \
|
|
{ grep -q '^CONFIG_DEBUG_INFO_BTF=y' .config || { echo "FATAL: DEBUG_INFO_BTF no quedo en el .config PRODUCIDO — pahole ausente durante configure?"; grep -E 'BTF|PAHOLE|DEBUG_INFO' .config; exit 1; }; } && \
|
|
echo "OK: CONFIG_DEBUG_INFO_BTF=y en el .config producido"
|
|
"""
|
|
# amdgpu (AMD moderno) NO compila en 7.1 con el gcc del gueto (ICE sin mensaje en amdgpu_userq_fence.c)
|
|
# y syncconfig lo re-activaba pese a -d en kconfig (default-y de DRM_AMD_DC + un select que no aparece).
|
|
# SLEDGEHAMMER GARANTIZADO: borro las líneas `obj-$(CONFIG_DRM_AMDGPU)+= amd/...` del Makefile del drm
|
|
# ⇒ amd/{amdgpu,amdxcp,display} nunca se descienden, sin importar kconfig. amdgpu es self-contained
|
|
# (nada del core lo referencia) ⇒ excluirlo es seguro. radeon (AMD viejo) + i915 + nouveau quedan.
|
|
compile = "sed -i '/CONFIG_DRM_AMDGPU)+= amd/d' drivers/gpu/drm/Makefile && make ARCH=x86_64 CC=gcc HOSTCC=gcc -j2 bzImage"
|
|
install = """
|
|
mkdir -p /out/boot /out/medicion && \
|
|
cp arch/x86/boot/bzImage /out/boot/bzImage && \
|
|
cp .config /out/boot/config-7.1.2-generic-btf && \
|
|
stat -c 'vmlinux %s bytes' vmlinux > /out/medicion/tamanos.txt && \
|
|
stat -c 'bzImage %s bytes' arch/x86/boot/bzImage >> /out/medicion/tamanos.txt && \
|
|
{ readelf -SW vmlinux | grep -E 'BTF|debug_info' >> /out/medicion/tamanos.txt || echo '(readelf no disponible)' >> /out/medicion/tamanos.txt; } && \
|
|
{ objcopy --dump-section .BTF=/out/medicion/vmlinux.BTF vmlinux && stat -c '.BTF %s bytes' /out/medicion/vmlinux.BTF >> /out/medicion/tamanos.txt; } || echo '(objcopy fallo)' >> /out/medicion/tamanos.txt
|
|
"""
|