====== Literatura ====== Skripta Vysoké školy báňské http://projekty.fs.vsb.cz/463/edubase/VY_01_043 soubor Operační systémy.pdf Andrew S. Tanenbaum: Operating Systems Design and Implementation William Stallings: Operating Systems: Internals and Design Principles Abraham Silberschatz, Peter B. Galvin, Greg Gagne: Operating System Concepts http://codex.cs.yale.edu/avi/os-book/ Randal E. Bryant and David R. O'Hallaron: Computer Systems: A Programmer's Perspective, 2/E http://csapp.cs.cmu.edu/2e/samples.html ====== Minulé příklady ====== [[FileHandles|File Handles]] [[CreateProcess|Create Process]] [[zos_createprocess|Simple Create Process]] Program Linking http://csapp.cs.cmu.edu/2e/ch7-preview.pdf ====== Procesy a vlákna ====== Procesy http://www.tutorialspoint.com/operating_system/os_processes.htm Plánování procesů https://www.tutorialspoint.com/operating_system/os_process_scheduling.htm \\ ( Long Term Scheduler az Comparison among Scheduler můžete přeskočit, **Context Switch** doporučuji prečíst ) Vlákna https://www.tutorialspoint.com/operating_system/os_multi_threading.htm === Videa === Můžete se podívat na jednoduchý uvod http://www.youtube.com/watch?v=fxMOi7BlTyM Nebo na klasickou přednášku http://www.youtube.com/watch?v=LNiNOW-_8lw Process management http://www.youtube.com/watch?v=elzvHG6M-eU Threads http://www.youtube.com/watch?v=4kfiQEA7Qj8 === Kompletní přednášky podle knihy Operating System Concepts === Chapter 6: CPU Scheduling, part 1 http://www.youtube.com/watch?v=Nq5LwpgXY6o Chapter 6: Processes, part 2 http://www.youtube.com/watch?v=0hjn5k5rN-Y ====== Synchronizace procesů ====== :-) [[http://projekty.fs.vsb.cz/463/edubase/VY_01_043/Opera%C4%8Dn%C3%AD%20syst%C3%A9my/02%20Text%20pro%20e-learning/Opera%C4%8Dn%C3%AD%20syst%C3%A9my%2005.pdf|skripta - synchronizace]] :-) [[http://projekty.fs.vsb.cz/463/edubase/VY_01_043/Opera%C4%8Dn%C3%AD%20syst%C3%A9my/02%20Text%20pro%20e-learning/Opera%C4%8Dn%C3%AD%20syst%C3%A9my%2006.pdf|skripta - uváznutí procesů ]] Úvod - synchronizace http://www.geeksforgeeks.org/introduction-of-process-synchronization Semafory http://www.geeksforgeeks.org/semaphores-in-process-synchronization/ === Semafory - videa === Introduction to Semaphores http://www.youtube.com/watch?v=e2ujg5K310s === Uváznutí procesů - videa === Deadlock http://www.youtube.com/watch?v=x9FF723STvo Deadlock Avoidance with Resource Allocation Graph, **od 9min40sec** https://www.youtube.com/watch?v=nDDytwtIMXE Resource Allocation Graph http://www.youtube.com/watch?v=-VksGXfiK7k === Kompletní přednášky podle knihy Operating System Concepts === Chapter 5: Process Synchroninzation http://www.youtube.com/watch?v=RDovfnKH6lU Chapter 7: Synchronization http://www.youtube.com/watch?v=0RpzPerKSX0 ====== Správa paměti ====== :-) [[http://projekty.fs.vsb.cz/463/edubase/VY_01_043/Opera%C4%8Dn%C3%AD%20syst%C3%A9my/02%20Text%20pro%20e-learning/Opera%C4%8Dn%C3%AD%20syst%C3%A9my%2002.pdf|skripta - správa paměti]] Memory management http://www.tutorialspoint.com/operating_system/os_memory_management.htm ( Dříve používané segmenty http://www.geeksforgeeks.org/memory-segmentation-8086-microprocessor ) Virtual memory http://www.tutorialspoint.com/operating_system/os_virtual_memory.htm Virtual memory http://csapp.cs.cmu.edu/2e/ch9-preview.pdf === videa === Virtual Memory http://www.youtube.com/watch?v=ujoJ7J_l9cY Memory Management Using Paging http://www.youtube.com/watch?v=kt4LkPFt8Zg Page Fault in Virtual Memory http://www.youtube.com/watch?v=kt4LkPFt8Zg Page replacement, **prvních 11 minut** http://www.youtube.com/watch?v=FWoMSiMep80 === videa - Virtual Memory - David Black-Schaffer === ( Virtual Memory: 1 Introduction http://www.youtube.com/watch?v=qcBIvnQt0Bw ) ( Virtual Memory: 2 Three problems with Memory http://www.youtube.com/watch?v=eSPFB-xF5iM ) Virtual Memory: 3 What is Virtual Memory http://www.youtube.com/watch?v=qlH4-oHnBb8 Virtual Memory: 4 How Does Virtual Memory Work http://www.youtube.com/watch?v=59rEMnKWoS4 :-) Virtual Memory: 5 Page Tables http://www.youtube.com/watch?v=KNUJhZCQZ9c Virtual Memory: 6 Address Translation http://www.youtube.com/watch?v=ZjKS1IbiGDA Virtual Memory: 7 Address Translation Example http://www.youtube.com/watch?v=6neHHkI0Z0o Virtual Memory: 8 Page Faults http://www.youtube.com/watch?v=bShqyf-hDfg Virtual Memory: 9 Memory Protection http://www.youtube.com/watch?v=uDzXXnNy544 Virtual Memory: 10 Making Virtual Memory Fast http://www.youtube.com/watch?v=uyrSn3qbZ8U Virtual Memory: 11 TLB Example http://www.youtube.com/watch?v=95QpHJX55bM === Kompletní přednášky === Chapter 8: Main memory, part 1 http://www.youtube.com/watch?v=Jy_teuaj7Ic Chapter 8: Main memory, part 2 http://www.youtube.com/watch?v=8Zw4gIqqZe0 Chapter 8: Main memory, part 3 http://www.youtube.com/watch?v=gUSOVZK7PaU Chapter 9: Virtual Memory http://www.youtube.com/watch?v=KTx9RNfyFO8 "slidy" z knihy naleznete na http://www.os-book.com/OS10/slide-dir/index.html ====== Soubory zobrazované do paměti (memory mapped files) ====== [[mmap|Memory Mapped Files]] Windows CreateFileMapping, MapViewOfFile http://www.labri.fr/perso/betrema/winnt/manamemo.html ( Linux mmap http://www.tutorialspoint.com/inter_process_communication/inter_process_communication_memory_mapping.htm ) ( Win32 shared memory http://docs.microsoft.com/en-us/windows/win32/memory/creating-named-shared-memory ) ====== Unix, souborový systém ====== http://www.tutorialspoint.com/operating_system/os_file_system.htm Souborový systém http://www.tutorialspoint.com/unix/unix-file-system.htm Přístupová práva http://www.tutorialspoint.com/unix/unix-file-permission.htm ====== Unix, jádro ====== http://www.oreilly.com/library/view/understanding-the-linux/0596002130/ch01s06.html http://www.tutorialspoint.com/operating_system/os_linux.htm ( http://www.pearsonhighered.com/assets/samplechapter/0/1/3/0/0130187062.pdf ) ( http://www.geeksforgeeks.org/introduction-of-system-call ) ====== Unix, uživatelé a skupiny ====== http://www.tutorialspoint.com/unix/unix-user-administration.htm http://www.linode.com/docs/tools-reference/linux-users-and-groups ( http://www.pluralsight.com/blog/tutorials/linux-add-user-command ) ====== Různá videa ====== http://www.youtube.com/playlist?list=PLdo5W4Nhv31a5ucW_S1K3-x6ztBRD-PNa ====== Přístupová práva k unixovým souborům ====== Zde jsou popsána přístupová práva read, write, execute http://cs.wikipedia.org/wiki/P%C5%99%C3%ADstupov%C3%A1_pr%C3%A1va_v_Unixu \\ http://en.wikipedia.org/wiki/File_system_permissions#Traditional_Unix_permissions Myslím, že přístupová práva pro soubory jsou jasná. Podívejme se na read a execute pro adresáře. Přístupová práva pro adresáře: * r - vypsat soubory v adresáři * w - přidat nebo vymazat soubor nebo adresář * x - vstoupit do podresáře pomocí "cd, change directory" Vytvoříme si adresář, ve kterému "ostatní" uživatelé mají jen právo read ll /src drwxr-xr-- 2 inst inst 4096 May 12 13:51 test V tomto adresáři uživatel se jménem "inst" vytvoří soubor "test.txt" ll /src/test -rw-r--r-- 1 inst inst 10 May 12 13:51 test.txt ===== Konzolové příkazy v Linuxu ===== Jinému uživateli, který ani nepatří do skupiny "inst" se nepodaří ani vypsat adresář ll /src/test ls: cannot access '/src/test/test.txt': Permission denied total 0 -????????? ? ? ? ? ? test.txt Ani zobrazit obstah souboru cat /src/test/test.txt cat: /src/test/test.txt: Permission denied Je to divné: pro adresář i soubor mám právo **read**. \\ Do adresáře pomocí **cd** nevstupuji, tak bych **execute** pro adresář neměl potřebovat. ===== Výpis adresáře v jazyce C ===== V dokumentaci knihovny jazyka C, glibc, používané v Linuxu naleznu program pro výpis adresáře. http://www.gnu.org/software/libc/manual/pdf/libc.pdf \\ * 14.1 Working Directory, getcwd, chdir * 14.2 Accessing Directories * 14.2.2 Opening a Directory Stream. opendir * 14.2.4 Simple Program to List a Directory #include #include #include int main (void) { DIR *dp; struct dirent *ep;dp = opendir ("/src/test"); if (dp != NULL) { while (ep = readdir (dp)) puts (ep->d_name); closedir (dp); } else { perror ("Couldn't open the directory"); } return 0; } Program přeložím příkazem gcc list.cc -lc -o list.bin A program zobrazí jméno souboru "test.txt" ===== Program v jazyce Python ===== Zobrazí obsah adresáře. Ale nezobrazí obsah souboru. from __future__ import print_function import os for t in os.listdir ("/src/test") : print ("FILE", t) f = open ("/src/test/test.txt", "r") print (f.read ()) f.close () ===== Obsah souboru - program jazyce C ===== Ani program v jazyce C nezobrazí obsah souboru #include #include int main () { FILE * f = fopen ("/src/test/test.txt", "rb"); if (f != NULL) { fseek(f, 0, SEEK_END); long fsize = ftell(f); fseek(f, 0, SEEK_SET); /* same as rewind(f); */ char * text = (char *) malloc (fsize + 1); fread (text, 1, fsize, f); fclose(f); text [fsize] = 0; printf ("%s", text); } else { perror ("Couldn't open the file"); } return 0; } ==== Toaru OS ==== Zkusme se podívat na přistupová práva v jednoduchém OS. http://toaruos.org/ \\ http://github.com/klange/toaruos/releases Zde jsou jednotlivá systémové funkce http://github.com/klange/toaruos/blob/master/kernel/sys/syscall.c Např. **sys_read** kontroluje přistupová práva if (!(FD_MODE(fd) & 01)) { Nebo **sys_write** if (!(FD_MODE(fd) & 02)) { Makro **FD_MODE** kontroluje přístupová práva, která si systém poznamenel při otevření souboru int sys_open(const char * file, int flags, int mode) { if (!(flags & O_WRONLY) || (flags & O_RDWR)) { if (node && !has_permission(node, 04)) { return -EACCES; } else { access_bits |= 01; } } if ((flags & O_RDWR) || (flags & O_WRONLY)) { if (node && !has_permission(node, 02)) { return -EACCES; } } else { access_bits |= 02; } } /* ... */ } Funkce **has_permission** \\ http://github.com/klange/toaruos/blob/master/kernel/fs/vfs.c#L29 int has_permission (fs_node_t * node, int permission_bit) { if (!node) return 0; if (current_process->user == 0 && permission_bit != 01) { /* even root needs exec to exec */ return 1; } uint32_t permissions = node->mask; uint8_t user_perm = (permissions >> 6) & 07; uint8_t other_perm = (permissions) & 07; if (current_process->user == node->uid) { return (permission_bit & user_perm); } else { return (permission_bit & other_perm); } } Funkci **has_permission** ještě nalezneme v souboru kernel/fs/vfs.c \\ http://github.com/klange/toaruos/blob/master/kernel/fs/vfs.c#L354 ===== Opravdový Linux ===== Přístupová práva kontroluje funkce **inode_permission** \\ https://elixir.bootlin.com/linux/latest/source/fs/namei.c#L425 Systémová funkce **ksys_chdir** pro změnu aktuálního adresáře \\ http://elixir.bootlin.com/linux/latest/source/fs/open.c#L453 \\ kontroluje **execute** právo. int ksys_chdir (const char __user *filename) { /* ... */ error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); /* ... */ } Ostatní systémové funkce https://elixir.bootlin.com/linux/latest/source/include/linux/syscalls.h#L431 ===== Úkoly ===== Vyberte si **jeden** úkol a pokuste se odpovědět * Popište kdy potřebujeme **execute** právo pro adresáře ( a mohou se mírně lišit informace získané experimentem a z různých popisů ) * Jedoduchý systém ToaruOS nepracuje s právy pro skupinu, navrhněte kousek programu, který práva skupiny zkontroluje. * Zkuste slovy vysvětlit komentář v ToaruOS: /* even root needs exec to exec */ * Zkuste najít ve zdrojovém textu Linuxu další místa kde se kontrolují přístupová práva