Skip to content

Instantly share code, notes, and snippets.

@nu11secur1ty
Created December 18, 2016 21:30
Show Gist options
  • Save nu11secur1ty/e7ad7ca9bd5391727c8e513250839eec to your computer and use it in GitHub Desktop.
Save nu11secur1ty/e7ad7ca9bd5391727c8e513250839eec to your computer and use it in GitHub Desktop.

Ядра

В компютърния свят, ядрото е фундаментална част от операционната система. То е част от софтуера, отговорен за предоставянето на сигурен достъп на програмите до хардуера на машината. Тъй като има много програми и достъпът до хардуера е ограничен, ядрото е също отговорно за решаването кога и колко дълго една програма ще бъде допусната да използва част от хардуера. Осигуряването на директен достъп до хардуера може също така да бъде много сложно, затова ядрата обикновено имплементират серия от хардуерни абстракции. Тези абстракции са начин, чрез който се скрива сложността, и се доставя ясен и непроменлив интерфейс към подлежащия хардуер, което улеснява живота на програмистта. Има четири вида ядра:

Монолитните ядра осигуряват богата и мощна абстракция от хардуера
Микро ядрата осигуряват малка серия от прости хардуерни абстракции и използват програми наречени драйвери, за да се сдобият с повече функционалност
Хибридните ядра са почти като микро ядрата, с изключение на това, че имат повече код в ядрото и затова са по-бързи
Външните ядра не предоставят никакви абстракции, но позволяват използването на библиотеки, за да се добави повече функционалност посредством директен или почти директен достъп до хардуера

Монолитни ядра

Монолитния подход дефинира интерфейс от високо ниво върху хадруера, заедно с набор от примитиви и системни извиквания, за да се инплементират системни услуги като мениждмънт на процесите, успоредност и мениждмънт на паметта, в няколко модула, които се изпълняват с правата на суперюзъра(root). Макар че всеки модул обслужващ тези операции е отделен като цяло, интеграцията на кода е много тясна и се постига трудно, и тъй като всички модули се изпълняват в едно пространство – това на ядрото – бъг в един от тях може да въвлече със себе си цялата система. Обаче, когато имплементацията е пълна и надеждна, тясната интеграция на компонентите позволява особеностите на ниско ниво на основната система да се използват ефективно, което прави едно добро монолитно ядро високо ефективно. Повечето модерни монолитни ядра като Линукс и FreeBSD ядрата могат да зареждат допълнителни бинарни модули по време на работата си, позволявайки лесно разширяване на възможностите на ядрото при нужда. Примери за монолитни ядра:

Традиционните UNIX ядра, такива като ядрата на BSD
Линукс ядрото

Микро ядра

Подходът на микро ядрото се състои в дефинирането на много проста абстракция над хардуера с набор от примитиви и системни извиквания, за да се имплементира минимални услуги като мениждмънт на нишки, адресни пространства и комуникация между процеси. Главната цел е разделянето на основните имплементации на услугите от основните компоненти на системата. Например, процеса на заключване на ВХОДА/ИЗХОДА(Input/Output; I/O) може да бъде имплементиран в отделен сървърен модул, който ще се изпълнява над ядрото. Тези сървърни модули, които изпълняват задачи от системата от по-високо ниво, са модулни и опростяват структурата и дизайна на ядрото. Ако някой модул не работи както трябва това не разваля цялата система. По този начин този малък модул може да бъде рестратиран независимо от другите модули. Примери за микро ядра:

AIX
Contiki
L4 microkernel фамилията
Mach, използван в GNU Hurd и MacOS X
Minix
MorphOS
QNX
RadiOS
BeOS
VSTa

Монолитни ядра срещу микро ядра

