Когда вы в очередной раз настраиваете Docker-контейнеры (и молитесь, чтобы они наконец запустились без ошибки Out of Memory) или проектируете изоляцию микросервисов, легко забыть, что за современные гарантии безопасности и страничную организацию памяти кто-то боролся десятилетиями. Истории о том, как инженеры прошлого скрещивали нескрещиваемое ради аппаратного прорыва, — это не просто музейная экзотика, а фундамент, на котором до сих пор держится весь low-level софт.

Введение: ретроспектива системных архитектур

История операционных систем полна неожиданных поворотов, пересечений кода и архитектурных заимствований. Когда мир персональных компьютеров в середине 1980-х годов стремительно переходил на 32-битные рельсы, разработчикам легендарной CP/M (Control Program for Microcomputers) пришлось искать новые пути выживания. Созданная Гэри Килдаллом для 8-битных процессоров Intel 8080, эта система прошла через множество инкарнаций. Одной из самых интригующих, хотя и малоизвестных страниц ее истории стал проект CP/M-386 — попытка перенести концепции защищенного режима на новую аппаратную базу.

В этой статье мы подробно разберем, как идеи, изначально заложенные в ОС для Motorola 68000, были адаптированы под революционный чип Intel 386. Мы изучим структуру ядра, особенности работы с памятью и то, какое место этот редкий программный продукт занимает в истории системного программирования.

Если вы когда-нибудь задумывались, почему современные ОС устроены именно так, а не иначе, стоит заглянуть в корни их архитектуры — ведь именно там зарождались подходы, актуальные и для сегодняшних облачных платформ (и да, легаси-код существовал задолго до того, как это стало мейнстримом).

Исторический контекст: от CP/M-80 к CP/M-68K

Компания Digital Research (DRI) доминировала на рынке софта в эпоху 8 бит благодаря CP/M-80. Однако с появлением 16-битных и 32-битных процессоров ситуация изменилась:

  • MS-DOS захватила рынок IBM PC-совместимых машин благодаря агрессивной политике Microsoft и дешевизне железа.
  • Motorola MC68000 открыла эру мощных рабочих станций, потребовав принципиально нового ПО.

Для чипа Motorola инженеры DRI разработали CP/M-68K. В отличие от ассемблерных предшественниц, она была написана преимущественно на языке C, имела модульную структуру, поддерживала разделение адресного пространства и компиляторы высокого уровня.

Когда Intel выпустила процессор 80386 с полноценным 32-битным защищенным режимом, перед разработчиками встал выбор: писать систему с нуля или адаптировать наработки. Выбор пал на портирование кодовой базы CP/M-68K на архитектуру x86.

Имея на руках готовую модульную структуру на C, разработчики столкнулись с классической для системных инженеров задачей: подружить чужеродный абстрактный код с низкоуровневыми особенностями нового кремния.

Архитектура CP/M-386: преодолевая ограничения x86

Главной проблемой ранних x86-систем был «реальный режим» (Real Mode) с его 1 МБ памяти и сегментной адресацией. Появление Intel 386 кардинально изменило расклад сил, предоставив разработчикам:

  • Плоское 32-битное адресное пространство с доступом к 4 ГБ RAM.
  • Аппаратную защиту памяти на уровне колец защиты (Protection Rings).
  • Страничную организацию виртуальной памяти (Paging).

Проект CP/M-386 использовал эти возможности для создания стабильной многозадачной среды, изолирующей пользовательские процессы от сбоев ядра.


; Пример концептуальной инициализации защищенного режима в x86
cli             ; Отключаем прерывания
lgdt [gdt_ptr]  ; Загружаем указатель таблицы глобальных дескрипторов (GDT)
mov eax, cr0
or eax, 1       ; Устанавливаем бит PE (Protection Enable)
mov cr0, eax
jmp 08h:flush   ; Межсегментный прыжок для сброса конвейера CPU

Переход от архитектуры к архитектуре никогда не бывает линейным. Изучая подобные переходы, мы лучше понимаем, как преодолеваются аппаратные ограничен