Исходники Kernel 0.01 взяты мной с oldlinux.org .
Пожалуй , это первая публичная версия Linux , когда-либо выложенная Торвальдсом в интернет .
Прародителем этой версии послужила другая операционная система - Minix .
Особенность v. 0.01 в том , что она компактна и ее образ умещается на дискету.
Архив исходников ядра версии 0.01 можно получить например тут (100 кб) .
В архитектуре ядра 0.01 имеется 2 типа таблицы дескрипторов :
1. LDT - локальная
2. GDT - глобальная
Если 2-й бит сегментного регистра равен нулю , то мы обращаемся к GDT ,
если нулю , то к LDT .
Существуют специальные инструкции - LGDT and LLDT - для определения местоположения
этих таблиц в памяти . Они должны быть выполнены перед началом любой программы ,
для того чтобы процессор знал местоположение обоих дескрипторных таблиц .
У процессора есть 2 регистра для хранения базового адреса таблицы и ее размера .
Дескрипторные таблицы состоят из сегментных адресов . Размер одного сегментного адреса равен 8 байтам .
В нем помимо самого адреса хранится информация о том , на чтение или на запись данный сегмент ,
хранится ли в этом сегменте код или данные . Размер одного сегмента равен 4 кб .
LDT и GDT может быть создано произвольное количество , но в конкретный момент времени
активной может быть только одна пара таких таблиц . Переключение между ними осуществляется
с помощью все тех же LGDT/LLDT-инструкций .
Полностью адресация не исчерпывается этими 2-мя таблицами .
Еще имеется paging-адресация ,которая дает возможность выделить 2^{32} = 4Gb памяти .
Это осуществляется с помощью еще 2-х таблиц - paging directory и paging table.
Внешние устройства подсоединены к контоллеру прерываний - PIC или APIC .
Когда внешнее устройство генерирует прерывание , контролер посылает сигнал ,
который вызывает вызов системной процедуры . Сигнал этот представляет из себя 1 байт .
Существует еще одна таблица IDT - Interrupt Descriptor Table , которая содержит адреса
этих самых стандартных прерывающих процедур . Она всегда заканчивается командой IRET .
Концепция многозадачности - одна из краеугольных в архитектуре 386 . Существует специальная таблица ,
в которой сохраняются значения всех регистров , а также доступных портов ,
в каждый момент времени . Но код для хранения этой информации должен написать программист .
Эта таблица называется Task State Structure(TSS) . Каждый процесс должен иметь свою TSS ,
у которой должен быть уникальный идентификатор , включающий адрес и размер .
Используется регистр (TR).
386 архитектура имеет 4 уровня привилегий : 0 , 1 , 2 , 3 . Еще это называется urrent Privilege Level - CPL.
Нулевой имеет максимальные привилегии на выполнение , т.е. можем выполнять любые инструкции
и обращаться к любым адресам памяти .
Ядро 0.01 использует только 2 уровня привилегий - 0 и 3 .
Все селекторы и дескрипторы ядра имеют 2 бита 00 , а все пользовательские процессы имеют 2 бита 11 .
К данным из нулевого уровня можно иметь доступ только с соответствующими привилегиями.
|
|