in

ensamblaje en línea en el kernel de linux

Estoy leyendo un código fuente del kernel de Linux, sé poco sobre el ensamblaje en línea y descubrí que algunas partes del ensamblaje en línea son difíciles de entender.

Tome lo siguiente por ejemplo:

// SPDX-License-Identifier: GPL-2.0-only
/*
 * check_initial_reg_state.c - check that execve sets the correct state
 * Copyright (c) 2014-2016 Andrew Lutomirski
 */

#define _GNU_SOURCE

#include <stdio.h>

unsigned long ax, bx, cx, dx, si, di, bp, sp, flags;
unsigned long r8, r9, r10, r11, r12, r13, r14, r15;

asm (
    ".pushsection .text\n\t"
    ".type real_start, @function\n\t"
    ".global real_start\n\t"
    "real_start:\n\t"
#ifdef __x86_64__
    "mov %rax, ax\n\t"
    "mov %rbx, bx\n\t"
    "mov %rcx, cx\n\t"
    "mov %rdx, dx\n\t"
    "mov %rsi, si\n\t"
    "mov %rdi, di\n\t"
    "mov %rbp, bp\n\t"
    "mov %rsp, sp\n\t"
    "mov %r8, r8\n\t"
    "mov %r9, r9\n\t"
    "mov %r10, r10\n\t"
    "mov %r11, r11\n\t"
    "mov %r12, r12\n\t"
    "mov %r13, r13\n\t"
    "mov %r14, r14\n\t"
    "mov %r15, r15\n\t"
    "pushfq\n\t"
    "popq flags\n\t"
#else
    "mov %eax, ax\n\t"
    "mov %ebx, bx\n\t"
    "mov %ecx, cx\n\t"
    "mov %edx, dx\n\t"
    "mov %esi, si\n\t"
    "mov %edi, di\n\t"
    "mov %ebp, bp\n\t"
    "mov %esp, sp\n\t"
    "pushfl\n\t"
    "popl flags\n\t"
#endif
    "jmp _start\n\t"
    ".size real_start, . - real_start\n\t"
    ".popsection");

int main()
{
    int nerrs = 0;

    if (sp == 0) {
        printf("[FAIL]\tTest was built incorrectly\n");
        return 1;
    }

    if (ax || bx || cx || dx || si || di || bp
#ifdef __x86_64__
        || r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15
#endif
        ) {
        printf("[FAIL]\tAll GPRs except SP should be 0\n");
#define SHOW(x) printf("\t" #x " = 0x%lx\n", x);
        SHOW(ax);
        SHOW(bx);
        SHOW(cx);
        SHOW(dx);
        SHOW(si);
        SHOW(di);
        SHOW(bp);
        SHOW(sp);
#ifdef __x86_64__
        SHOW(r8);
        SHOW(r9);
        SHOW(r10);
        SHOW(r11);
        SHOW(r12);
        SHOW(r13);
        SHOW(r14);
        SHOW(r15);
#endif
        nerrs++;
    } else {
        printf("[OK]\tAll GPRs except SP are 0\n");
    }

    if (flags != 0x202) {
        printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags);
        nerrs++;
    } else {
        printf("[OK]\tFLAGS is 0x202\n");
    }

    return nerrs ? 1 : 0;
}

Este código se pega desde lib/tools/testing/selftests/x86/check_initial_reg_state.c . no entiendo la línea 14 asm( que declara directamente una gran cantidad de ensamblaje en línea pero no están contenidos en ninguna función. ¿Cómo funciona esto?

0

¿Te ayudó la respuesta?

Subscribirse
Notificar por
guest
0 Comentarios
Inline Feedbacks
Ver todas las Respuestas

El espectro de puntos del Operador en el espacio de Banach es un espectro de compresión.

Rastrear a la conexión del pin