Что я получил бы когда sudo разрушительная ядром программа?

Это (несколько) не определено.

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

5
18.12.2013, 15:08
2 ответа

Конечно, это не разрушит ядро, Вы пишете в пространство виртуальной памяти своей собственной программы, не real пространство памяти ядра.

Узнайте больше о виртуальной памяти здесь

P.S.:

Почему printf ничего не печатает? Стандартным выводом по умолчанию с буфером строки, и Ваш hello world не содержит разделитель строки.

Таким образом, если разрушенная программа, Вы не заметите, что производит (Попробуйте использование puts или добавление a \n в Вашем сообщении)

12
27.01.2020, 20:32
  • 1
    "Вы пишете в пространство виртуальной памяти своей собственной программы" Неправильно. Это - неверное истолкование виртуального обращения. Запись включает реальную RAM. Если бы запись была успешна, то это могло бы быть к местоположению, где ядро хранится, так как это за пределы адрес. Однако система не позволяет такие записи - она отправляет SIGFAULT вместо этого; на самом деле это делает это пытающийся читать из или иначе получить доступ к такому адресу, например, в объявлении указателя, когда память была бы все еще виртуальной. Действие записи карт виртуального адреса к реальному. –  goldilocks 18.12.2013, 14:28
  • 2
    Извините, это назвало SIGSEGV, не SIGFAULT. –  goldilocks 18.12.2013, 14:34
  • 3
    @goldilocks “Вы пишете в пространство виртуальной памяти своей собственной программы”, корректный способ поместить его. Задача всегда пишет в свое собственное пространство памяти (кроме рано во время начальной загрузки перед включением MMU), даже ядро. Что делает ядро особенным (среди прочего) то, что это - единственная задача, этому позволяют изменить ее собственные размещения в ОЗУ, таким образом, ядро может принять решение отобразить любую страницу, соответствующую RAM или другим устройствам, но приложения должны использовать то, что ядро дает им, который является главным образом страницами, которые ядро зарезервировало для их эксклюзивного использования. –  Gilles 'SO- stop being evil' 19.12.2013, 01:16
  • 4
    @Gilles: это не корректный способ поместить его при усилении его против "не реальное пространство ядра" в этом контексте. Частью пространства ядра которого виртуальное пространство является реальным пространством ядра, просто Нельзя записать в него. Те адреса действительно отображаются туда, где ядро; то первое предложение подразумевает мне смысл, "даже если бы Вы действительно писали в тот адрес, то это действительно не было бы ядро", которое является ложью; специфические особенности адреса в стороне, это действительно быть там. –  goldilocks 19.12.2013, 10:12
  • 5
    @goldilocks, Если приложение пытается получить доступ к диапазону ядра адресного пространства, это выходит, как не отображено. С точки зрения приложения там нет ничего. В зависимости от архитектуры, переключая ЦП на привилегированный режим мог бы автоматически ввести RAM и устройства в этом диапазоне адресов без дополнительной операции MMU, но это - деталь реализации, которую не может наблюдать MMU. –  Gilles 'SO- stop being evil' 19.12.2013, 12:06

Понятно, без sudo, запуская программу оказывается отказом сегментов. Я НИЧЕГО не получил, когда выполняют его через sudo./a.out!

Вы уверены, что это работало вообще?

#include <stdio.h>

int main (void) {
    fprintf(stderr,"Attempting out-of-bounds access.\n");
    int *p = (int*)0xffff000000000000;
    fprintf(stderr,"%d\n", *p);
    *p = 666;
    fprintf(stderr,"%d\n", *p);
    return 0;
}        

Это использование stderr, так как это не буферизуется, для предотвращения проблем, описанных warl0ck.

me@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault
me@home> su root
Password:
root@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault  

Точно, что должно произойти. Система никогда не будет позволять никому сделать это. Эта строка:

int *p = (int*)0xffff000000000000;

При компиляции и выполнении получает SIGSEGV, иначе. "отказ сегментации".

3
27.01.2020, 20:32

Теги

Похожие вопросы