Модель своей OS я реализовал как простейщий эмулятор x86 путём интерпретирования машинного кода. Это очень просто, хорошо защищает от сбоев, но и имеет черепаший ход. Словом, топорная работа. Существует ли документация по написанию собственных менеджеров памятии для реализации "тонкого механизма" обработчиков исключений в среде Windows, чтобы код работал в изолированном от среды Windows пространстве, а все исключения обрабатывались только моим менеджером? Т.е. подобие DOS-Box'a, но на уровне встроенных механизмов, словно VDM-32, а не медленным разбором каждой инструкции. К примеру, функцией CreateProcess создать полностью изолированный от Виндовс процесс и все исключения, которые он вызывает, обрабатывать собственным диспетчером. Спасибо!
В виндах можно использовать механизм SEH-фреймов, но конечно GP, UD и т.п. перехватить с его помощью не получится. Хотя слышал, что есть эмуляторы, которые эмулируют не каждую инструкцию, а запускают отдельные участки эмулируемого кода. Здесь следует копать в сторону перехвата обработчиков исключений в режиме ядра, т.е. в драйверах. Есть еще технология аппаратной виртуализации VT, но ее поддерживают далеко не все процессоры.
Условно я называю это как OS, хотя на деле же - это часть оболочки программы, в которой можно описывать графические сцены или звуковые эффекты. Первоначально задумывал её как скриптовый язык. Но, сложности с разработкой синтаксиса и парсированием вынудили отказаться от скриптовой модели и переложить всё на уже готовый аппаратный парсер - сам процессор. Возмём пример MenuetOS-API и немного изменим концепцию: Код (Text): ; MenuetOS example mov eax,1 ; Putpixel mov ebx,X ; X-position mov ecx,Y ; Y-position mov edx,Color ; Pixel color int 0x40 ; PutPixel() ; My-self-OS variant mov es,hWinDC ; Window handle stosd ; edi=Y*65536+X; eax=Color Т.е. системный вызов оформлен как исключение. Коротко и просто. Нужно лишь скрыть от приложения все Win-API и всё, обрабатывая лишь исключения, чтобы любой сбой или вирусное заражение код в принципе не смог сделать! Скрипт - есть скрипт. Вроде бы просто, но никак не найду нужную документацию, как это сделать. Своеобразная модель VDM короче, со своими портами и памятью...
Через исключение может быть коротко и просто, но только не для ОС. Тормоза будут еще те. Да и полностью от возникновения ошибок ты таким образом не убережешься. Я бы на твоем месте все-таки разработал какой-нибудь байт-код, в который бы компилировались скрипты, но попытался бы избавиться от примитивных операций типа работы с отдельной точкой в пользу работы с целой фигурой или хотябы массивом точек, т.е. сделал бы что-то вроде макроязыка.
Да, даже если будут тормоза - не страшно. Во-первых, я учусь... Поэтому в моих интересах сейчас взять процесс под полный контроль. Т.е. перекрыть ему доступ к API-памяти и обрабатывать все исключения. Тем самым, научиться создавать собственное виртуальное пространство. Во-вторых, пример с выводом пиксела - грубый пример. На деле же всё намного сложнее и организованнее, по большей части процесс вырабатывает уйму исключений при инициации. Затем, основной цикл работает замкнуто, лишь периодически вырабатывая исключениее. Скажем, фильтр VirtualDub, 99% процессорного времени которого - обработка массива изображения и в конце инструкция HLT для передачи результата. В-третьих, каким бы образом процесс ни обращался к выделенному ему адресному пространству, ошибки быть не может, так как подкачка страниц обрабатываться должна моим менеджеров, а обращения к системным функциям - отсутствует, так как процесс в первую очередь - обработчик массивов и Win-API ему не нужны и не доступны. Проще говоря, программа-пример есть и работает в побайтовом парсере машинного кода. Мне нужно лишь исключить из диспетчера сам эмулятор x86 и переключиться на обработку исключений, что повысит скорость и упростит сам диспетчер. А вот от скриптов, как сказал уже, мне пришлось отказаться. Байт-код тоже есть... Но меня интересует, как сказал выше, сам механизм обработки исключений... Спасибо!
Как мне дали понять, подобные механизмы - коммерческая тайна многих производителей антивирусов и пр... Всем Спасибо! Тема закрыта.
разве что статьи по защищенному режиму а что-то мешает, получить контроль над IDT, да и прооцесором вобще? Почти аналогичная задача, реализована в "ускорительном" дрове KQEMU Код (Text): movl KQEMU_STATE_monitor_cr3(%ebx), %eax movl KQEMU_STATE_monitor_data_vaddr(%ebx), %ebx movl %eax, %cr3 movl %ecx, %cr4 lidt KQEMU_STATE_monitor_idt(%ebx) lgdt KQEMU_STATE_monitor_gdt(%ebx) ljmp *KQEMU_STATE_monitor_jmp(%ebx) ASM_NAME(kernel2monitor_jmp_offset): по-сути ОСь над ОСь-ю, без всяких байткодов и скриптов.