Как я могу скомпилировать программу с расширениями защиты памяти Intel (MPX) на Ma c? - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь протестировать Intel Memory Protection Extensions (MPX) на моем Macbook Pro, копируя этот учебник для Linux. Мой процессор - Intel Core i5-6267U, и он может использовать MPX, что подтверждается запуском sysctl machdep.cpu | grep MPX. Однако, когда я пытаюсь скомпилировать следующую тестовую программу:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define noinline __attribute__((noinline))

char dog[] = "dog";
char password[] = "secr3t";

noinline
char dog_letter(int nr)
{
        return dog[nr];
}

int main(int argc, char **argv)
{
        int max = sizeof(dog);
        int i;

        if (argc >= 2)
                max = atoi(argv[1]);

        for (i = 0; i < max; i++)
                printf("dog[%d]: '%c'\n", i, dog_letter(i));

        return 0;
}

с помощью следующей команды:

/usr/local/bin/gcc-8 -o mpx_test -fcheck-pointer-bounds -mmpx mpx_test.c

, я получаю следующую строку ошибок:

/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:26:10: error: unexpected token in argument list
        bnd jle L2
                ^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:37:11: error: unexpected token in argument list
        bnd call        _atoi
                        ^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:41:10: error: unexpected token in argument list
        bnd jmp L3
                ^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:45:11: error: unexpected token in argument list
        bnd call        _dog_letter
                        ^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:57:9: error: unexpected token in argument list
        bnd jl  L4
                ^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:61:2: error: invalid instruction mnemonic 'bnd'
        bnd ret
        ^~~
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:88:2: error: invalid instruction mnemonic 'bnd'
        bnd ret
        ^~~

Если я скомпилирую с флагом -S, я вижу, что сборка, генерируемая G CC, действительно имеет инструкции MPX-specifici c (bnd...). Что еще мне нужно сделать, чтобы скомпилировать программу с защитой MPX?

1 Ответ

1 голос
/ 25 мая 2020

Я нашел обходной путь, который позволяет мне использовать MPX на моем Ma c - хотя на самом деле он применим только для небольших программ. Шаги, которые я предпринял, чтобы заставить MPX работать для пространства ядра , следующие:

  1. Включить MPX. Обратитесь к руководству Intel, чтобы узнать, как это сделать. Короче говоря, нужно записать некоторые биты в MSR.
  2. Запустить Linux виртуальную машину или перейти на любую другую систему, в которой есть ассемблер, поддерживающий MPX.
  3. В этой второй системе запишите инструкции сборки MPX (которые вы хотите использовать для программы обратно на Ma c) и соберите программу.
  4. Дизассемблируйте программу через objdump -d и скопируйте коды операций для соответствующих инструкций и операндов MPX во встроенную сборку на Ma c.
  5. Скомпилировать и запустить на Ma c:)

Это также должно работать для MPX в пользовательском пространстве с небольшим изменением как включен MPX (XSAVE инструкции для пространства пользователя и MSR для пространства ядра).

В качестве примера того, как может выглядеть встроенная сборка на Ma c после копирования кодов операций, рассмотрим следующие.

__asm__ volatile (
        ".byte 0xf3, 0x0f, 0x1b, 0x40, 0x10     \t\n" // bndmk 16(%rax), %bnd0
        ".byte 0xf2, 0x0f, 0x1a, 0x40, 0x16     \t\n" // bndcu 22(%rax), %bnd0
        :
        : "a" (some_input)
    );
...