OSDev http://osdev.su/ |
|
операционная система http://osdev.su/viewtopic.php?f=18&t=3691 |
Страница 1 из 1 |
Автор: | dmitriy [ 17 апр 2019, 00:29 ] |
Заголовок сообщения: | операционная система |
Доброго времени суток! Кто-нибудь знает как работает процессор в защищенном режиме. |
Автор: | Yoda [ 17 апр 2019, 01:09 ] |
Заголовок сообщения: | Re: операционная система |
Перенёс сюда тему из раздела "Новости", т.к. она не имеет никакого отношения к новостям. Вопроса в вашем посте не увидел, но на всякий случай подтверждаю: да, кто-нибудь знает, как работает процессор в защищённом режиме. |
Автор: | dmitriy [ 17 апр 2019, 02:15 ] |
Заголовок сообщения: | Re: операционная система |
Yoda писал(а): Вопроса в вашем посте не увидел Я извиняюсь,может я не правильно задал вопрос. меня интересует как работает процессор в защищенном режиме. Вернее его поведение при прерывании. В реальном режиме в начале прерывания сохраняются все регистры в стеке потом происходит переход по вектору прерывания (вектор находиться в начале оперативной памяти 0000h-003fh) при возвращении по iret восстанавливает все регистры из стека. в защищенном режиме не все регистры сохраняются.в стеке какие не знаю. При этом не все прерывания по одинаковому сохраняют в стеке. некоторые еще сохраняют код ошибки. какие не знаю. Еще как я понял после перехода в защищенный вектора прерывания (по крайней мере рабочего) нет. Хотелось бы знать какие минимально нужно описать что бы операционная система не зависла. Как я понимаю таймер, клавиатура, критические ошибки нужны может еще какие то. Хотелось бы знать их прерывание (int) а не условное обозначение и описание (что прерывания должны делать). Заранее спасибо. |
Автор: | SII [ 17 апр 2019, 11:24 ] |
Заголовок сообщения: | Re: операционная система |
dmitriy писал(а): Вернее его поведение при прерывании. В реальном режиме в начале прерывания сохраняются все регистры в стеке потом происходит переход по вектору прерывания (вектор находиться в начале оперативной памяти 0000h-003fh) Не совсем верно. Насколько помню (а если ошибусь, знающие поправят), в архитектуре IA-32 (x86) при входе в обработчик прерывания (независимо от того, в каком режиме) сохраняются только адрес команды (пара регистров CS:IP, если говорим о реальном режиме) и регистр флагов (FLAGS), а отнюдь не все регистры. Остальные регистры при необходимости сохраняет обработчик прерывания, он же отвечает и за их восстановление. У IA-32 256 векторов прерываний, в реальном режиме каждый вектор имеет длину 4 байта (он содержит адрес точки входа в обработчик соответствующего прерывания), соответственно, вся таблица векторов занимает 1024 байта -- физические адреса с нуля до 3FFh (Вы написали 3F). dmitriy писал(а): в защищенном режиме не все регистры сохраняются.в стеке какие не знаю. При этом не все прерывания по одинаковому сохраняют в стеке. некоторые еще сохраняют код ошибки. какие не знаю. Еще как я понял после перехода в защищенный вектора прерывания (по крайней мере рабочего) нет. Сохраняется та же информация (адрес команды + флаги), плюс иногда код прерывания. Вход в обработчики осуществляется с помощью описателей (дескрипторов), которые собраны в таблицу IDT, положение которой в памяти задаётся регистром IDTR; в него надо загрузить корректную информацию (правильный адрес уже сформированной таблицы) до разрешения прерываний. Подробностей не помню, читайте документацию на архитектуру -- там всё достаточно подробно описано. dmitriy писал(а): Хотелось бы знать какие минимально нужно описать что бы операционная система не зависла. Как я понимаю таймер, клавиатура, критические ошибки нужны может еще какие то. Хотелось бы знать их прерывание (int) а не условное обозначение и описание (что прерывания должны делать) То, что может возникнуть, то и должно обрабатываться. Прерывания, возникающие прямо из-за действий программы (например, при выполнении команды INT), описаны в документации на архитектуру, там же приведены и номера их векторов. Аппаратные прерывания поступают от логически независимой от процессора железки -- контроллера прерываний (PIC в древних машинах, APIC в современных). Он должен быть правильным образом запрограммирован, чтобы правильно передавать прерывания от аппаратуры процессору. Пы.Сы. И не пытайтесь сразу прыгнуть выше крыши: разберитесь сначала досконально с реальным режимом, сделайте в нём рабочую недосистему (с прерываниями и всем таким прочим) и лишь затем перебирайтесь в защищённый режим. Пытаться сразу разобраться в куче разнообразного материала -- верный путь ничего не добиться, а лишь запутаться. |
Автор: | leonidpr [ 17 апр 2019, 16:56 ] |
Заголовок сообщения: | Re: операционная система |
Вообще вопрос очень обширный. В первую очередь вам нужно руководство по архитектуре IA32. А точнее даже третий том его. https://software.intel.com/en-us/articles/intel-sdm Там описано как работает процессор во всех его режимах. Как уже сказал SII - стоит начать с реального режима, т.к. в защищенный вы все равно будете переключаться из реального и некоторые аспекты понимать надо. Принципиальное отличие обработки прерываний в реальном и защищенном режимах в том, что в реальном таблица векторов хранит просто адреса обработчиков, а в защищенном нужно создать и настроить таблицу IDT, которая используется для определения того, где лежит обработчик прерывания, а так же содержит кучку других полей. Начните с чтения SDM и если будут возникать более конкретные вопросы, то уже по ним можно будет что-то отвечать. Так же в инете полно примеров, так что они то же в помощь. Например тут: https://vxlab.info/wasm/publist.php-list=24.htm |
Автор: | dmitriy [ 17 апр 2019, 19:02 ] |
Заголовок сообщения: | Re: операционная система |
Не получается у меня правильно все объяснить попробую еще раз SII писал(а): Не совсем верно. Насколько помню (а если ошибусь, знающие поправят), в архитектуре IA-32 (x86) при входе в обработчик прерывания (независимо от того, в каком режиме) сохраняются только адрес команды (пара регистров CS:IP, если говорим о реальном режиме) и регистр флагов (FLAGS), а отнюдь не все регистры. Остальные регистры при необходимости сохраняет обработчик прерывания, он же отвечает и за их восстановление. Вы ошибаетесь. в реальном (не защищенном) режиме обработчик прерывания сохраняет регистры AX BX CX DX SI DI ES DS CS IP регистр флагов (FLAGS) не помню только в какой последовательности. это точно сам проверял. Поэтому иногда (когда надо в регистрах оставить результат) при выходе из прерываний приходиться корректировать стек. SII писал(а): У IA-32 256 векторов прерываний, в реальном режиме каждый вектор имеет длину 4 байта (он содержит адрес точки входа в обработчик соответствующего прерывания), соответственно, вся таблица векторов занимает 1024 байта -- физические адреса с нуля до 3FFh (Вы написали 3F). Да уж бывает описался ![]() 64 байта под 256 прерываний ![]() ![]() ![]() ![]() ![]() ![]() ![]() SII писал(а): Сохраняется та же информация (адрес команды + флаги), плюс иногда код прерывания. Вход в обработчики осуществляется с помощью описателей (дескрипторов), которые собраны в таблицу IDT, положение которой в памяти задаётся регистром IDTR; в него надо загрузить корректную информацию (правильный адрес уже сформированной таблицы) до разрешения прерываний. Подробностей не помню, читайте документацию на архитектуру -- там всё достаточно подробно описано. Не совсем верно. Прерывания общей защиты (когда в память не туда залезишь, или полномочий не хватает и т. д) еще сохраняют код ошибки. Какие именно (прерывания) не где найти не могу. SII писал(а): То, что может возникнуть, то и должно обрабатываться. Прерывания, возникающие прямо из-за действий программы (например, при выполнении команды INT), описаны в документации на архитектуру, там же приведены и номера их векторов. Аппаратные прерывания поступают от логически независимой от процессора железки -- контроллера прерываний (PIC в древних машинах, APIC в современных). Он должен быть правильным образом запрограммирован, чтобы правильно передавать прерывания от аппаратуры процессору. Пы.Сы. И не пытайтесь сразу прыгнуть выше крыши: разберитесь сначала досконально с реальным режимом, сделайте в нём рабочую недосистему (с прерываниями и всем таким прочим) и лишь затем перебирайтесь в защищённый режим. Пытаться сразу разобраться в куче разнообразного материала -- верный путь ничего не добиться, а лишь запутаться. Реальный (не защищенный) режим я знаю. Проблем с ним у меня не возникало. Только в реальном режиме уже есть прерывание (в BIOS)и достаточно много. То бишь не загружая не какой системы уже можно опрашивать клавиатуру, записывать\стирать с диска, выводить на экран и т.д И все это не программируя прерываний |
Автор: | SII [ 17 апр 2019, 19:47 ] |
Заголовок сообщения: | Re: операционная система |
dmitriy писал(а): SII писал(а): Не совсем верно. Насколько помню (а если ошибусь, знающие поправят), в архитектуре IA-32 (x86) при входе в обработчик прерывания (независимо от того, в каком режиме) сохраняются только адрес команды (пара регистров CS:IP, если говорим о реальном режиме) и регистр флагов (FLAGS), а отнюдь не все регистры. Остальные регистры при необходимости сохраняет обработчик прерывания, он же отвечает и за их восстановление. Вы ошибаетесь. в реальном (не защищенном) режиме обработчик прерывания сохраняет регистры AX BX CX DX SI DI ES DS CS IP регистр флагов (FLAGS) не помню только в какой последовательности. это точно сам проверял. Вообще-то я не ошибаюсь и пишу чёрным по белому: все регистры, кроме адреса команды (CS:IP) и флагов, сохраняет обработчик (а не процессор), причём обработчик не обязан записывать эти регистры в стек или куда-нибудь ещё, если их не меняет. Он обязан (в общем случае) лишь обеспечить их неизменность, а как этого добьётся -- это его сугубо личное дело. Например, если для обработки некоторого прерывания обработчику достаточно регистров AX и DX, он может сохранить только их и не тратить время на сохранение/восстановление остальных регистров: Код: Intr_Enrty: push ax push dx обработка прерывания pop dx pop ax iret Другое дело, что проще сделать pusha в начале и popa в конце, сохранив-восстановив все 7 регистров общего назначения. Но эти команды отсутствовали в 8086/88, там приходилось отдельными push/pop (понятно, сейчас это неактуально, разве что если кто страдает некрофилией и пишет именно под 8086). Цитата: SII писал(а): Сохраняется та же информация (адрес команды + флаги), плюс иногда код прерывания. Вход в обработчики осуществляется с помощью описателей (дескрипторов), которые собраны в таблицу IDT, положение которой в памяти задаётся регистром IDTR; в него надо загрузить корректную информацию (правильный адрес уже сформированной таблицы) до разрешения прерываний. Подробностей не помню, читайте документацию на архитектуру -- там всё достаточно подробно описано. Не совсем верно. Прерывания общей защиты (когда в память не туда залезишь, или полномочий не хватает и т. д) еще сохраняют код ошибки. Какие именно (прерывания) не где найти не могу. Я код ошибки обозвал кодом прерывания -- не помню, как оно у Интела называется; у каждой архитектуры своя терминология. А искать, естественно, в описании архитектуры IA-32, в третьей её части -- именно там описывается всё, что касается системной архитектуры (прерывания, состояния, переключения туда-сюда-обратно и т.д. и т.п.). Цитата: Реальный (не защищенный) режим я знаю. Проблем с ним у меня не возникало. Только в реальном режиме уже есть прерывание (в BIOS)и достаточно много. То бишь не загружая не какой системы уже можно опрашивать клавиатуру, записывать\стирать с диска, выводить на экран и т.д И все это не программируя прерываний А вот надо уметь программировать всё это самому, не полагаясь на BIOS, и только затем лезть в защищённый режим. Если попробовать сразу совместить одно с другим, лишь создадите себе лишние проблемы (попробуй догадайся, из-за чего всё висит: неверно запрограммирован контроллер прерываний? кривой дескриптор в IDT? кривой TSS? один стек затирает другой? ну и т.д. и т.п.) |
Автор: | pavia [ 17 апр 2019, 20:39 ] |
Заголовок сообщения: | Re: операционная система |
dmitriy писал(а): Реальный (не защищенный) режим я знаю. Проблем с ним у меня не возникало. Только в реальном режиме уже есть прерывание (в BIOS)и достаточно много. То бишь не загружая не какой системы уже можно опрашивать клавиатуру, записывать\стирать с диска, выводить на экран и т.д И все это не программируя прерываний Во времена DOS очень даже принято было вешать свои обработчики на прерывания. Борлан паскаль заменял аж 16 штук. Grub по меньше штуки 4 не меньше. Цитата: Какие именно (прерывания) не где найти не могу. 3 том глава про прерывания, примерно 5. https://dev64.wordpress.com/2012/04/16/ ... rupt-table Цитата: . в защищенном режиме не все регистры сохраняются.в стеке какие не знаю. Рисунок 5.4 В верху при смене стека снизу при создании нового стека. ![]() Цитата: Хотелось бы знать какие минимально нужно описать что бы операционная система не зависла. Как я понимаю таймер, клавиатура, критические ошибки нужны может еще какие то. Хотелось бы знать их прерывание (int) а не условное обозначение и описание (что прерывания должны делать). Заранее спасибо. Минимум все 32 исключения и прерывания таймера и клавиатуры. IRQ преобразуются в INT согласно тому как вы запрограммировали PIC. |
Автор: | dmitriy [ 18 апр 2019, 00:53 ] |
Заголовок сообщения: | Re: операционная система |
leonidpr писал(а): Не плохая ссылка. Всю прочитал. Спасибо большое leonidpr. другую позже посмотрю Для кого интересно прерывание 0Dh-Исключение общей защиты ( #GP - General Protection Exception ) Означает, что процессор обнаружил одно из условий нарушения защиты. оно так же добавляет код ошибки |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |