29
cs4414 Fall 2013 University of Virginia David Evans 20: Crossing into Kernel Space

Crossing into Kernel Space

Embed Size (px)

DESCRIPTION

How to go from libc into the kernel Interrupts

Citation preview

Page 1: Crossing into Kernel Space

cs4414 Fall 2013University of Virginia

David Evans

Class 20:Crossing into Kernel Space

Page 2: Crossing into Kernel Space

University of Virginia cs4414 2

Plan for Today

Between libc and the kernelPS3 Benchmarking ResultsProject Time

7 November 2013

Page 3: Crossing into Kernel Space

University of Virginia cs4414 3

Recap

7 November 2013

run::Process::new(program, argv, options)

Rust

Run

time

spawn_process_os(prog, args, env, dir, in_fd, …)

fork()

libc: fork()

linux kernel: fork syscall

Today

Page 4: Crossing into Kernel Space

University of Virginia cs4414 4

libst

d/rt

/io/

nativ

e/pr

oces

s.rs

7 November 2013

#[cfg(unix)]fn spawn_process_os(prog: &str, args: &[~str], env: Option<~[(~str, ~str)]>, dir: Option<&Path>, in_fd: c_int, out_fd: c_int, err_fd: c_int) -> SpawnProcessResult { … #[cfg(not(target_os = "macos"), not(windows))] unsafe fn set_environ(envp: *c_void) { extern { static mut environ: *c_void; } environ = envp; }

