Нeт, не продвинулся я в написании собственной операционки.
(Если не считать подобия ядра на собственном 8-битном процессоре с многозадачностью)Концепция же операционки несколько трансформировалась (не изменилась, а получила упрощение).
Так, после того, как приложение загружается в память и получает управление, ему предоставляется полный объём адресного пространства - 4Гб (именно адресного пространства - не ОЗУ). Все эти 4Гб, естественно, разбиты на повторяющияся параграфы по 4кб, зеркально ссылаясь на некую область (допустим, стек).
Однако, теперь доступ к портам обеспечивает программирование этих параграфов. Т.е. если аппаратно процессор обеспечивает индексацию до 65536 разных устройств через инструкции out/outs/in/ins, то через механизм исключения с опциональным чтением всех 32-бит регистра EDX, через старшие 16-бит регистра теперь индексируется и сам параграф.
Код:
mov ebx,0x12340000 ; Указатель на 64кб буфера клавиатуры
mov edx,ebx ; Подправляем указатель так,
and edx,0xFFFF0000 ; чтобы передать ядру параграф
or edx,0x0000DEF1 ; и указываем на порт определений
lea eax,Console_in ; Теперь нужно передать соответствующую
out dx,eax ; непосредственно в порт
mov al,[ebx] ; С этого момент можно читать вводимый текст
... ... ...
Console_in:db "/dev/con/",0
Как видите, ничего существенно не изменилось. Если EDX=0x000ADEF0, а в порт отправить ссылку на "/dev/ega/", то, как логично ожидать, область 000A000..000AFFFF станет зеркалом EGA-графики.
Главное отличие в том, что если в классических OS нужно обращаться через int/call API-интерфейс, здесь симулируется программирование памяти через порты ввода-вывода. Что не требует вовлечения в адресное пространство приложения ни байта системного кода.
Подчеркну, что таким же образом мы можем параграфы памяти переключить на отображение классического API, будь то DirectX, OpenGL или OpenAL и пр…
P.S.: Если кто-то ожидал от меня большего - извиняюсь за разочарование…
Прошедший период времени занимался реализацией
мульти-процессорного "движка" на примере
i8080A.
(Обычно же эмулятор - это длинное switch-case дерево с адским процессом отладки. Мой "движок", получая краткий, но подробный шаблон с описанием процессора, автоматически генерирует всю необходимую среду для него: эмулятор+ассемблер+дизассемблер)