SDD 25 H7: BTF cuesta +14,97% de bzImage — medido construyendo, no estimado
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
This commit is contained in:
+65
-10
@@ -39,7 +39,9 @@ El espejo de este documento para el lado tawasuyu es
|
||||
5. **Cuando `/proc` sí se sondea entero, hay algo cerca de 7× más barato** (§9.5, medido
|
||||
2026-08-31): un iterador BPF `task` saca la misma foto **al precio de listar el directorio**
|
||||
—1,75× el piso de `readdir` contra 12,1× de `/proc`—. Su portón es `DEBUG_INFO_BTF`, que sigue
|
||||
apagado, y H7 ahora dice **cuánto cuesta encenderlo** en vez de sólo que está apagado.
|
||||
apagado, y H7 ya no dice sólo que está apagado: **cuesta +14,97% de bzImage** (+2,42 MiB,
|
||||
medido construyendo el 2026-08-31 — 31 veces lo que costó MEMCG+PSI) más `pahole` y `python3` en
|
||||
el lab. Los dos lados del balance están sobre la mesa; la decisión no.
|
||||
|
||||
## 1. Método y condiciones — leer antes de citar un número
|
||||
|
||||
@@ -478,7 +480,7 @@ Su precio, concreto:
|
||||
listar el directorio**: 1,75× el piso de `readdir`, contra 12,1× de `/proc`. Leer los campos deja de costar; sólo se paga enumerar.
|
||||
|
||||
El precio, en cambio, es más grande de lo que decía esta línea («pahole en el lab y un
|
||||
re-hasheo»). Son **cuatro** cosas, y ninguna es un rediseño:
|
||||
re-hasheo»). Son **cinco** cosas —la quinta salió construyendo, el 2026-08-31— y ninguna es un rediseño:
|
||||
|
||||
1. **Los kernels no compilan con información de depuración**: `CONFIG_DEBUG_INFO_NONE=y` en los
|
||||
`.config` sellados. BTF exige DWARF, así que primero hay que encender `DEBUG_INFO_DWARF5`.
|
||||
@@ -487,24 +489,71 @@ Su precio, concreto:
|
||||
2. **pahole está en el catálogo, pero el kernel no lo declara.** `recipes/dwarves.toml` (1.30)
|
||||
se selló al cerrarse el frente libdw/musl, y su propia cabecera lo dice: «El kernel NO la
|
||||
declara todavía».
|
||||
3. **Ese pahole es DINÁMICO pese a `link = "static"`.** El binario del artefacto vigente
|
||||
(`8057bcd…`) trae `INTERP` y cinco `NEEDED`: `libelf`, `libz`, `liblzma`, `libbz2`, `libc`.
|
||||
Corre **dentro del sandbox del build del kernel**, así que esas librerías tienen que estar
|
||||
ahí o no arranca — y el fallo saldría como «pahole no está» estando.
|
||||
3. **Ese pahole era DINÁMICO pese a `link = "static"` — PAGADO el 2026-08-31.** El artefacto de
|
||||
entonces (`8057bcd…`) traía `INTERP` y cinco `NEEDED` (`libelf`, `libz`, `liblzma`, `libbz2`,
|
||||
`libc`), y corre **dentro del sandbox del build del kernel**: sin esas librerías ahí no
|
||||
arranca, y el fallo habría salido como «pahole no está» estando. Arreglado al reabrirse el
|
||||
frente de `link = static` (ver el `git log` de `recipes/dwarves.toml`); el artefacto vigente
|
||||
es `v1.30` y estáticamente enlazado. **Y quedó probado de la única manera que vale: el build
|
||||
de medición de abajo lo encontró y lo ejecutó dentro del sandbox**, no en el host.
|
||||
4. **BTF mete a pahole en el juego de la bit-repro.** El `.BTF` lo emite pahole ⇒ su versión
|
||||
pasa a ser parte de la identidad del artefacto, y el lab **no está en `hash_inputs`**: dos
|
||||
labs con pahole distinto sellarían bytes distintos en la misma dirección sin que el store lo
|
||||
note. Es el agujero conocido, con una herramienta más adentro.
|
||||
5. **Y una quinta, que no está en ninguna documentación de BTF: hace falta `python3`.**
|
||||
Encender 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 ⇒
|
||||
`env: 'python3': No such file or directory`, `Error 127`. Salió construyendo, no leyendo.
|
||||
|
||||
**Y ya hay dos consumidores nombrados, no cero.** El iterador de §9.5, que H8 aceptaría porque
|
||||
trae ruta y símbolo (`bpf_iter_create`, `attach_btf_id` resuelto contra el BTF del vmlinux); y
|
||||
**sched-ext**, que es por lo que existe la receta de dwarves — `SCHED_CLASS_EXT` depende de
|
||||
`DEBUG_INFO_BTF`. El primero está medido; el segundo todavía no tiene su símbolo.
|
||||
|
||||
Lo que **no** está medido es el precio en bytes del `bzImage`, que es como se pagó H1. No se
|
||||
puede estimar del kernel de Artix: sus 6,4 MB de BTF son de un kernel modular enorme y no dicen
|
||||
nada de uno monolítico y pelado. **Se mide construyendo, y esa medición es el primer paso el día
|
||||
que se decida encenderlo** — no antes, porque enciende el re-hasheo de los cuatro kernels.
|
||||
**El precio en bytes, MEDIDO el 2026-08-31** (`docs/evidencia/tasas-kernel-2026-08-29/btf-precio.txt`).
|
||||
Se construyó una copia derivada de `linux-generic` con una sola diferencia en el `.config`
|
||||
—`DEBUG_INFO_DWARF5` + `DEBUG_INFO_BTF`— y todo lo demás byte a byte igual:
|
||||
|
||||
| | bzImage | delta |
|
||||
|---|---|---|
|
||||
| `linux-generic` sellado (sin BTF) | 16 937 984 B | — |
|
||||
| el mismo con DWARF5 + BTF | 19 473 408 B | **+2 535 424 B = +2,42 MiB = +14,97%** |
|
||||
|
||||
La sección `.BTF` del `vmlinux` son **7,52 MiB** sin comprimir (`.BTF_ids`, 2 344 B más) y entran
|
||||
al `bzImage` comprimidos 3,11×. **Contra la única vara comparable que tenemos: H1 costó +80 KiB
|
||||
(+0,49%) del mismo bzImage ⇒ BTF cuesta 31 veces lo que costó H1.** Eso no lo decide, pero lo
|
||||
saca del terreno de «un re-hasheo y ya»: un +15% de imagen es una discusión de producto, no de
|
||||
toolchain, y hay que tenerla contra los dos consumidores nombrados.
|
||||
|
||||
**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**, así que medir ahí
|
||||
habría obligado a encender las dos cosas a la vez y el delta mezclaría dos precios.
|
||||
|
||||
**El número de Artix no servía — y falla en la dirección contraria a la esperable.** Esta sección
|
||||
decía que sus 6,4 MB «no dicen nada de uno monolítico y pelado». Cierto, pero el nuestro sale
|
||||
**más grande**: 7,5 MiB. Artix es **modular** y el `.BTF` de su `vmlinux` cubre sólo el core
|
||||
built-in; el nuestro es monolítico (i915 + nouveau + radeon + iwlwifi + todo lo demás son `=y`) y
|
||||
los tipos de todos esos drivers entran. **Un kernel con menos drivers cargables tiene MÁS BTF que
|
||||
uno enorme lleno de módulos.**
|
||||
|
||||
**Lo que cuesta construirlo no es lo que se paga al arrancar**: el `vmlinux` con DWARF pesa
|
||||
561 MiB —396 de ellos `.debug_info`— y el árbol de build llegó a 7,9 G; el build tardó 48 min con
|
||||
`-j2`. Nada de eso entra en la imagen: la receta empaqueta `bzImage`, no `vmlinux`. Es precio de
|
||||
build (tiempo, disco y la RAM de pahole), no de arranque.
|
||||
|
||||
**Y una trampa del kconfig que hay que dejar escrita, porque es CLAUDE.md §3 dentro de `make`:**
|
||||
`scripts/pahole-version.sh` imprime **`0`** si pahole no está en el PATH, `depends on
|
||||
PAHOLE_VERSION >= 122` deja de cumplirse, y **`olddefconfig` borra la línea en silencio**. El
|
||||
build sale **OK** y sella un kernel **sin BTF** diciendo que todo fue bien. Por eso la fase
|
||||
`configure` de la receta de medición comprueba el `.config` **producido** y sale 1 si no está —
|
||||
la misma regla de §4.bis, aplicada un escalón antes. Salió `OK: CONFIG_DEBUG_INFO_BTF=y`, que es
|
||||
lo que paga la parte (3): ese pahole estático **se encuentra y se ejecuta dentro del sandbox**.
|
||||
|
||||
El artefacto de medición **se borró a propósito** tras anotar los números: `hammer kernel
|
||||
contract --sealed` lo listaba como SIN COMPROBAR —no declara `[[target]]`, que es justo lo que
|
||||
exige H8— o sea un ⚠ permanente en `docs/state/kernel-contract.txt`, que el cron commitea cada
|
||||
30 min. Un aviso fijo que no corresponde a ningún problema es exactamente cómo se deja de leer un
|
||||
vigía. La receta derivada queda junto a la evidencia, con las instrucciones para reconstruirla.
|
||||
- **H8 · El contrato de capacidades es parte del release del kernel** (§4.ter). Toda receta de
|
||||
kernel nueva declara su `[[target]]` con perfil; un kernel sin perfil sale **SIN COMPROBAR**, no
|
||||
aprobado. Y toda capacidad nueva entra con consumidor —ruta y símbolo— o no entra: «estaría bueno
|
||||
@@ -717,6 +766,12 @@ como root, con el `.bpf.o` al lado. **No usa `vmlinux.h`** —haría falta bpfto
|
||||
máquina ni en el store— sino los tipos mínimos declarados a mano con `preserve_access_index`, que
|
||||
es lo que deja a CO-RE reubicar los offsets contra el BTF del kernel en carga.
|
||||
|
||||
**Cuarta corrida (§7-H7, precio de BTF)**: `btf-precio.txt` —el delta de bzImage, la sección `.BTF`,
|
||||
las condiciones y las dos deps que hubo que añadir— junto con `linux-generic-btf.toml` (la receta
|
||||
derivada, con las instrucciones para reconstruirla) y `config-7.1.2-generic-btf` (el `.config`
|
||||
producido, que es donde se comprueba que BTF sobrevivió al `olddefconfig`). **No es un
|
||||
microbenchmark: es un kernel construido**, así que sus números no se cruzan con los de §2 ni §9.
|
||||
|
||||
**El pago de H1** (2026-08-30): `contrato-h1-pagado.txt` — el barrido entero con los cuatro kernels
|
||||
reconstruidos (5 de 5 vigentes en verde, 10 superados listados) y el `diff-back` del plan de gioser
|
||||
contra su `.config` nuevo. Es la única salida de esta carpeta que sí cambia si se vuelve a correr:
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
SDD 25 §7-H7 — Qué cuesta encender DEBUG_INFO_BTF, medido construyendo
|
||||
Medido 2026-08-31 en 'momento'. NO se cruza con los números de §2, §9 ni §9.5:
|
||||
esto no es un microbenchmark, es un kernel construido.
|
||||
|
||||
== qué se compara ==
|
||||
El MISMO kernel por los dos caminos, con UNA sola diferencia en el .config:
|
||||
A) linux-generic VIGENTE, sellado — DEBUG_INFO_NONE, sin BTF
|
||||
B) linux-generic-btf, receta derivada — DEBUG_INFO_DWARF5 + DEBUG_INFO_BTF
|
||||
Todo lo demás (defconfig 7.1.2, la lista entera de -e/-d, el sledgehammer de amdgpu,
|
||||
CC=gcc, el CMDLINE) es byte a byte el mismo texto.
|
||||
|
||||
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
|
||||
(# CONFIG_BPF_SYSCALL is not set). Medir ahí obligaría a encender BPF_SYSCALL a la
|
||||
vez y el delta mezclaría dos cosas. linux-generic ya lo trae ⇒ el delta es limpio.
|
||||
|
||||
La receta derivada vive en work/medicion-btf/ —FUERA de recipes/— para no entrar al
|
||||
grafo compartido como deuda; el catálogo se le presta por symlinks en su directorio.
|
||||
Nada del corpus se re-hashea por esta medición.
|
||||
|
||||
== condiciones ==
|
||||
máquina : momento, 4 vCPU, 7 GiB RAM
|
||||
load al arrancar : 3.42 2.64 2.38
|
||||
memoria disponible : 4293 MiB
|
||||
disco libre (store) : 78G
|
||||
paralelismo : -j2 (no $(nproc)): con -g cada gcc pesa más y hay ~4 G libres.
|
||||
NO afecta a los bytes del bzImage, que es lo único que se mide.
|
||||
ruido conocido : el mismo 'yes' huérfano (pid 1750, reparentado a arje-zero) sigue
|
||||
quemando un core de los 4. Encarece el TIEMPO, no los BYTES.
|
||||
pahole : v1.30, estático (el arreglo del 2026-08-31)
|
||||
|
||||
== baseline A ==
|
||||
bzImage sellado : 16937984 bytes
|
||||
(es el mismo número que cita §7-H1 tras pagar MEMCG+PSI)
|
||||
|
||||
== B: construido con DWARF5 + BTF ==
|
||||
receta derivada : work/medicion-btf/linux-generic-btf.toml (hash b3:771e4823…)
|
||||
duración del build : 20:02:49 → 20:51:09 UTC = 48 min con -j2
|
||||
deps que hubo que añadir a las del kernel sellado: dwarves, python3
|
||||
|
||||
guarda del .config (CLAUDE.md §3, y por qué hace falta):
|
||||
scripts/pahole-version.sh imprime 0 si pahole no está en el PATH;
|
||||
'depends on PAHOLE_VERSION >= 122' deja de cumplirse y olddefconfig BORRA la
|
||||
línea EN SILENCIO. El build saldría OK sellando un kernel SIN BTF. Por eso la
|
||||
fase configure verifica el .config PRODUCIDO y sale 1 si no está. Salida real:
|
||||
v1.30
|
||||
OK: CONFIG_DEBUG_INFO_BTF=y en el .config producido
|
||||
|
||||
== lo medido ==
|
||||
vmlinux 588319992 bytes
|
||||
bzImage 19473408 bytes
|
||||
[10] .BTF PROGBITS ffffffff830e0000 22e0000 785d26 00 A 0 0 1
|
||||
[11] .BTF_ids PROGBITS ffffffff83866000 2a66000 000928 00 A 0 0 1
|
||||
[39] .debug_info PROGBITS 0000000000000000 330f240 18c33a9d 00 0 0 1
|
||||
.BTF 7888166 bytes
|
||||
|
||||
bzImage sin BTF : 16.937.984 bytes
|
||||
bzImage con BTF : 19.473.408 bytes
|
||||
DELTA : +2.535.424 bytes = +2.42 MiB = +14.97%
|
||||
|
||||
seccion .BTF en vmlinux (sin comprimir): 7.888.166 bytes = 7.52 MiB
|
||||
seccion .BTF_ids : 2.344 bytes
|
||||
⇒ los 7.52 MiB de .BTF se comprimen a 2.42 MiB dentro del bzImage (3.11x)
|
||||
|
||||
== contra el precio de H1, que es la unica vara comparable que tenemos ==
|
||||
MEMCG+PSI : +80 KiB = +0,49% del mismo bzImage
|
||||
BTF : +2,42 MiB = +14,97% del mismo bzImage
|
||||
⇒ BTF cuesta 31x lo que costo H1 en bytes.
|
||||
|
||||
== el numero de Artix NO servia, y en la direccion CONTRARIA a la esperable ==
|
||||
El BTF del kernel de Artix son 6,4 MB y §9.5 dijo que no decia nada de un kernel
|
||||
monolitico y pelado. Correcto — pero el nuestro sale MAS GRANDE: 7,5 MiB. Artix es
|
||||
MODULAR, y su .BTF de vmlinux cubre solo el core built-in; el nuestro es monolitico
|
||||
(i915 + nouveau + radeon + iwlwifi + todo el resto son =y) y sus tipos entran todos.
|
||||
Un kernel mas chico en drivers cargables tiene MAS BTF que uno grande en modulos.
|
||||
|
||||
== lo que costo construirlo, que no es lo que se paga al arrancar ==
|
||||
vmlinux con DWARF : 588.319.992 bytes (561 MiB), de los cuales .debug_info
|
||||
son 415.447.709 bytes (396 MiB).
|
||||
Eso NO entra en la imagen: la receta empaqueta bzImage, no vmlinux. Es coste de
|
||||
build (tiempo, RAM de pahole y disco), no de arranque.
|
||||
|
||||
== como se reproduce ==
|
||||
La receta derivada esta guardada al lado: docs/evidencia/.../linux-generic-btf.toml.
|
||||
'hammer build' no tiene --base-dir (solo el fallback al catalogo PADRE), asi que para
|
||||
construirla fuera de recipes/ hay que prestarle el catalogo por symlinks:
|
||||
M=work/medicion-btf; mkdir -p $M
|
||||
for f in $PWD/recipes/*.toml; do ln -s "$f" "$M/$(basename $f)"; done
|
||||
cp docs/evidencia/tasas-kernel-2026-08-29/linux-generic-btf.toml $M/
|
||||
flock work/.farm-build.lock ./target/release/hammer --store ./store build $M/linux-generic-btf.toml
|
||||
|
||||
EL ARTEFACTO SE BORRO A PROPOSITO tras anotar estos numeros. No es basura olvidada:
|
||||
'hammer kernel contract --sealed' lo encontraba y lo listaba como SIN COMPROBAR
|
||||
(no declara [[target]], que es justo lo que H8 exige), o sea un ⚠ permanente en
|
||||
docs/state/kernel-contract.txt, que el cron commitea cada 30 min. Un aviso fijo que
|
||||
no corresponde a ningun problema es como se deja de leer un vigia.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,101 @@
|
||||
# ── 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
|
||||
"""
|
||||
Reference in New Issue
Block a user