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/ |