Монолитните ядра се предпочитат повече от микро ядрата, заради по-ниското ниво на сложност за бораване с целия код контролиращ системата в едно адресно пространство. Монолитните ядра са склонни да бъдат проектирани правилно и по този начин могат да се разрастнат по-бързо отколкото една система с микро ядро. Успехи има и в двата вида ядра. Микро ядрата са по-често използвани във вградени роботни или медицински компютри, защото по-голямата част от компонентите на ОС-а се намират в тяхна лична защитена памет. Това не е възможно при монолитните ядра, даже и с модерните, които могат да зареждат динамично модули. Въпреки че Mach е най-доброто микро ядро, няколко други микро ядра са разработени със специални цели. L3 е бил разработен, за да демонстрира, че микро ядрата не са задължително бавни. L4 e последоватеят на L3 и известна негова имплементация наречена Fiasco може да изпълнява Линукс заедно с другите процеси в собствени адресни пространства. Съществуват шотове на freshmeat.net показващи това. QNX е операционна система, която съществува от ранните 80-сте и има много минималистичен дизайн на микро ядрото. Тази система е далеч по-успешна от Mach в постигането на целите на парадигмата на микро ядрото. Тя се използва в ситуации, където на софтуерът не му е позволено да пропада. Това включва автоматичните ръце на совалките, където една грешка може да струва стотици хиляди долари.

Хибриди

Хибридните ядра като цяло са микро ядра, които имат малко код, разположен в ядрото, който не е основен, но е добавен, за да може някои неща да се изпълняват по-бързо, отколкото ако е в потребилтелското пространство. Това е бил компромис направен в ранните адаптации на микро ядрата преди да бъде показано, че истинските микро ядра също може да са много бързи. Повечето модерни операционни системи влизат в тази категория – Windows бъдейки най-известния пример. XNU, ядрото на Mac OS X, е също модифицирно микро ядро, поради включване на код от BSD ядрото в Mach ядрото. DragonFly BSD е първото BSD, което не е базирано на Mach ядрото, което ще адаптира хибридно ядро. Примери за хибридни ядра:

Microsoft Windows NT
XNU
DragonFly BSD
ReactOS

Екзо ядра/Външни ядра

Външните ядра, също известни като вертикално структурирани операционни системи, са нов и твърде радикален подход към дизайн на операционната система. Идеята зад това е разработчикът да направи всичи решения, за действието на хардуера. Външните ядра са изключително малки като размер, тъй като те лимитират тяхната функционалност до защитата и разпределението на ресурсите. Класическите дизайни на ядрото(монолитните и микро) скриват хардуера, скривайки ресурсите под абстрактен хардуерен пласт. При тези класически системи, ако физическа памет бъде заделена, не може да се каже къде е нейното точно местоположение. Целта на външното ядро е да позволи на програмите да заявят определена част от паметта, определен блок от диска и така нататък, и просто да се уверят, че поисканият ресурс е свободен, и че програмата може да го използва. Някои теоритични последици от система с външно ядро е, че може да съществуват няколко вида операционни системи(Windows, Linux, Unix), които се изпълняват под едно външно ядро, и разработчикът може да избира да незачита или да разширява функционалността поради технически характеристики на бързодействие. В момента, външните ядра в по-голямата си част са научно изследване и не се използват в нито една от главните комерсиални опрерационни системи. Една концептуална операционна система е Namesis, написана от Университета на Каймбридж(University of Cambridge), Университета на Глазгоу, Цитрикс Системс и Шведския Институт по Компютърна наука. MIT(Масачузетския Институт по Технологии) също е изградил няколко системи базирани на външни ядра.

Линукс Ядрото

Линукс ядрото е свободно Unix-подобно ядро създадено от Линус Торвалдс през 1991 и в последствие се е подобрило с помощта на много разработчици по целия свят. Първоначално е разработено за Intel 386 процесора, но оттогава е портнато за много други платформи. То почти е написано изцяло на C с малко GNU C разширения и малко асемблер. Разработван под GPL лиценза, сорс кода на Линукс е свободно достъпен за всеки. Ядрото е най-известния пример за свободен софтуер и разработка на отворен код. Дистрибуции на софтуер базиран на това ядро са наричат Линукс дистрибуции.

История

Проектът е започнат през 1991 с известния вече пост в Usenet нюзгрупата comp.os.minix, което включва изречението:

"I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones..." По това време GNU проекта е бил създал много от компонентите, необходими за една свободна ОС, но собственото им ядро – GNU Hurd – не е било готово. И тогава, и сега, BSD операционната система все още не е освободена от легални спънки. Това е оставило дупка за Линукс ядрото и макар с ограничено количество функционалност, то бързо привлякло разработчици и потребители. В началото, Миникс хакери спомогнали с код и идеи на Линус, и днес ядрото се развива със светкавична скорост. Първоначално, “Линукс” e било името на ядрото. Термина “ядро” се отнася за софтуера от ниско ниво, който предоставя слоя на хардуерно абстрахиране, контрол върху файловата система, мултитаскинг, load-balancing, мрежа и система за сигурност. Едно ядро не е цялостна операционна система. Една цялостна система е изградена върху Линукс ядрото, която се подвизава по-често под името Линукс ОС, макар че някои наричат системата GNU/Linux и тук има малко неразбирателство по този въпрос. Хората често бъркат ядрото с операционната система, което води до мното недоразумения.

Версии

Торвалдс продължава да пуска нови версии на ядрото, обединявайки приноса на други програмисти и естествено неговия. Всички Линукс версии, които завършват на четно число се смятат за стабилни – 1.0.x, 1.2.x, 2.0.x, 2.2.x, 2.4 и текущата 2.6.x; версии с нечетни числа, като например 2.5.x, са нестабилни версии. Докато Линус продължава да пуска последните текущи версии на ядрото, поддръжката на по-старите стабилни ядра се предава на други – David Weinehall (2.0), Alan Cox и после на Marc-Christian Petersen (2.2), Marcelo Tosatti (2.4) и Andrew Morton (2.6). В допълнение на тези официални ядра, алтернативни ядра могат да се намерят от други места. Дистрибутори на цели операционни системи обикновено поддържат техни собствени версии на ядрото, за да може да включват допълнителни драйвери, които все още не са одобрени в официалното ядро.

Стабилни версии

Версия 1.0 през Март 1994 поддържало само еднопроцесорни i386 машини.
Версия 1.2 през Март 1995 добавило поддръжка за Alpha, Sparc и Mips.
Версия 2.0 през Юни 1996 добавило поддръжка за повече от 1 процесор и добавило SMP поддръжка.
Версия 2.2 през Януари 1999.
Версия 2.4 през Януари 2001 добавило ISA Plug-and-Play, USB и PC Card поддръжка. Поддръжка за Axis Communications' ETRAX CRIS ("Code Reduced Instruction Set") процесори и InterMezzo файловата система.
Версия 2.6 на 17-ти Декември 2003
    интегриран uClinux (за микроконтролери)
    CPU поддръжка: за Hitachi's H8/300 сериите, NEC v850, и вградените процесори на Motorola m68k), NUMA поддръжка, поддръжка за Voyager архитектурата на NCR и NEC PC-9800, поддръжка на hyperthreading на Интел и PAE ("Physical Address Extension")
    OS поддръжка: за SGI XFS файловата система. Подобрена поддръжка на APIC. Увеличен максимума на потребители и групи от 65,000 на над 4 милиарда. Увеличен броя на ID-та на процесите от 32,000 на 1 милиард. Увеличен броя на видовете устройства от 255 на 4095 и максималния брой устройства от всеки вид от 255 на повече от милион. Подобрена 64-битова поддръжка и файлови системи до 16 терабайта на обикновен хардуер. Подобрения на "цялостната производителност" за интерактивни процеси (поддръжка на ядрото да бъде preemptible и I/O scheduler-а е напълно пренаписан). Поддръжка за futexes, пренаписа е инфраструктурата за нишки, за да позволи използването на Native POSIX Thread Library (NPTL). Подобрен лоудър за модули. Нова файлова система "system filesystem" наречена sysfs. User Mode Linux ентеграция.

