Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Kernels
 Boot 
 Memory 
 File system
 0.01
 1.0 
 2.0 
 2.4 
 2.6 
 3.x 
 4.x 
 5.x 
 6.x 
 Интервью 
 Kernel
 HOW-TO 1
 Ptrace
 Kernel-Rebuild-HOWTO
 Runlevel
 Linux daemons
 FAQ
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...931 
 William Gropp...916 
 Mike Perry...912 
 K&R 3...907 
 Robbins 1...905 
 Kamran Husain...904 
 Trees...904 
 Максвелл 5...903 
 Стивенс 9...902 
 Rodriguez 6...902 
 Максвелл 3...902 
 MySQL & PosgreSQL...902 
  RTMP...902 
 BTRFS...901 
 ffmpeg->tutorial...901 
 Rubni-Corbet -> Введ...901 
 Daniel Bovet 2...901 
 OS ->Intel Manual 1...901 
 Ethreal 4...901 
 Steve Pate 2...901 
 
  01.08.2023 : 3530166 посещений 

iakovlev.org
Исходники 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 . К данным из нулевого уровня можно иметь доступ только с соответствующими привилегиями.
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье