OSDev
http://osdev.su/

Обработка исключений
http://osdev.su/viewtopic.php?f=5&t=497
Страница 1 из 3

Автор:  418ImATeapot [ 22 фев 2012, 12:22 ]
Заголовок сообщения:  Обработка исключений

Как правилнее обрабатывать ошибки в системных вызовах - прервать выполнение (СОИ или сигналы) или вернуть заведомо неверный результат?
Первый способ мне кажется неудобным для программиста. А второй чреват повреждением данных, если программу писал хелловордщик.

Автор:  SII [ 22 фев 2012, 12:25 ]
Заголовок сообщения:  Re: Обработка исключений

У меня все параметры, передаваемые системному вызову из задачи, подвергаются полному контролю. Если что-то не так, что:

1) если задача указала адрес своей подпрограммы обработки ошибок (он всегда является одним из параметров), происходит возврат в задачу на этот адрес, причём передаётся код ошибки, по которому задача может определить, что системе не понравилось;
2) если этот адрес равен нулю, производится аварийное завершение задачи (точней, того её потока, который вызвал систему, однако, если у задачи нет обработчика аварийного завершения потока, то будет завершена вся задача).

Вообще, надёжность должна стоять на первом месте. Производительность, удобство и т.д. -- это всё менее важно.

Автор:  phantom-84 [ 22 фев 2012, 15:19 ]
Заголовок сообщения:  Re: Обработка исключений

Естественно, все параметры нужно тщательно проверять. Для одних неверных параметров достаточно вернуть ошибку "Неверный параметр", для других передать управление пользовательскому/ядерному обработчику исключений. Причем проверку нужно выполнять не только для явно передаваемых параметров, но и для всех буферов, структур, строк. Некоторые ошибки можно выявлять не только в начале обработки системного вызова, но и на протяжении всей обработки. Выполнение некоторых проверок зависит от уровня выполнения caller'а. Например, у меня есть user space service и kernel space service - для последнего не выполняются блокировки буферов, урезание области обработки нольтерминальных строк и т.п.

Автор:  418ImATeapot [ 22 фев 2012, 21:11 ]
Заголовок сообщения:  Re: Обработка исключений

phantom-84 писал(а):
Естественно, все параметры нужно тщательно проверять.

Это и ежу понятно.

phantom-84 писал(а):
Для одних неверных параметров достаточно вернуть ошибку "Неверный параметр"


Вопрос в том - для каких. Собственно говоря вопрос: насколько может оказаться критичной не обрабатываемый в приложении код ошибки? Повреждение данных - насколько это возможно (в случае мю-ядра, при условии что серверы не совсем кривые)?

Автор:  phantom-84 [ 22 фев 2012, 22:25 ]
Заголовок сообщения:  Re: Обработка исключений

Насчет "мю-ядра" не знаю, у меня монолит. Обработчик исключений вызывается, когда параметр некорректен косвенно - это всевозможные ошибки, связанные с буферами. Есть параметры, реакция на некорректность которых может отличаться в разных версиях ядра. Что касается обработки ошибок в приложении, то формально любой системный вызов, в который можно передать ошибочный параметр, должен выполнять проверку параметров, а приложение соответственно должно быть в состоянии эти ошибки обрабатывать. Однако по факту, если ты уверен во всех передаваемых приложением параметрах, то обработку ошибок можно и не делать. Хотя "это и ежу понятно".

Интерес представляет ошибка "Некорректный номер сервисной функции" и то, как ее обрабатывать.

Автор:  418ImATeapot [ 28 фев 2012, 14:00 ]
Заголовок сообщения:  Re: Обработка исключений

Кажется я не умею объяснять. Что я имел ввиду:
Пусть есть два брата-погромиста: Петя и Вася. Пете надоели Линух и Винда и он решил поставить что-то новое.

Вариант первый: "высоконадёжная" ОСь "should die" с кошерной структурной обработкой исключений.
Установил, все работает. Пока Петя не начинает под нее программировать. Провозившись полдня с обработчиками исключений (вроде все логично продуманно, но для конкретной задачи не подходит) он решает сменить ОСь (а заодно и профессию). Петя уходит в магазин, а на компьютер садится Вася. Пишет свой хелловорд. Забывает поставить нолик. Видит окошко "программа совершила ошибку...". Проверяет программу, находит нолик, исправляет. Все работает!

