130 likes | 240 Views
Advanced Operating Systems. Implementing System Calls. System Call Implementation. Under Linux system calls have 2 separate function calls The do_xxx call which does the work The sys_xxx macro which deals with arguments a call numbers. System Call Implementation.
E N D
Advanced Operating Systems Implementing System Calls
System Call Implementation • Under Linux system calls have 2 separate function calls • The do_xxx call which does the work • The sys_xxx macro which deals with arguments a call numbers
System Call Implementation System calls involve switching from user to supervisor mode through an interrrupt (0x80 on PCs) • _syscall macro generates the actual system call number (unistd.h) • Interrupt routine handles the call (arch/kernel/entry.s) • If legitimate, the routine looked up in sys_call_table[]
System Call Implementation • Some call may be traced - ie debugged calls – using the syscall_trace function • On return from system call a number of administrative tasks must be done • Send parent signals • Any pending interrupt service routines called • Signals handled
Implementing fork() & clone() • Under Linux fork() and clone() are essentially the same call with some (important) differences • Fork() create a completely new process • Clone() creates a new thread within a process
UNIX fork() creates New process environment Copies data Copies text* Copies files, locks and signals Creates new PID Linux fork() creates New process environment Makes data write protected (copies on write) Copies files, locks and signals Creates new PID Linux fork() versus traditional fork() * Text may be shared
Implementing fork() & clone() • They both call do_fork() however clone() sets up some extra parameters beforehand • Set up a new set of register and stack pointers • do_fork() is called as follows • do_fork(SIGCHILD, regs, esp, ®s); • Or • do_fork(clone_flags, newsp, ®s);
Implementing fork() & clone() • do_fork() • Creates a new stack –using kmalloc() • Gets a new process table entry • The child or thread inherits all of the parents task structure but changes some entries • Exec flag, time, signal flags
Implementing fork() & clone() • The difference between fork and clone is found at the final section of the call – when the task substructures are copied (or not!) • This copies files, file systems, signal handlers, memory management • The parent gets the child or thread pid
Fork and Clone Process 1 Process 1 Process 1 Process 1 User Space Thread Thread Kernel Kernel Space Kernel
Executable formats • Before looking at exec a word on file formats – there are a number of different formats • a.out – the original UNIX format • COFF – Common Object File Format • ELF – Executable and Linkable Format • There are others – lots of them!
Linux and file formats • Linux supports a large number of file formats – each ones is tried until one works • Done by do_exec • Use linux_binfmt • Loads binary • Loads libs • Deals with the core file • They can be load as modules
ELF e_indent e_entry e_phoff e_phentsize e_phnum ‘E’ ‘L’ ‘F’ 0x8048090 52 52 2 PT_LOAD 0 0x804800 68532 68532 PF_R, PF_X p_type p_offset p_vaddr p_filesz p_memsz p_flags Physical Header p_type p_offset p_vaddr p_filesz p_memsz p_flags PT_LOAD 68536 0x8059BB8 2200 4248 PF_R, PF_W Physical Header CODE DATA