Здесь и далее работаем на 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 байт.
В следующей части будем разбираться, насколько защищённый режим влияет на скорость работы.