Защищённый режим Эльбрус. Введение.

Здесь и далее работаем на E8C-SWTX с 4 восьмиядерными процессорами.

Для понимания того, что такое защищённый режим, нужно обязательно прочитать: http://ftp.altlinux.org/pub/people/mike/elbrus/docs/elbrus_prog/html/chapter11.html

Поэкспериментируем с возможностями защищённого режима.

Сначала - простейший пример.

#include <stdio.h>

void main() {
        int testArray[14];
        testArray[15] = 0;
        printf("We should have crashed before!\n");
}

В обычном режиме:

We should have crashed before!

(То есть, здесь и далее - мы успешно вылезли за законную выделенную память). В защищённом режиме:

Ошибка сегментирования

Разумеется, эту ошибку мог отловить и статический анализатор кода.

Усложним пример, чтобы убедиться, что компилятору ничего не известно о размере массива на этапе сборки.

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

void main() {
        int arraySize;
        printf("Enter array size\n");
        scanf("%d", &arraySize);
        int *testArray = (int*)malloc(arraySize * sizeof(int));
        testArray[arraySize] = 0;
        printf("We should have crashed before!\n");
}

В обычном режиме мы снова попадаем туда, куда не должны:

Enter array size
10
We should have crashed before!

В защищённом режиме:

Enter array size
10
Ошибка сегментирования

Поэкспериментируем с неинициализированными данными.

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

void main() {
        int arraySize;
        printf("Enter array size\n");
        scanf("%d", &arraySize);
        int *testArray = (int*)malloc(arraySize * sizeof(int));
        printf("We shouldn't output this uninitalized data: %d\n", testArray[0]);
}

В обычном режиме мы можем читать неинициализированные данные:

Enter array size
10
We shouldn't output this uninitalized data: 0

В защищённом режиме:

Enter array size
10
Недопустимая инструкция

Функции защищённого режиме поддерживаются как в С, так и в С++.

Проверить выполняемый файл на предмет: обычный он или защищённый, легко командой ldd

Обычное приложение:

libc.so.6 => /lib64/libc.so.6 (0x000046382dade000)
/lib64/ld-linux.so.2 (0x000046382da2b000)

Защищённое приложение:

libc.so.6 => /lib128/libc.so.6 (0x0000000050ea5000)
/lib128/ld-linux.so.2 (0x0000000050180000)

Различие в размере для простейшей программы (пример 3) без оптимизации:

7992/16336 байт (обычный/защищённый режим).

С оптимизацией O3:

7984/16336 байт.

В следующей части будем разбираться, насколько защищённый режим влияет на скорость работы.