SII но мы то говорим о стеке ESP (RSP) обычно уменьшается т. е переполнение и прочие неприятности могут произойти именно в этом случае лимит здесь дает стопроцентную защиту, потому что не завязан на n-ое количество страниц-ловушек
rei3er Обычно указатель стека уменьшается на небольшую величину (явно меньшую размера страницы) -- в этом случае одна защитная страница вполне спасает. Ну а для большого уменьшения (когда у подпрограммы выше крыши локальных переменных), нормальные компиляторы не просто sub esp, что-то там делают, а вызывают подпрограмму, которая проверяет на отсутствие переполнения стека. Понятное дело, что подпрограмма медленнее работает, чем "кремниевая" защита через лимит, но тонна локальных переменных -- это всё же исключение, а не правило (если не криворукий прогу писал, есно).
вот код бинарника - где ошибка? кто-то может мне помощь? Код (Text): use16 org 0x100 start: mov ax, 0x03 int 0x10 cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 0x02 out 0x92, al xor eax, eax mov ax, cs shl eax, 0x04 add eax, gdt mov [gdtr+0x02], eax lgdt fword [gdtr] mov eax, cr0 or al, 1 mov cr0, eax xor eax, eax mov ax, cs shl eax, 0x04 add eax, pm_entry mov [pm], eax db 0x66 db 0xea pm dd 0x00 dw fcode_descr pm_entry: mov ax, fdata_descr mov ds, ax mov es, ax inc byte [es:0xb8000] jmp $ include 'pmode.inc' fcode_descr = (fcode_desc-null_desc) fdata_descr = (fdata_desc-null_desc) gdtr: dw gdt_size-1 dd 0 gdt: null_desc desc_struc 0,0,0,0,0,0 fcode_desc desc_struc 0xffff,0,0,code_acc,0xc0,0 fdata_desc desc_struc 0xffff,0,0,data_acc,0xc0,0 gdt_size = ($-gdt)
SadKo сам прикол в том что - кажется всё хорошо сделал, так как если до jmp поставить код: Код (Text): mov ax, fdata_descr mov es, ax inc byte [es:0x0b8000] jmp $ то всё работает - тесть нормально настроил gdt, а вот far jmp - что-то не хочет работать, хотя дебагел часть кода - то, кажется всё норм находило физический адрес (дебагил не в bochs, так как ним никогда не пользовался)
способом проб и ошибок узнал что ребут идет когда делается эта команда(уже в защищенном режиме!): Код (Text): pm_entry: mov ax, fdata_descr mov ds, ax mov es, ax inc byte [es:0xb8000] ;<----- здесь!!!! если поставить ее в комментарии, то ребут не идет! почему?????
AntiB такой инструкции нет Код (Text): use16 org 0x7С00 start: mov ax, 0x03 int 0x10 cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 0x02 out 0x92, al xor ax, ax mov ds, ax db 0x66 lgdt fword [gdtr] mov eax, cr0 or al, 1 mov cr0, eax db 0x66 db 0xea dd @F dw 1 SHL 3 use32 @@: mov ax, 2 SHL 3 mov ds, ax mov es, ax mov dword [0xB8000], 0xF31 hlt gdtr: dw gdt_size-1 dd gdt gdt: dq 0x0000000000000000 dq 0x00CF9A000000FFFF dq 0x00CF92000000FFFF gdt_size = $ - gdt
rei3er знаете почему ваш код работает? - потому что у него cs = 0x00 то есть вам надо тока ip указать куда пригнуть - а мне надо найти физический адрес, так как моя прога грузиться куда захочет (вернее ДОС ей даст) впервые слышу, хотя может вы правы
нашел ошибку, надо так: Код (Text): use32 pm_entry: mov ax, fdata_descr mov ds, ax mov es, ax inc byte [es:0xb8000] глупее ошибки нету - всём спасибо за помощь
у меня вопрос по модели памяти - Flat - как сделать ограничение по доступности памяти? как сделать, чтобы программа не могла работать с памятью, которой ОС ей не выделила???
rei3er Вообще-то "выше по тексту" никак не влияет на то, что Вы не знали о существовании упомянутой инструкции. Так что учить матчасть всё-таки надо. AntiB Использовать страничную организацию памяти и осуществлять защиту на уровне страниц. Заодно и виртуальную память реализуете
1. О существовании инструкции я знал 2. Я перепутал ее с инструкцией mov CS, <register> 3. Обычно я использую GAS с AT&T синтакисом, где порядок операндов изменен на обратный OFFTOP прежде чем говорить о чьей-либо некомпетентности нужно иметь на то основания