[[zos]]
 

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

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

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ů

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

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)

Unix, souborový systém

Unix, jádro

Unix, uživatelé a skupiny

Různá videa

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 <stdio.h>
#include <sys/types.h>
#include <dirent.h>
 
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 <stdio.h>
#include <stdlib.h>
 
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
 
zos.txt · Last modified: 2020/05/20 15:33 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki