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
 Linux Kernel 2.6...3283 
 Trees...454 
 Clickhouse...437 
 Go Web ...429 
 Ethreal 4...424 
 Максвелл 3...385 
 Ext4 FS...384 
 C++ Patterns 3...375 
 William Gropp...363 
 Rodriguez 6...360 
 Ethreal 1...356 
 Secure Programming for Li...355 
 Gary V.Vaughan-> Libtool...354 
 Steve Pate 1...348 
 Ethreal 3...341 
 Assembler...337 
 DevFS...334 
 Стивенс 9...333 
 Ulrich Drepper...322 
 Стивенс 10...301 
 
  01.01.2024 : 3621733 посещений 

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

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

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