Pokusím se nastínit jak je postaven operační systém Linux.

stavba os 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

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.

Jednoduchý program v assembleru
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).

Překlad, sestavení a spuštění programu
$ 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

Zdroje a odkazy