Архитектура

Линукс ядрото поддържа истински мултитаскинг, виртуална памет, споделени библиотеки, споделени copy-on-write изпълними файлове, мениджмънт на паметта и поддръжка на TCP/IP. Днес Линукс е монолитно ядро с възможността да се зареждат модули. Драйверите за устройствата и разширенията на ядрото по принцип се изпълнавят в ring 0, с пълен достъп до хардуера, въпреки това има някои, които се изпълняват в потребителското пространство. За разлика от стандартните монолитни ядра, драйверите могат лесно да бъдат конфигурирани като модули и да бъдат зареждани и отзареждани докато системата работи.

Преносимост/Портативност

Макар че първоначално Линукс да не е бил замислена като портативна операционна система, в момента тя е най-портативната операционна система (въпреки че, NetBSD е портнат за повече системи), която работи на системи като iPAQ (джобен компютър) чак до IBM S/390 ( масивен, много скъп мейнфрейм). Линукс е замислен за бъде главната операционна система на новия суперкомпютър на IBM - Blue Gene.

В момента Линукс върви на тези архитектури:

ARM
    Acorn: Archimedes, A5000и RiscPC сериите
    StrongARM, Intel XScale т.н....
    HP's iPAQ
Axis Communications' CRIS
Hewlett Packard's Alpha
Hewlett Packard's PA-RISC
Hitachi: SuperH (SEGA Dreamcast), H8/300
IA-64: Компютри с 64-битов Intel Itanium
IBM's S/390
IBM's zSeries Мейнфреймове
Intel 80386 и нагоре:
    80386, 80486, и техните AMD, Cyrix, TI и IBM варианти;
    цялата Pentium серия;
    AMD 5x86, K5, K6, Athlon (всички 32-битови версии), Duron;
    AMD64: AMD's 64-битова процесорна технология (преди известна като x86-64)
    Cyrix 5x86, 6x86 (M1), 6x86MX и MediaGX (National/AMD Geode) сериите;
    VIA Technologies VIA C3 и по-късни процесори;
    Поддръжка за 8086, 8088, 80186, 80188 и 80286 процесорите е в разработка;
MIPS
Motorola 68020 и нагоре
NEC v850e
PowerPC и IBM POWER
SPARC и UltraSparc: Sun 4-сериите, SPARCstation/SPARCserver, Ultra, Blade и Fire сериите работни станции и сървъри, също така и клонинги направени от Tatung и други.

Ядрото

Сорс кодът на Линукс ядрото може да бъде свалено от kernel.org. За да приготвите едно ядро за ползване, изпълнете тези команди:

make config за да конфигурирате каква поддръжка да има вградена(може да изоплзвате също make menuconfig, make xconfig, make gconfig).
make за да го компилирате
make modules_install за да компилира модулите и да ги премести в правилната дирeктория (обикновено /lib/modules).
make install за да копира ядрото на нужното място и да обнови буут мениджъра (Lilo или GRUB)

Лицензи

Първоначално, Торвалдс е пуснал Линукс под лиценз, който забранявал всякакво комерсиално използване. Това скоро било променено на GPL v2. Този лиценз позволява диструбицията и даже продажбата на модифицирани версии на Линукс, но всички копия трябва да бъдат пуснати под същия лиценз и да бъдат придружени със сорс кода. Линус определя лицензирането на Линукс под GPL като "най-доброто нещо, което някога съм правил."

Талисман

Талисманът на Линукс е пингвин наречен Tux, създаден от Larry Ewing.

Kernel panic

При Линукс, "panic" е невъстановима системна грешка, открита от ядрото. Ядрото може да предприеме такова състояние като извика "panic" функцията, която се намира в хедър файла sys/systm.h. Въпреки това, повечето "panics" са резултат от неуправляеми процесорни изключение в кода на ядрото, такива като справки до невалидни адреси в паметта.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment