====== 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