Парчета код, които управляват хардуера
Позволяват изпълнението на потребителски програми
Има ги разни (Windows/Linux/OS X)
Ядрото (duh) на операционната система
Има пряк достъп до всичко в компютъра ви
Грижи се за потребителските програми
Парчета код в ядрото, които управляват конкретен хардуер
Могат да се слагат отделно от ОС-а
"GNU" частта от "GNU/Linux"
Полезните програмки, без които една ОС е безполезна
Текстови редактори, web browser-и, терминали, графични среди, etc
Userland частта вървят в първото
Kernel-a върви във второто
Това е грубо казано, демек е омешано, но така е в общия случай
Няма общо с root (Linux)/Administrator (Windows)
Защо е това разделение?
Сигурност: между отделните процеси, както и между тях и ядрото
Това са потребителските програми
Всеки е разделен от всички останали
Всеки има свое виждане за паметта
Паметта, до която имат достъп процесите
Те НЯМАТ достъп до истинските адреси във физическата памет
Всеки процес има собствена като те не се застъпват
Всеки процес има право да достъпи пълното адресно пространство
Виртуалната памет може да не е във физическата (swap file, memory mapped files, etc)
През така наречените System Calls
Това са обикновени функции, които можем да викаме
Намират се в стандартната С блиотека, която върви с всяка ОС
Те вътрешно ще направят магията
Магията се нарича interrupt-и
Начин да кажем на ядрото, че искаме нещо да се случи (sys call)
Както и начин на процесора да каже на ядрото, че нещо е станало (timer interrupt)
Всеки процес, очевидно, има изпълним код
Stacks, heeps, read-only segments
Отделно има и mapped files, etc
Съдържа кода на приложението
Може да съдържа кода на външни библиотеки
Или просто имената на тези външни зависимости
Примерна зависмист е стандартната С библиотека
Чрез компилация и линкване
Компилацията превежда отделен файл с програмен код към машинни инструкции
Линкването "свързва" отделни компилирани единици
Какво правим с външни зависимости, които не са наш код?
Като например printf от стандартната С библиотека?
Когато кодът на нужните библиотеки е в изпълнимия файл
В изпълнимия файл има единствено имена на библиотеки и функции
Пример: libc.so:printf или msvcrt.dll:printf
ОС-а се грижи да "зареди" библиотеката и да навърже адресите
По-големи изпълними файлове при статично линкване
Малко по-бързо изпъленение при статично линкване
Няма споделяне на код в обща библиотека при статично линкване