Este tutorial explica, desde los fundamentos, el mecanismo de "jump labels" del kernel de Linux —también conocidos como "static keys"— y cómo el núcleo reescribe su propio código en caliente para habilitar o deshabilitar rutas de ejecución sin penalizar el rendimiento. Está basado en el árbol del kernel 7.2 y se centra en la arquitectura x86_64.
El texto arranca con el hardware: describe cómo una CPU moderna x86_64 captura bytes en la caché de instrucciones, los decodifica en microoperaciones y los ejecuta fuera de orden, con predicción de saltos. Esa pipeline explica por qué una comprobación if (feature_enabled) no es tan barata como parece: aunque la predicción de bifurcación oculta el coste del salto, la carga del flag sigue ocurriendo en cada iteración y puede afectar a la caché de datos. En cambio, un NOP o un JMP incondicional elimina la carga y la condición, dejando el camino "desactivado" como trabajo literal nulo para el front-end.
A continuación, el tutorial desgrana las codificaciones x86 implicadas —INT3 (1 byte), JMP rel8 (2 bytes), JMP rel32 (5 bytes), NOP de 2 y 5 bytes— y por qué es imprescindible que los tamaños coincidan: cualquier parche debe ser un intercambio de bytes in situ para no invalidar direcciones de retorno, tablas de excepciones ni información de unwind ORC. También señala las constantes en text-patching.h y nops.h y la fórmula del desplazamiento relativo.
Por último, aborda las tres restricciones que hacen del patching de código vivo un problema SMP: el texto del kernel está mapeado como solo lectura tras el arranque (CONFIG_STRICT_KERNEL_RWX), otras CPUs lo están ejecutando al mismo tiempo y la instrucción a parchear puede estar ya parcialmente decodificada en la pipeline de otro núcleo. El artículo deja para entregas siguientes cómo se resuelve esa consistencia sin detener la máquina.
