OSDev http://osdev.su/ |
|
Менеджер виртуальной памяти http://osdev.su/viewtopic.php?f=6&t=3806 |
Страница 2 из 2 |
Автор: | FreeProger [ 15 июл 2019, 20:12 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Цитата: Вопрос звучит не совсем корректно. Дело в том, что при создании пользовательского процесса надо создавать новый каталог страниц, и новые таблицы страниц, и на этапе создания указываешь для нулевой виртуальной страницы любой свободный физический адрес за пределами первого мегабайта. Отмонтировать ни чего не приходится. Впрочем, нулевую страницу вообще ни куда не монтируют, а оставляют пустой, для отлова ошибок обращения по нулевому (пустому) адресу с помощью исключения Page fault. Спасибо за разъяснения. Я сам об этом задумывался, что у каждого процесса свой каталог и они не связаны. Но почему то думал что ошибаюсь, потому что встречал описание ОС где говорится что адресное пространство системы делиться на две части выше 2гб идёт пространство ОС а от нуля до 2гб процессов. Сейчас думаю, зачем тогда я пытался засунуть ядро в верхние адреса, получается можно ядро расположить один к одному в нижних. Выделить одну таблицу описывающую первые 4МБ и последнюю таблицу для стека. |
Автор: | FreeProger [ 15 июл 2019, 20:13 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
И все же интересно почему без первых 4КБ прерывания не работают? Тем более что: Цитата: Впрочем, нулевую страницу вообще ни куда не монтируют, а оставляют пустой, для отлова ошибок обращения по нулевому (пустому) адресу
|
Автор: | Himik [ 15 июл 2019, 20:58 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
FreeProger писал(а): И все же интересно почему без первых 4КБ прерывания не работают? Значит где-то обращение по 0 адресу. Пробуй маскировать часть прерываний, чтобы определить - какие работают, какие нет. |
Автор: | FreeProger [ 17 июл 2019, 13:55 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Цитата: Значит где-то обращение по 0 адресу. Пробуй маскировать часть прерываний, чтобы определить - какие работают, какие нет. При обращении по нулевому адресу у меня должно вывестить сообщение PF - Page-Fault Exception, поскольку адрес не спроцирован. По крайней мере так происходит при обращении к неспроецированым адресам выше мегабайта. А по адресам ниже проверить не могу, так как PG это прерывание а любое прерывание без первой страницы ребутит систему. Я маскировал все прерывания, работает до возникновения PG. Разрешал прерывание от таймера начинает ребутится. |
Автор: | pavia [ 17 июл 2019, 14:09 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
А гадать без кода предлагаете? Показывайте код обработчика прерывания. Кольцо R3 используете или только R0? |
Автор: | FreeProger [ 17 июл 2019, 19:46 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Цитата: А гадать без кода предлагаете? Показывайте код обработчика прерывания. Код: ; Exception handler - Обработчики исключений exc_0: ; Нарушение. Ошибка деления, код ошибки-нет. Вызвано: div, idiv prints "exc - 0, Fault. #DE - Divide Error Exception. Induced (div, idiv).", 1 prints "Induced (div, idiv).", 1 iret exc_1: ; Нарушение/Ловушка. Исключение отладки. Код ошибки-нет. prints "exc - 1, Fault/Trap. #DB - Debug Exception.", 1 iret exc_2: ; Немаскируемые прерывания поступающие на порт NMI. (Аппаратный сбой) prints "exc - 2, Interrupt. Hardware failure.", 1 prints "Induced (Hardware failure).", 1 jmp $ exc_3: ; Ловушка. Программное прерывание служащее для отладки. Вызвано: int 3 prints "exc - 3, Trap. #BP - Breakpoint Exception.", 1 prints "Induced (int 3).", 1 iret exc_4: ; Ловушка. Фиксирует арефметическое переполнение(overflow). Код ошибки-нет. Вызвано: into prints "exc - 4, Trap. #OF - Overflow Exception.", 1 prints "Induced (into).", 1 iret exc_5: ; Нарушение. Нарушение границ массива. Код ошибки-нет. Вызвано: bound prints "exc - 5, Fault. #BR - BOUND Range Exceeded Exception.", 1 prints "Induced (bound).", 1 jmp $ exc_6: ; Нарушение. Недопустимый код команды. Код ошибки-нет. prints "exc - 6, Fault. #UD - Invalid Opcode Exception.", 1 prints "Induced (invalid command).", 1 jmp $ exc_7: ; Нарушение. Сопроцессор не доступен. Код ошибки-нет. Вызвано: esc, wait prints "exc - 7, Fault. #NM - Device Not Available Exception.", 1 prints "Induced (esc, wait).", 1 jmp $ exc_8: ; Авария. Двойное нарушение. Код ошибки-да prints "exc - 8, Abort. #DF - Double Fault Exception.", 1 iret exc_9: ; Авария. Выход сопроцессора из сегмента. Код ошибки-нет prints "exc - 9, Fault. The output of the coprocessor segment.", 1 jmp $ exc_10: ; Нарушение. Недопустимый сегмент состояния задачи TSS. Код ошибки-да. Вызвано: jmp, call, iret, прерывание ;pop eax ; код ошибки prints "exc - 10, Fault. #TS - Invalid TSS Exception.", 1 prints "Induced (jmp, call, iret, interrupt).", 1 jmp $ exc_11: ; Нарушение. Отсутствие сегмента. Код ошибки-да. Вызвано: команда загрузки сегментного регистра ;pop eax ; код ошибки prints "exc - 11, Fault. #NP - Segment Not Present.", 1 prints "Induced (segment register load command).", 1 jmp $ exc_12: ; Нарушение. Ошибка обращения к стеку. Код ошибки-да. Вызвано: командой обращения к стеку ;pop eax ; код ошибки prints "exc - 12, Fault. #SS - Stack Fault Exception. Induced (stack access command).", 1 prints "Induced (stack access command).", 1 jmp $ exc_13: ; Нарушение. Общая защита. Код ошибки-да. Вызвано: команда обращения к памяти ;pop eax ; код ошибки prints "exc - 13, Fault. #GP - General Protection Exception.", 1 prints "Induced (memory access command).", 1 jmp $ exc_14: ; Нарушение. Страничное нарушение. Код ошибки-да. Вызвано: команда обращения к памяти ;pop eax ; код ошибки prints "exc - 14, Fault. #PF - Page-Fault Exception.", 1 prints "Induced (memory access command).", 1 jmp $ ;exc_15 ; Не используется exc_16: ; Нарушение. Сопроцессор не доступен. Код ошибки-нет. Вызвано: esc, wait prints "exc - 16, Fault. #MF - x87 FPU Floating-Point Error.", 1 prints "Induced (esc, wait).", 1 jmp $ exc_17: ; Нарушение. Ошибка выравнивания. Код ошибки-да. Вызвано: команда обращения к памяти ;pop eax ; код ошибки prints "exc - 17, Fault. #AC - Alignment Check Exception.Induced (memory access command).", 1 prints "Induced (memory access command).", 1 jmp $ Код: ; Hardware interrupt handlers - Обработчики аппаратных прерываний ; Пустой обработчик. сбрасывает заявку в контроллере (End Of Interrupt) int_EOI: ci_8259A.eoi ; Конец прерывания iretd ; возврат из прерывания ; IRQ 0 обработчик - системный таймер int8_handler: jmp int_EOI ; сбросим заявку на прерывание ; IRQ 1 обработчик - клавиатура int9_handler: keybord.read_scode_from_port_to_buff ; Вызвать драйвер клавиатуры jmp int_EOI ; сбросим заявку на прерывание Код: ; Обработчики системных вызовов ; Системный вызов INT 48 - печать строки ; входные параметры: DS:ESI указывает на ASCIIZ-строку syscall_handler: iretd Цитата: Кольцо R3 используете или только R0? Пока только R0 Вот еще инициализация PIC Код: PORT_20 = 20h ; Master PIC — Command PORT_21 = 21h ; Master PIC — Data PORT_A0 = 0A0h ; Slave PIC — Command PORT_A1 = 0A1h ; Slave PIC — Data OCW2_EOI = 20h ; команда (End Of Interrupt). сбрасывает бит в регистре ISR macro outp port,data { push eax mov al,data out port,al pop eax } ; Перепрограммируем контроллеры прерываний macro ci_8259A.init { push ebx edx mov bl,32 mov bh,32+8 mov dx,0 call redirect_IRQ pop edx ebx } ; Очистка регистров обслуживания прерывания ISR. Сбрасывает заявку в обоих контроллерах macro ci_8259A.eoi { ; Сброс заявки в контроллере прерываний: посылка End-Of-Interrupt (EOI) outp PORT_20,OCW2_EOI ; ... в ведущий (Master) контроллер ... outp PORT_A0,OCW2_EOI ; ... и в ведомый (Slave) контроллер. } ; Вход: ; BL - Начало для IRQ 0..7 ; BH - начало для IRQ 8..15 ; DL - Маска для IRQ 0..7, ; DH - Маска для IRQ 8..15 redirect_IRQ: ; Перепрограммирование ведущего (Master) контроллера outp PORT_20,11h ; ICW1 - два контроллера outp PORT_21,bl ; ICW2 - базовые номера векторов outp PORT_21,04h ; ICW3 - ведомый контроллер подсоеденен к входу 2 outp PORT_21,ICW4_EOI ; ICW4 - требуется программная генерация EOI outp PORT_21,dl ; OCW1 - Маска прерываний для IRQ 0..7 ; Перепрограммирование ведомого (Slave) контроллера outp PORT_A0,11h ; ICW1 - два контроллера outp PORT_A1,bh ; ICW2 - базовые номера векторов outp PORT_A1,02h ; ICW3 - ведущий контроллер подключен к выходу 3 outp PORT_A1,ICW4_EOI ; ICW4 - требуется программная генерация EOI outp PORT_A1,dh ; OCW1 - Маска прерываний для IRQ 8..15 ret |
Автор: | pavia [ 17 июл 2019, 20:35 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Не вижу где тут может быть ошибка. Разве что на prints. Вылетает на реальном железе или в эмуляторе? Насколько помню Bochs умеет показывать страницу на которой вылетело. |
Автор: | FreeProger [ 17 июл 2019, 21:13 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Цитата: Не вижу где тут может быть ошибка. Разве что на prints. Вылетает на реальном железе или в эмуляторе? Я пробовал закоментировать prints, всё равно ребутится. Вылетает на QEMU. Цитата: Насколько помню Bochs умеет показывать страницу на которой вылетело. Спасибо можно будет попробовать. |
Автор: | Himik [ 17 июл 2019, 23:35 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
FreeProger писал(а): Цитата: Насколько помню Bochs умеет показывать страницу на которой вылетело. Спасибо можно будет попробовать. Да, после закрытия эмулятора можно смотреть файл bochsout.txt с результатами. Желательно попробовать во всех обработчиках исключений оставить только одну команду jmp $ Так как вызов prints использует стек, в случае ошибки стека происходит двойная ошибка, а в обработчике Double fault потом тройная. В оба контроллера PIC записывается одно и тоже ICW4_EOI, но значение должно быть разным. В первый Dh, во второй 9. Но это другая проблема. |
Автор: | FreeProger [ 18 июл 2019, 21:46 ] |
Заголовок сообщения: | Re: Менеджер виртуальной памяти |
Цитата: Желательно попробовать во всех обработчиках исключений оставить только одну команду jmp $ Так как вызов prints использует стек, в случае ошибки стека происходит двойная ошибка, а в обработчике Double fault потом тройная. Я пробовал оставлять только jmp $, к сожалению не помогло. Цитата: В оба контроллера PIC записывается одно и тоже ICW4_EOI, но значение должно быть разным. В первый Dh, во второй 9. Но это другая проблема. Спасибо, учту. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |