Когда вы в очередной раз настраиваете 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
Переход от архитектуры к архитектуре никогда не бывает линейным. Изучая подобные переходы, мы лучше понимаем, как преодолеваются аппаратные ограничен