260 likes | 384 Views
제 24 강 : Process Image. Quick look at pdp-11 CPU. Chapter Two CPU registers. Two kinds of stack Case: Fixed size Case: Variable size SP : Stack Pointer SP : Stack Pointer EP : Environment Pointer (boundary or size) Stack & Function call frame
E N D
제24강 : Process Image Quick look at pdp-11 CPU
Chapter TwoCPU registers • Two kinds of stack • Case: Fixed size Case: Variable size • SP: Stack Pointer SP: Stack Pointer EP: Environment Pointer (boundary or size) • Stack & Function call frame Call argument Local variable Return address Register save top - SP top - SP pop this portion main() { x= sin (arg); - - - y= sin (arg); } sin (arg); { local var; expression; return; } EP bottom bottom
pdp-11 CPU has 2 SP’s user stack Base main() do_a() do_b() read() main() do_a() do_b() read() ls SP sys call kernel stack Base read() do_p() do_q() do_r() kernel read() do_p() do_q() do_r() SP
PAR 2000 2500 3000 Why pdp-11 needs MMU(memory management unit) Physical Address Memory CPU Protection (multi-user) prevent R/W/Jump to other process’ image confine memory access intercept faulty access Scattered Allocation image can be scattered Allow Relocation during swapping, not on-demand paging VA loc 0 PA loc 2000 MMU Memory CPU Mapping Table for a.out PAR: Page Address Register (maps VA to PA)
PAR 2000 2500 3000 PDR read write • Physical memory was divided up into 8K byte pages • memory space/process = 64Kbytes = 8 pages • Max 8 PAR’s per process • Access mode (R|W|...) per page PDR (Page Description Register) & PAR Pair • Allocate contiguous chunk of physical memory for each process Split up this chunk into 3 pieces text data areas stack • Unix may have used just three PAR|PDR’s contiguous pages 0 X text 1 X 2 W 3 W data 4 W 5 W 6 7 W stack PAGES
2 sets of memory mapping registers Memory PAR PDR kernel a.out < KERNEL> vi a.out PAR PDR sh a.out <activeUSER >
Remember?Kernel has PCB for each application Kernel a.out sh vi mail user PCB PCB K-stack proc Hardware CPU mem disk tty CPU mem disk tty
ls vi sh Kernel’s PCB in detail logical address struct user & k-stack share single page kernel PCB(sh) PCB(vi) PCB(ls) user 1 page / process “ppda” (per process data area) user kernel stack K-stack proc proc [NPROC] user K-stack proc vi sh ls
Kernel’s PCB layout logical address kernel proc[ ] 1 global array for all processes u stack 1 page per each process (ppda) u stack u stack user kernel stack vi sh ls
scatter ppda in physical address space logical address physical address logically contiguous physically scattered adjacent to application’s image kernel proc kernel proc u stack u stack u stack u stack (ppda) 1 page per process vi u stack sh vi sh u stack ls ls
each proc[ ] points to application’s ppda logical address physical address kernel proc kernel proc u stack ppda address struct proc { p_addr; p_size; } u stack u stack u stack size of swappable vi u stack sh vi sh u stack ls ls
Logical Address Physical Address loc. 0 kernel a.out proc[0] proc[i] proc[k] kernel a.out proc[0] proc[i] proc[k] = 10000 = 20000 = 30000 loc. 0 20000 ppda vi a.out u stack vi ppda 30000 u stack sh sh a.out 50000 ppda u stack ls
2 sets of {PAR|PDR} PAR PDR struct user k-stack Kernel a.out < KERNEL> PAR PDR struct user k-stack vi a.out u--stack <Active USER > struct user k-stack sh a.out u--stack
Kernel’s 7th PAR active user’s ppda PAR PDR struct user k-stack kernel 7th mapping register Points to active process ppda (7-3-1-b) Hence, in Lion’s code “u ” always points to struct user of the current active process (cf. proc[PID]) Kernel a.out < KERNEL> PAR PDR struct user k-stack vi a.out u--stack <Active USER > struct user k-stack sh a.out u--stack
proc[i].p_addr is address of process i’s ppda struct user image 7-th reg == ppda of active process struct user k-stack PAR PDR Kernel Proc[0] Proc[i] Proc[k] < KERNEL> struct user k-stack PAR PDR vi a.out u--stack struct user k-stack < USER > sh a.out u--stack
struct user k-stack PAR PDR Kernel a.out sh (parent) ls (child) struct user k-stack sh a.out At this point, context switch: Kernel 7th PAR points to new ppda -------- User PAR/PDR also changes estabur() sureg() u--stack PAR PDR struct user k-stack ls a.out u--stack < USER >
User a.out Kernel a.out Data Segment (swappable) Process sh Process vi Process ls 7-th page user user user user PPDA (7-th page) K-stack K-stack K-stack kernel stack PROC[ ] proc proc proc “ppda” (per process data area) kernel space 7-th kernel page CPU mem disk CPU mem disk * (7-2, 7-3) address of 7-th kernel page (ppda) address of active process
Process Image proc[i] p_addr (7-th kernel page) struct user k-stack ppda Swappable Image (data segment) Process Image text data bss p_size a.out u-stack bss: allocated at load time, init to zero struct user: located adjacent to program segment but is part of kernel address space
7-th page user • data segment (swappable image) (7-3) • allocated as one single segment (physically contiguous – for swap) • ppda (per process data area) (7-3) • 7th page of kernel • lower end -- struct "user“ • higher end -- kernel mode stack • proc[PID].p_addr, p_size (7-2) • address of process (swappable image) (whether in core or disk) • 7-th kernel (segmentation address) register points to <= proc[i].p_addr (address of the process) kernel stack
Logical Address Physical Address PAR PDR loc. 0 kernel a.out proc[0] proc[i] proc[k] 10000 kernel a.out proc[0] proc[i] proc[k] = 10000 7-th page = 20000 p p d a of Active process = 30000 < KERNEL> ppda pda (sh) (vi) owned by kernel struct user k-stack(vi) 20000 ppda (sh) vi a.out vi a.out loc. 0 adjacent to application, for swapping 30000 struct user k-stack(sh) ppda (vi) loc. 0 sh a.out sh a.out
Logical Address Physical Address PAR PDR loc. 0 kernel a.out proc[0] proc[i] proc[k] 10000 kernel a.out proc[0] proc[i] proc[k] = 10000 7-th page = 20000 = 30000 < KERNEL> ppda pda (sh) (vi) struct user k-stack(vi) 20000 Swappable Image “data segment” (7-3) ppda PAR PDR vi a.out vi a.out loc. 0 a.out 30000 struct user k-stack(sh) ppda loc. 0 < USER > sh a.out sh a.out
PAR PDR sh vi sim a.out u-stack a.out u-stack a.out u-stack Adjacent Belongs USER user k-stack user k-stack user k-stack PAR PDR p_addr p_addr proc[i] proc[j] proc[k] … KERNEL
CPU state3 types of CPU registers • with address • memory mapping PAR|PDR • instruction address PC • stack SP EP • with data • R0 R1 R2 R3 … • with others (status) • PSW (ZNCOM ..) < CPU State > PAR PDR PAR PDR CPU R0 R1 | SP E P PC USER KERNEL
Physical Address 7-th kernel mapping register (6-2) struct user k-stack Mapping Registers PAR PDR Kernel a.out points to p.p.d.a. of active process (base of kernel stack) 7th Register 7 KERNEL struct user k-stack (vi) vi a.out kernel stack frame boundary top of kernel stack CPU Registers u--stack R0 R1 | R4 EP SP PC struct user k-stack (sh) k U sh a.out user stack u--stack
proc[i].p_addr is address of process i’s struct user ppda image 7-th ksar == ppda of active process After the boot/init, 7-th ksar = proc #0 (kernel process) (1589) (6-3-1-b) (6-3-3-b) struct user k-stack PAR PDR Kernel Proc[0] < KERNEL> PAR PDR < USER >