Вариант второй: ненадёжная ось с кодами возврата.
Все поставил, все работает. Все! За две секунды все готово. Уходит в магазин, на компьютер садится Вася. Пишет свой хелловорд. Забывает поставить нолик. Ой, а он работал под рутом :-). БАХ и винта - как не бывало.

Кто виноват, кто прав?

Автор:  SII [ 28 фев 2012, 14:25 ]
Заголовок сообщения:  Re: Обработка исключений

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

Что же касается работы с правами администратора, то против лома нет приёма. Администратор по определению должен иметь возможность обходить стандартные средства защиты и т.п. Другое дело, что это должно выполняться явным образом. Например, система не даст открыть программе некий файл (весь диск, в частности), если эта программа не имеет соответствующих прав. Обычный пользователь не сможет запустить её с правами администратора, администратор -- сможет, но должен будет указать это явным образом. Ну а за это он уже будет отвечать сам :)

В общем, не надо пытаться сделать систему, надёжную на все 100% во всех ситуациях: такое попросту невозможно. Надо лишь точно и чётко обозначить границы, за которые обычная программа не сможет выйти ни при каких обстоятельствах, и проектировать/кодировать ОС, тщательно соблюдая эти самые границы (выполняя необходимые проверки и т.д.).

Кстати говоря, Вы зря противопоставляете обработку исключений и коды возврата. Эти механизмы отнюдь не противоречат друг другу и могут успешно совмещаться. Чтобы обеспечить обработку исключений на языке высокого уровня, требуется соответствующая поддержка со стороны компилятора и его библиотеки времени выполнения, однако от ОС тут требуется самый минимум: дать возможность задаче указать обработчики всяких нехороших событий вроде деления на 0. Никакой специальной поддержки SEH от собственно ОС не требуется, всё это реализуется исключительно кодом пользовательского режима.

Автор:  Yoda [ 28 фев 2012, 15:52 ]
Заголовок сообщения:  Re: Обработка исключений

SII писал(а):
Что же касается работы с правами администратора, то против лома нет приёма. Администратор по определению должен иметь возможность обходить стандартные средства защиты и т.п...
В общем, не надо пытаться сделать систему, надёжную на все 100% во всех ситуациях: такое попросту невозможно.

А вот мой вариант. Я планирую в ОС сделать третий уровень привилегий - системный. Это наивысший уровень привилегий в моей архитектуре. Администратор почти всемогущ, но он не может непосредственно переписывать или удалять системные файлы работающей инсталляции ОС. Права на запись в конфигурационные файлы ОС имеют только системные сервисы, а замена исполняемых файлов ОС и файлов ресурсов возможна только после нотариальной проверки подлинности их источника. Удаление файла из системной области возможно только в том случае, что он не числится в списке системных файлов последнего, также нотариально заверенного, списка системных файлов. При такой архитектуре даже под администратором не страшен крэш любого пользовательского процесса, включая случайные нажатия Del, F8, Format C: и пр. Хотя, конечно остаются вопросы, связанные с ошибками в самом системном ПО и со сбоями оборудования. Также такая архитектура должна показать высокую устойчивость к вирусному заражению.
Надёжную на 100% систему сделать нельзя, но очень надёжную сделать можно.
Современные ОС уже делают некоторые телодвижения в этом направлении, - в Windows Vista/7 работает UAC, а в Линуксах администратору заводится банальный пользователь, а из под рута программы выполняются по спец требованию. Но это только шаг, к тому же кривобокий.

Что касается двух подходов, - согласен с SII, один другого не исключает, а наоборот, хорошо дополняют. Единственно, мне очень не нравится поддержка исключений со стороны ЯВУ. Все эти try/catch вместо облегчения написания кода сильно запутывают логику программирования. Пока что в стадии активного размышления, как должна выглядеть поддержка исключений со стороны ЯВУ, чтобы программировать стало действительно на порядок удобней.
Даже в относительно простом boot.exe на каждый read/write запарился писать if/else со стандартным сообщением об ошибке и однотипными действиями.

