|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 22, 2003 20:19:52 Подскажите в чем дело. Моя микро ось линкованая как СОМ файл загружается из доса, переходит в прот. моде, делает свои дела (не обращается вне исходного кода и данных) и затем не может выгрузиться в дос, просто виснет и баста. Это происходит только в том случае если я программирую контроллер прерываний 8259, если же нет - все работает нормально. Для программирования используется следующая процедура: set_i8259A proc ; BH=base for MASTER, BL=base for SLAVE mov al, 00010001b out port_i8259a_m,al ;icw1 jmp $+2 jmp $+2 out port_i8259a_s,al ;icw1 jmp $+2 jmp $+2 mov al, bh out port_i8259a_m+1,al ;base jmp $+2 jmp $+2 mov al, bl out port_i8259a_s+1,al ;base jmp $+2 jmp $+2 mov al, 4 ; unit la a 2-a linie (master) out port_i8259a_m+1,al ;icw3 jmp $+2 jmp $+2 mov al, 2 ; unit la a 2-a linie (slave) out port_i8259a_s+1,al ;icw3 jmp $+2 jmp $+2 mov al, 1 out port_i8259a_m+1,al ;icw4 jmp $+2 jmp $+2 out port_i8259a_s+1,al ;icw4 jmp $+2 jmp $+2 mov al, 0ffh out port_i8259a_m+1,al jmp $+2 jmp $+2 out port_i8259a_s+1,al jmp $+2 jmp $+2 ret set_i8259A endp ; port_i8259A_m equ 020h ; MASTER port_i8259A_s equ 0A0h ; SLAVE ; после перехода в прот. моде вызываю: mov bx,2028h call set_i8259A xor al,al out port_i8259A_m+1,al out port_i8259A_s+1,al in al,70h and al,07fh out 70h,al ; после возврата в реал моде вызываю: mov bx,0870h call set_i8259A xor al,al out port_i8259A_m+1,al out port_i8259A_s+1,al in al,70h and al,07fh out 70h,al все сегментные реги и системные тоже инициализирую так, как надо, т.к. иключений и зависаний не возникает ни в одном из случаев. После возврата в реал моде доступны функции BIOS и работает комбинация CTRL+ALT+DEL а выхожу из программы стандортно: sti mov ax,4c00h int 21h Подскажите плиз, что тут может быть не так? |
|
|
Дата: Окт 23, 2003 06:07:58 У Гука написано что последовательность инициализации для контроллеров следующая: ICW1 = 10h/10h(master/slave) ICM2 = 08h/70h ICW3 = 04h/02h ICW4 = 1fh/1bh OCW3 = 0ah,0ah Только в моей программе после выхода из защищенного режима, отрубалась клавиатура. По моему выход тут один: в бут сектор дискеты поместить код, который поставит брекпоинт на обращение к портам, и посмотрит, что же всетаки в них пишется. |
|
|
Дата: Окт 23, 2003 10:45:59 К стати, а где можно скачать этого Гука? |
|
|
Дата: Окт 23, 2003 15:59:55 lazari просто виснет и баста вроде программируешь котроллер правильно, во всяком случае у меня та же последовательность команд. И все работает, то-есть и входит и выходит. А ты уверен, что проблема именно в контроллере? |
|
|
Дата: Окт 23, 2003 16:10:50 да, еще, вот ссылочка. Хотя про APIC я ни хрена не знаю. И без его разрешения/запрещения все прекрасно работает :) |
|
|
Дата: Окт 23, 2003 17:50:21 Код правильный, если судить по приведеному куску. Но неплохо бы узнать еще как в риал возвращаешься - если через ресет с точкой возврата, то в порт 71 нужно код возврата без перепрограммирования СКИ биосом, раз ты сам СКИ засылаешь. Если без ресета, то не понимаю пока почему не проходит. разве что маски не те:) |
|
|
Дата: Окт 23, 2003 20:22:55 · Поправил: lazari Black_mirror Год Гука правильнее, ICW4 у меня неверен. Но это не решает проблему. Kba3iM0go Что проблема в контролере уверен почти на все 100%, т.к. если я не перепрограммирую его, то все работает, ну почти все, т.к. прерывания не работают ... Valery А вот на счет маски и приоритетов не уверен, я лично приоритеты не использую, как и маски тоже, т.е. все аппаратные прерывания разрешены. |
|
|
Дата: Окт 23, 2003 20:31:22 lazari Год Гука правильнее, ICW4 у меня неверен. хм. У меня также, как у тебя... Посмотрим. ну почти все, т.к. прерывания не работают Дык может именно прерывания что-то и портят? попробуй их повызывать ручками, без перепрограммирования. я лично приоритеты не использую, как и маски тоже Имеет смысл сохранить маску, которую выставил ДОС до того, как ты запустился. А вдруг у него какой-то вектор не инициализирован, и маска на него стоит. А ты когда выходишь - разблокируеш его? А что по поводу APIC? Мож кто ткнет носом? |
|
|
Дата: Окт 23, 2003 20:46:40 Повторяю вопрос: как в риал возвращаешься?Здесь это принципиально. Можно так еще: при возврате не перепрограмировать контроллеры, а сбросить перед ресетом в кмоп (0х71 порт) 0х05. |
|
|
Дата: Окт 23, 2003 21:36:20 · Поправил: lazari Valery Сорри, забыл ответить. Возвращаюсь сам, без сброса, вот код set_real: cli in al,port_CMOS_m ; interzicerea or al,80h ; intreruperilor out port_CMOS_m,al ; nemascabile mov edi,krnl_offset load_descr CODE_desc,edi,0FFFFh,SEG_DATACODE+SEG_CODE+SEG_PRESENT+SEG_READABLE load_descr DATA_desc,edi,0FFFFh,SEG_DATACODE+SEG_PRESENT+SEG_WRITEABLE mov word ptr IDTR,03ffh mov dword ptr IDTR+2,0 lidt fword ptr IDTR ; incarcarea IDTR pentru RM mov ax,real_cs mov @@cs_rm,ax mov ax,DATA_sel mov ds,ax mov es,ax mov ss,ax mov gs,ax mov fs,ax db 0eah ; far jmp (PM) dd offset @@cs_pm dw CODE_sel @@cs_pm: mov eax,cr0 ; stabilirea and al,0feh ; modului mov cr0,eax ; real db 0eah ; far jmp (RM) dw offset back_rm @@cs_rm dw ? ; back_rm: mov ax,cs mov ds,ax mov es,ax mov ss,ax mov sp,real_sp mov bx,0870h call set_i8259A xor al,al out port_i8259A_m+1,al out port_i8259A_s+1,al in al,70h ; initializarea and al,07fh ; intreruperilor out 70h,al ; nemascabile sti mov ax,4c00h int 21h ; надеюсь здесь все понятно да, вот еще кое какая статистика: если программирую контроллер до входа в ПМ и не вхожу в ПМ, а сразу иду на BACK_RM, т.е. еще раз перепрограммирую контроллер но для доса, то все работает. а вот если программирую контроллер, прыгаю в ПМ, но не трогаю контроллер, затем обратно и программирую его для дос, прога выходит в дос, но виснет клава :-) А что касается ICW4, то смотрите сами: Последнее слово инициализации (ICW4) имеет следующий формат: 7 6 5 4 3 2 1 0 Бит 0 (mPM) определяет, с каким микропроцессором работает ПКП (0 - 8080/8085, 1 - 8086/8088). Бит 1 (AEOI), равный 1, задает режим автоматического завершения обработки прерывания, описанный выше. Если этот бит равен 0, действует обычное соглашение: процедура обработки аппаратного прерывания должна сама сбрасывать свой бит в ISR. Бит 2 (M/S) игнорируется, если бит 3 (BUF) = 0. При наличии одного контроллера и BUF = 1 устанавливается в 1. При наличии каскада должен быть равен 1 только для ведущего контроллера. Бит 4 (SFNM) устанавливает специальный вложенный режим, применяемый при каскадировании для определения приоритетов запросов от разных контроллеров (Special Fully Nested Mode). Kba3iM0go Ты имеешь в виду вызывать ручками в реале? Наверняка там заглушки стоят, но я все таки проверю, хотя в этом уже нет смысла, т.к. я маску во время статистики что выше менял и ничего - работало. А в ПМ все прерывания у меня перехватываются, если что лишнее вызвается - сразу видно. Я ща перешел на альтернативный путь - ресет с кодом 5, так все работает, но все таки хотелось бы понять в чем именно трабла в первом случае. Возможно это из-за ACPI или как он там ... |
|
|
Дата: Окт 24, 2003 02:22:23 lazari да, вот еще кое какая статистика: если программирую контроллер до входа в ПМ и не вхожу в ПМ, а сразу иду на BACK_RM, т.е. еще раз перепрограммирую контроллер но для доса, то все работает. а вот если программирую контроллер, прыгаю в ПМ, но не трогаю контроллер, затем обратно и программирую его для дос, прога выходит в дос, но виснет клава :-) У меня картина была точно такая же. Причем сохранение маски прерываний на это никак не влияло. На том компе на котором я производил тесты, никакого APIC не было, так что он скорее всего тут не при чем. Вообще моя программа переходила в зашищенный режим, а затем запускала дос в виртуальном. Некоторые программы там даже работали 8) А при возврате в реальный клавиатура не работала и все тут. Не помогал даже ее сброс. Где скачать Гука я не знаю. Вообще книга называется "Аппаратные средства IBM PC" издательство "ПИТЕР". |
|
|
Дата: Окт 24, 2003 07:32:14 · Поправил: lazari Видимо надо вырезать из биоса процедуру программирования ПКП. Думаю, если покавыряться в нем с адреса, по которому прыгает проц после ресета (кажется 0FFFF:0000) ща точно не помню, то можно добраться и до этого ... Попытаюсь, может на че интересное наткнусь :-) Еще интересен момент: при перепрограммировании ПКП есть необходимость заново устанавливать приоритеты или они сохраняются? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.048 |