se350 operating systems
play

SE350: Operating Systems Lecture 3: Process Management Outline - PowerPoint PPT Presentation

SE350: Operating Systems Lecture 3: Process Management Outline Safe control transfer How do we switch from one mode to the other? What should hardware provide? Native control of process Can processes create other processes?


  1. SE350: Operating Systems Lecture 3: Process Management

  2. Outline • Safe control transfer • How do we switch from one mode to the other? • What should hardware provide? • Native control of process • Can processes create other processes? • fork(), exec(), wait(), signal()

  3. Recall: Three Types of Mode Transfer • Sy Syscall ll • Process requests system service, e.g., exit • Like function call, but outside process • Process does not have address of system function to call • Like a Remote Procedure Call (RPC) – for later • OS marshalls syscall id and args in registers and exec syscall • In Inte terrupt • External asynchronous event triggers context switch, e. g., Timer, I/O device • Independent of user process • Tr Trap or exception • Internal synchronous event in process triggers context switch, e.g., protection violation (segmentation fault), divide by zero, …

  4. Implementing Safe Mode Transfers • It should be impossible for buggy or malicious user program to cause kernel to corrupt itself • Controlled transfer into kernel (e.g., interrupt vector table) • Separate kernel stack • Carefully constructed kernel code should pack up user process state and set it aside • Details depend on the machine architecture

  5. Need for Separate Kernel Stacks • Kernel cannot put anything on user stack (Why?) • Reliability: what if user program’s SP is not valid? • Security: what if other threads in user process change kernel’s return address? • Two-stack model • Kernel keeps separate stack for each thread in kernel memory (in addition to user stack in user memory)

  6. Stack Example Stack tmp = 1 Pointer ret = ext A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  7. Stack Example Stack tmp = 1 Pointer ret = ext A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  8. Stack Example Stack tmp = 1 Pointer ret = ext A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  9. Stack Example tmp = 1 ret = ext A0: A(int tmp) { Stack A1: if (tmp<2) ret = A3 Pointer A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  10. Stack Example tmp = 1 ret = ext A0: A(int tmp) { A1: if (tmp<2) ret = A3 Stack A2: B(); ret = B2 Pointer A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  11. Stack Example tmp = 1 ret = ext A0: A(int tmp) { A1: if (tmp<2) ret = A3 A2: B(); ret = B2 A3: printf(tmp); Stack tmp = 2 A4: } Pointer ret = C2 B0: B() { B1: C(); B2: } C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  12. Stack Example tmp = 1 ret = ext A0: A(int tmp) { A1: if (tmp<2) ret = A3 A2: B(); ret = B2 A3: printf(tmp); Stack tmp = 2 A4: } Pointer ret = C2 B0: B() { B1: C(); B2: } > 2 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  13. Stack Example tmp = 1 ret = ext A0: A(int tmp) { A1: if (tmp<2) ret = A3 A2: B(); ret = B2 A3: printf(tmp); Stack tmp = 2 A4: } Pointer ret = C2 B0: B() { B1: C(); B2: } > 2 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  14. Stack Example tmp = 1 ret = ext A0: A(int tmp) { A1: if (tmp<2) ret = A3 Stack A2: B(); ret = B2 Pointer A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } > 2 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  15. Stack Example tmp = 1 ret = ext A0: A(int tmp) { Stack A1: if (tmp<2) ret = A3 Pointer A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } > 2 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  16. Stack Example Stack tmp = 1 Pointer ret = ext A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } > 21 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  17. Stack Example Stack tmp = 1 Pointer ret = ext A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } > 21 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  18. Stack Example A0: A(int tmp) { A1: if (tmp<2) A2: B(); A3: printf(tmp); A4: } B0: B() { B1: C(); B2: } > 21 C0: C() { C1: A(2); C2: } • Stack holds temporary results A(1); • Permits recursive execution ext: • Crucial to modern languages

  19. Two-Stack Model Running Handling syscall Ready to run main main main Proc1 Proc1 Proc1 Proc2 Proc2 Proc2 User stack syscall syscall user CPU user CPU state state syscall handler Kernel stack I/O driver

  20. Interrupt Masking • Interrupt handler runs with interrupts off • Re-enabled when interrupt completes • OS kernel can also turn interrupts off • E.g., when determining next process/thread to run • On x86 • cli : disable interrupts • sti : enable interrupts • Only applies to current CPU (on a multicore) • We will need this to implement synchronization (more on this later)

  21. Atomic Transfer of Control Kernel handler() { pushad; Processor … } Registers PC SP Kernel stack EFLAGS foo() { while (…) { Other Regs User-level x = x + 1; EAX, EXB, y = y – 2; process … } } User stack foo …

  22. Atomic Transfer of Control (cont.) Kernel • Single instruction to handler() { • Save some registers (e.g., SP , PC) pushad; Processor … • Change PC and SP } Registers • Switch Kernel/user mode PC SP Kernel stack EFLAGS foo() { while (…) { Other Regs User-level x = x + 1; EAX, EXB, y = y – 2; process … } } Error User stack PC foo EFLAGS … SP

  23. Atomic Transfer of Control (cont.) Kernel • Single instruction to save all registers handler() { • Why is stack pointer saved twice? pushad; Processor … • Hint: are they the same? } Registers PC SP Kernel stack EFLAGS foo() { while (…) { Other Regs User-level x = x + 1; EAX, EXB, y = y – 2; process … } … } All Regs EXB EXA SP Error User stack PC foo EFLAGS … SP

  24. Kernel System Call Handler • Vector through well-defined syscall entry points! • Table mapping system call number to handler • Locate arguments • In registers or on user (!) stack • Copy arguments (copy before check) • From user memory into kernel memory • Protect kernel from malicious code evading checks • Validate arguments • Protect kernel from errors in user code • Copy results back • Into user memory

  25. At the End of Handler • Handler restores saved registers • Atomically return to (interrupted) process/thread • Restore PC, SP • Restore processor status • Switch to user mode

  26. How Does Kernel Provide Services? • You said that applications request services from the operating system via syscall, but … • I’ve been writing all sort of useful applications and I never ever saw a “syscall” !!! • That’s right • It was buried in the programming language runtime library (e.g., libc.a) • … Layering

  27. OS Run-Time Library … Proc 1 Proc 2 Proc n Compilers Web Servers Source Code Control OS Databases Word Processing Web Browsers Email Portable OS Library Proc 1 Proc 2 Proc n System Call … Interface Portable Operating System Kernel OS OS OS x86 ARM PowerPC Library Library Library 10Mbps/100Mbps/1Gbps Ethernet 802.11 a/b/g/n SCSI IDE OS Graphics Accelerators LCD Screens

  28. Kernel to User Mode Switch • New process/new thread start • Jump to first instruction in program/thread • Return from interrupt, exception, system call • Resume suspended execution • Process/thread context switch • Resume some other process • User-level upcall (UNIX signal ) • Asynchronous notification to user program • Preemptive user-level threads • Asynchronous I/O notification • Interprocess communication • User-level excepting handling • User-level resource allocation

  29. Putting it Together: Web Server Request Reply (retrieved by web server) Client Web Server

Recommend


More recommend