Автор:  SII [ 28 фев 2012, 16:46 ]
Заголовок сообщения:  Re: Обработка исключений

Yoda писал(а):
А вот мой вариант. Я планирую в ОС сделать третий уровень привилегий - системный. Это наивысший уровень привилегий в моей архитектуре. Администратор почти всемогущ, но он не может непосредственно переписывать или удалять системные файлы работающей инсталляции ОС. Права на запись в конфигурационные файлы ОС имеют только системные сервисы, а замена исполняемых файлов ОС и файлов ресурсов возможна только после нотариальной проверки подлинности их источника. Удаление файла из системной области возможно только в том случае, что он не числится в списке системных файлов последнего, также нотариально заверенного, списка системных файлов. При такой архитектуре даже под администратором не страшен крэш любого пользовательского процесса, включая случайные нажатия Del, F8, Format C: и пр. Хотя, конечно остаются вопросы, связанные с ошибками в самом системном ПО и со сбоями оборудования. Также такая архитектура должна показать высокую устойчивость к вирусному заражению.


У меня, как я уже говорил, при явном указании со стороны пользователя есть возможность делать всё, иначе нельзя, например, нормально отлаживать эти самые системные сервисы (ведь просто так к ним доступ получать нельзя, поскольку это будет дырой в безопасности). В общем, моя защита от администратора нацелена не на блокирование сознательно деструктивных действий, а на минимизацию шансов совершить какую-либо большую гадость по ошибке. Поэтому, в частности, задачи, запускаемые администратором, по умолчанию работают с правами обычного пользователя; если им нужны дополнительные права, администратор должен это указывать явно. Таким образом, если запущен файловый менеджер, но без таких прав, то случайно удалить системные файлы не удастся. Ну а если уж запустил с ними -- то это проблемы администратора :)

Что же касается Вашего подхода, то меня терзают смутные сомнения... Нет, не с надёжностью, а с удобством разработки и обслуживания системы и т.п. вещами. ИМХО, слишком жёсткие ограничения больше вреда приносят, чем пользы. Ну и, во всяком случае, должна иметься возможность настройки системы на отключение такой "параноидальной" безопасности :) Лично я бы точно отключил все подобные блокировки: если я -- администратор, я должен иметь возможность сделать абсолютно всё.

Цитата:
Единственно, мне очень не нравится поддержка исключений со стороны ЯВУ. Все эти try/catch вместо облегчения написания кода сильно запутывают логику программирования. Пока что в стадии активного размышления, как должна выглядеть поддержка исключений со стороны ЯВУ, чтобы программировать стало действительно на порядок удобней.


На Си++, как и на Си, не пишу, поэтому не шибко компетентен, чтобы судить о реализации обработки исключений в этих языках. Однако на Дельфях try...finally и try...except меня никак не напрягали, а временами позволяли улучшить читабельность программы. На Аде ещё лучше сделано (меньше писанины, никаких тебе классов ошибок придумывать не надо, ну и т.д.). Впрочем, сами по себе паскалеподобные языки намного читабельней, чем Си, если не пренебрегать правилами оформления.

Автор:  418ImATeapot [ 28 фев 2012, 17:48 ]
Заголовок сообщения:  Re: Обработка исключений

Yoda писал(а):
Хотя, конечно остаются вопросы, связанные с ошибками в самом системном ПО и со сбоями оборудования. Также такая архитектура должна показать высокую устойчивость к вирусному заражению.
--------------------------
Все эти try/catch вместо облегчения написания кода сильно запутывают логику программирования. Пока что в стадии активного размышления, как должна выглядеть поддержка исключений со стороны ЯВУ, чтобы программировать стало действительно на порядок удобней.
Даже в относительно простом boot.exe на каждый read/write запарился писать if/else со стандартным сообщением об ошибке и однотипными действиями.

Понятно, что если ты запустил rm -rf /, то уже ничто тут не спасет.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/