unsafe {

let pid = fork(); if pid < 0 { fail!("failure in fork: {}", os::last_os_error()); } else if pid > 0 { return SpawnProcessResult {pid: pid, handle: ptr::null()}; }

… // 25 lines of failure-handing code}

Page 5: Crossing into Kernel Space

University of Virginia cs4414 5

Test Program

7 November 2013

use std::libc::funcs::posix88::unistd::fork;

#[fixed_stack_segment]fn main() { let pid = unsafe { fork() } ; println(fmt!("pid = %?", pid));}

> rustc fork.rs> ./forkpid = 0i32pid = 15039i32$ ./forkpid = 15043i32pid = 0i32

Page 6: Crossing into Kernel Space

University of Virginia cs4414 67 November 2013

use std::libc::funcs::posix88::unistd::fork;

#[fixed_stack_segment]fn main() { unsafe { fork() } ; }

> rustc -O -S fork.rs> wc -l fork.S 72 fork.S

.section __TEXT,__text,regular,pure_instructions .align 4, 0x90__ZN4main18h8b6694fe33a5855ag4v0.0E: .cfi_startproc leaq -2097152(%rsp), %r11 cmpq %gs:816, %r11 ja LBB0_2 movabsq $2097152, %r10 movabsq $0, %r11 callq ___morestack retLBB0_2: pushq %rbpLtmp2: .cfi_def_cfa_offset 16Ltmp3: .cfi_offset %rbp, -16 movq %rsp, %rbp

Ltmp4: .cfi_def_cfa_register %rbp popq %rbp jmp _fork .cfi_endproc

.globl _main.align 4, 0x90

_main: .cfi_startproc cmpq %gs:816, %rsp ja LBB1_2 movabsq $8, %r10 movabsq $0, %r11 callq ___morestack retLBB1_2: pushq %rbpLtmp7: .cfi_def_cfa_offset 16Ltmp8: .cfi_offset %rbp, -16 movq %rsp, %rbp

Ltmp9: .cfi_def_cfa_register %rbp movq %rsi, %rax movq %rdi, %rcx movq %rsi, %rax movq %rdi, %rcx leaq __ZN4main18h8b6694fe33a5855ag4v0.0E(%rip), %rsi xorl %edi, %edi movq %rcx, %rdx movq %rax, %rcx popq %rbp jmp __ZN8unstable4lang5start17hf72eb8b3c3a0a9ac4v0.8E .cfi_endproc

.section __DATA,__data .globl __rust_crate_map_toplevel .align 4__rust_crate_map_toplevel: .long 1 .space 4 .quad __rust_mod_map .quad __rust_crate_map_std_0.8_6c65cf4b443341b1 .quad 0

.zerofill __DATA,__bss,__rust_mod_map,16,3 .section __TEXT,__const .globl _rust_abi_version .align 3_rust_abi_version: .quad 1

.subsections_via_symbols

Page 7: Crossing into Kernel Space

University of Virginia cs4414 7

Could actual call to kernel fork be a regular call?

7 November 2013

Page 8: Crossing into Kernel Space

University of Virginia cs4414 8

Entering the Kernel

7 November 2013

run::Process::new(program, argv, options)

Rust

Run

time

spawn_process_os(prog, args, env, dir, in_fd, …)

fork()

libc: fork()

linux kernel: fork syscall

Page 9: Crossing into Kernel Space

University of Virginia cs4414 9

Supervisor Mode

What would happen if user-level code could just jump into kernel code?

7 November 2013

Kernel code needs (or at least uses) special privileges!

Page 10: Crossing into Kernel Space

University of Virginia cs4414 10

Entering the Kernel

7 November 2013

User-Level Code…movl $SYS_fork,%eaxint $0x80

int instruction generates an interrupt

Page 11: Crossing into Kernel Space

University of Virginia cs4414 11

Traditional PC Design

7 November 2013

CPUProgrammable

Interrupt Controller

(PIC)

Interval TimerKeyboard

Page 12: Crossing into Kernel Space

University of Virginia cs4414 127 November 2013

Page 2213 of Intel x86 Manual:http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

Modern x86 Design: “APIC” = “Advanced PIC”

Page 13: Crossing into Kernel Space

University of Virginia cs4414 137 November 2013

Page 2213 of Intel x86 Manual:http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

What should generate an “External Interrupt”?

What should generate a “Local Interrupt”?

Page 14: Crossing into Kernel Space

University of Virginia cs4414 147 November 2013

Page 15: Crossing into Kernel Space

University of Virginia cs4414 157 November 2013

Page 16: Crossing into Kernel Space

University of Virginia cs4414 167 November 2013

Page 17: Crossing into Kernel Space

University of Virginia cs4414 17

Handling Syscall

Interrupts

7 November 2013

…movl $SYS_fork,%eaxint $0x80

CPUProgrammable

Interrupt Controller

(PIC)

Page 18: Crossing into Kernel Space

University of Virginia cs4414 187 November 2013

Page 19: Crossing into Kernel Space

University of Virginia cs4414 197 November 2013

Page 20: Crossing into Kernel Space

University of Virginia cs4414 207 November 2013

Intel manual, p. 146:

Page 21: Crossing into Kernel Space

University of Virginia cs4414 217 November 2013

Page 22: Crossing into Kernel Space

University of Virginia cs4414 22

Running in Supervisor Mode

7 November 2013

run::Process::new(program, argv, options)

Rust

Run

time

spawn_process_os(prog, args, env, dir, in_fd, …)

fork()

libc: fork()

linux kernel: fork syscall

int 0x80

jumps into kernel codesets supervisor mode

Page 23: Crossing into Kernel Space

PS3 Bakeoff Winners

Page 24: Crossing into Kernel Space

University of Virginia cs4414 245 November 2013

reference zhtta

0 50 100 150 2000

1,000

2,000

3,000

4,000

5,000

6,000

Series1; 531.3

3902.7

960.8989.7

5701.3

3908.1

0.6

Total Duration (seconds)

Aver

age

Resp

onse

Tim

e (m

illis

econ

ds)

Page 25: Crossing into Kernel Space

University of Virginia cs4414 257 November 2013

8pm FridayRouss/Robertson Hall Room 120

Page 26: Crossing into Kernel Space

University of Virginia cs4414 267 November 2013

Decoy Project!

Page 27: Crossing into Kernel Space

University of Virginia cs4414 277 November 2013

Page 28: Crossing into Kernel Space

University of Virginia cs4414 285 November 2013

reference zhtta

0 50 100 150 2000

1,000

2,000

3,000

4,000

5,000

6,000

Series1; 531.3

3902.7

960.8989.7

5701.3

3908.1

0.6

Total Duration (seconds)

Aver

age

Resp

onse

Tim

e (m

illis

econ

ds)

Kiet, Mark, Tanmoy

Harriet, Kevin, Zeming

Hong, Jireh, MarshallChris, Tong, Yicheng

Page 29: Crossing into Kernel Space

University of Virginia cs4414 29

Charge

7 November 2013

Find a team and project!

Decoy projects are only allowed in security classes.Sneaking around my house is no longer permitted.