Pokusím se nastínit jak je postaven operační systém Linux.
-
Resource management
-
scheduler (plánovač)
-
Virtual Memory Manager VMM - plánovač paměti
-
správa disků
-
časovač
-
TPM
-
-
Device Drivers (ovladače zařízení)
-
většina ovladačů je v kernelu, third party drivers jsou jenom pro speciální zařízení (např. telefonní ústředna)
-
-
Kernel libraries a filesystems
-
časté funkce jádra
-
filestem překládá uživatelské požadavky na úložiště (adresáře a soubory na sektory)
-
-
Network stack a security
-
ethernet frames, VLAN, X25, Appletalk, wireless…
-
IPv4 stack
-
IPv6 stack
-
TCP, UDP, SCTP
-
firewall
-
izolace (na uživatelské úrovni unshare, docker, chroot)
-
Kernel space je kód vykonávaný procesorem v privilegovaném režimu.
User space je kód vykonávaný procesorem v normálním (neprivilegovaném) režimu, některé instrukce procesoru nejsou k dispozici (jsou zakázané).
Přechod mezi kernel space a user space je pomocí instrukce SYSCALL na 64bitových strojích s architekturou X86_64 nebo INT 80h na 32bitových strojích architektury X86. V privilegovaném režimu může procesor provádět všechny instrukce, v normálním režimu některé instrukce není možno provádět.
Mezi privilegované instrukce patří např.:
-
řízení CPU
-
zákaz přerušení
-
práce se speciálními registry
-
práce se vstupními a výstupními zařízeními
-
nastavení mapování paměti
Podrobněji je o tom na Wikipedii pod heslem Protection Ring
Ukázka použití systémového volání na Linuxu (architektura x86_64)
Jednoduchý program "hello world" zapisuje do standardního výstupu (volá systémovou funkci write) a potom končí (volá systémovou funkci exit
Takto to funguje na Linuxu architektuře x86-64. Podrobnosti zde.
global _start
section .text
_start:
mov rax, 1 ; write(
mov rdi, 1 ; STDOUT_FILENO,
mov rsi, msg ; "Ahoj, studenti!\n",
mov rdx, msglen ; sizeof("Ahoj, studenti!\n")
syscall ; );
mov rax, 60 ; exit(
mov rdi, 0 ; EXIT_SUCCESS
syscall ; );
section .rodata
msg: db "Ahoj, studenti!", 10
msglen: equ $ - msg
-
Číslo systémového volání se ukládá do registru rax.
-
Argumenty systémové funkce se ukládají do registrů rdi, rsi, rdx, rcx, r8 a r9 v tomto pořadí.
-
Operační systém se volá instrukcí syscall
-
Návratová hodnota systémového volání je v registru rax, 0 je OK. Případná chyba je signalizována vrácením -errno (záporné číslo v rax).
$ nasm -f elf64 -o hello_studenti.o hello_studenti.s (1)
$ ld -o hello_studenti hello_studenti.o (2)
$ ./hello_studenti (3)
Ahoj, studenti! (4)
$
| 1 | Překlad pomocí assembleru nasm |
| 2 | Sestavení programu linkerem ld |
| 3 | Spuštění programu v terminálu Linuxu |
| 4 | Výstup programu. |
-
User Libraries (systémové knihovny) a auxiliary programs (pomocné programy)
-
často používané funkce (např. printf z knihovny libc) a funkce volání jádra
-
-
Běžné příkazy sytému a utility
-
login a shell (/bin/bash, /bin/sh, mc, apod.)
-
-
Graphic libraries (grafické knihovny)
-
XServer, Wayland
-
-
Display / Window / Session manager
-
session manager je grafický login
-
window manager (tmwm, lxde, KDE, Gnome)
-
display manager umí kreslit obrázky na lokálním počítači, ale aplikace běží na vzdáleném počítači
-
-
Graphic Applications (grafické aplikace)
-
browsery (Firefox, Chromium)
-
kancelářské aplikace (OpenOffice)
-
a tisíce dalších
-