OSDev

для всех
Текущее время: 22 дек 2024, 04:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 15 июл 2019, 20:12 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
Цитата:
Вопрос звучит не совсем корректно. Дело в том, что при создании пользовательского процесса надо создавать новый каталог страниц, и новые таблицы страниц, и на этапе создания указываешь для нулевой виртуальной страницы любой свободный физический адрес за пределами первого мегабайта. Отмонтировать ни чего не приходится. Впрочем, нулевую страницу вообще ни куда не монтируют, а оставляют пустой, для отлова ошибок обращения по нулевому (пустому) адресу с помощью исключения Page fault.



Спасибо за разъяснения. Я сам об этом задумывался, что у каждого процесса свой каталог и они не связаны. Но почему то думал что ошибаюсь, потому что встречал описание ОС где говорится что адресное пространство системы делиться на две части выше 2гб идёт пространство ОС а от нуля до 2гб процессов. Сейчас думаю, зачем тогда я пытался засунуть ядро в верхние адреса, получается можно ядро расположить один к одному в нижних. Выделить одну таблицу описывающую первые 4МБ и последнюю таблицу для стека.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 15 июл 2019, 20:13 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
И все же интересно почему без первых 4КБ прерывания не работают? Тем более что:
Цитата:
Впрочем, нулевую страницу вообще ни куда не монтируют, а оставляют пустой, для отлова ошибок обращения по нулевому (пустому) адресу



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 15 июл 2019, 20:58 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
FreeProger писал(а):
И все же интересно почему без первых 4КБ прерывания не работают?

Значит где-то обращение по 0 адресу. Пробуй маскировать часть прерываний, чтобы определить - какие работают, какие нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 13:55 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
Цитата:
Значит где-то обращение по 0 адресу. Пробуй маскировать часть прерываний, чтобы определить - какие работают, какие нет.

При обращении по нулевому адресу у меня должно вывестить сообщение PF - Page-Fault Exception, поскольку адрес не спроцирован. По крайней мере так происходит при обращении к неспроецированым адресам выше мегабайта. А по адресам ниже проверить не могу, так как PG это прерывание а любое прерывание без первой страницы ребутит систему. Я маскировал все прерывания, работает до возникновения PG. Разрешал прерывание от таймера начинает ребутится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 14:09 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
А гадать без кода предлагаете?
Показывайте код обработчика прерывания.

Кольцо R3 используете или только R0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 19:46 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
Цитата:
А гадать без кода предлагаете?
Показывайте код обработчика прерывания.

Код:
; 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 20:35 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Не вижу где тут может быть ошибка. Разве что на prints.

Вылетает на реальном железе или в эмуляторе? Насколько помню Bochs умеет показывать страницу на которой вылетело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 21:13 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
Цитата:
Не вижу где тут может быть ошибка. Разве что на prints.

Вылетает на реальном железе или в эмуляторе?

Я пробовал закоментировать prints, всё равно ребутится. Вылетает на QEMU.

Цитата:
Насколько помню Bochs умеет показывать страницу на которой вылетело.

Спасибо можно будет попробовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 17 июл 2019, 23:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
FreeProger писал(а):
Цитата:
Насколько помню Bochs умеет показывать страницу на которой вылетело.

Спасибо можно будет попробовать.

Да, после закрытия эмулятора можно смотреть файл bochsout.txt с результатами.

Желательно попробовать во всех обработчиках исключений оставить только одну команду jmp $
Так как вызов prints использует стек, в случае ошибки стека происходит двойная ошибка, а в обработчике Double fault потом тройная.

В оба контроллера PIC записывается одно и тоже ICW4_EOI, но значение должно быть разным. В первый Dh, во второй 9. Но это другая проблема.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Менеджер виртуальной памяти
СообщениеДобавлено: 18 июл 2019, 21:46 

Зарегистрирован: 22 май 2019, 12:08
Сообщения: 34
Цитата:
Желательно попробовать во всех обработчиках исключений оставить только одну команду jmp $
Так как вызов prints использует стек, в случае ошибки стека происходит двойная ошибка, а в обработчике Double fault потом тройная.

Я пробовал оставлять только jmp $, к сожалению не помогло.
Цитата:
В оба контроллера PIC записывается одно и тоже ICW4_EOI, но значение должно быть разным. В первый Dh, во второй 9. Но это другая проблема.

Спасибо, учту.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB