22
Certifying Low-Level Programs with Hardware Interrupts and Preemptive Threads Xinyu Feng Toyota Technological Institute at Chicago Joint work with Zhong Shao (Yale), Yuan Dong (Tsinghua Univ.) and Yu Guo (USTC)

Certifying Low-Level Programs with Hardware Interrupts and Preemptive Threads

  • Upload
    ethel

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

Certifying Low-Level Programs with Hardware Interrupts and Preemptive Threads. Xinyu Feng Toyota Technological Institute at Chicago Joint work with Zhong Shao (Yale), Yuan Dong (Tsinghua Univ.) and Yu Guo (USTC). Many challenges:. Low-level C/Assembly code. Code loading. Concurrency. - PowerPoint PPT Presentation

Citation preview

Page 1: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Certifying Low-Level Programs with Hardware Interrupts and Preemptive Threads

Xinyu Feng

Toyota Technological Institute at Chicago

Joint work with Zhong Shao (Yale), Yuan Dong (Tsinghua Univ.) and Yu Guo (USTC)

Page 2: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

How to verify safety & correctness of OS kernels / Hypervisors?

Code loading

Many challenges:

Interrupts

Device drivers & I/O

Concurrency

Low-level C/Assembly codeIs verification possible?

How to do it in a clean & modular way?

Page 3: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Layering of Simplified Kernel Code

scheduler & ctxt switching & ...

. . .

locks cond var. I/O. . .

. . .

. . .

A

B

C

11011010

IR0IR1IR2IR3IR4IR5IR6IR7

B: concurrent code with explicit interrupts

How to verify ???

Page 4: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Concurrency with Interrupts: Challenges

. . .

. . .

cli. . .

switch. . .

sti. . .

Thread X

switch

iret

. . .. . .

Handler 0

. . .

cli. . .

switch. . .

sti. . .

. . .

sti. . .

Thread Y

iret

. . .

Handler 1irq0

irq1

(1)

(2)

(3)

(4)

(5)

Asymmetric preemption between handlers and non-handler code

Intertwining between threads and handlers

Asymmetric synchronization: cli/sti are different from locks

Page 5: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Our Contributions

A Hoare-style program logic for modular verification of low-level programs with interrupts and concurrency.

Page 6: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM – I : Single Threaded-Code with Interrupts

I1f1:

I2f2:

ISRih:

(code heap) C

0

r1

1 2 …

r2 r3 … rn

(data heap) H

(register file) R

(state) S

addu … cli sti iret … j f

(program) P::=(C,S,pc)

::=(H,R,ie)::={f I}*

pc

ie

Page 7: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Example: Teeter-Totter

while(true){

cli;

if([right] == 0){

sti;

break;

}

[right] := [right]-1;

[left] := [left]+1;

sti;

}

print(“left wins!”);

timer:

if([left] == 0){

print(“right wins!”);

iret;

}

[left] := [left]-1;

[right] := [right]+1;

iret;

50 50left right

How to guarantee non-interference?

Page 8: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Non-Interference?

Program invariant:

There is always a partition of memory among concurrent entities, and each concurrent entity only access its own part.

But note:

The partition is dynamic: ownership of memory can be dynamically transferred.

cli/sti can be modeled as operations that trigger memory ownership transfer.

Page 9: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

- { Ph }INV

AIM – I : The Memory Model

Non-handler

sti

iret

Handler

B A

cli…

Memory

- { Ph }INV

The memory partition is logical, not physical!

Page 10: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Separation Logic to Enforce Partition

l n nl

p q p q

emp empty heap

p qp q

[Ithtiaq & O’Hearn’01, Reynolds’02]

Page 11: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM – I : cli/sti

B A

INV

B B

INV

B

B A

INV

B

INV

B

cli

sti

ie = 1 ie = 0

Page 12: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Example: Teeter-Totter

while(true){

-{emp ie=1}

cli;

-{emp * INV}

...

[right] := [right]-1;

[left] := [left]+1;

-{INV}

sti;

-{emp ie=1}

}

timer:

-{INV}

if([left] == 0){

print(“right wins!”);

-{INV}

iret;

}

[left] := [left]-1;

[right] := [right]+1;

-{INV}

iret;

INV: m, n. (left m) (right n) (m+n = 100)50 50

left right

sti

cli

Page 13: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM-II : Multi-threaded code with interrupts

f1

:

f2

:

ih:

(code heap) C (state) S

(program) P ::=(C,S,B,Q,pc)

::=(H,R,ie)

cli/stiswitchblock wunblock w

pc

0

r1

1 2 …

r2 r3 … rn

(data heap) H

(register file) R ie

pc

R

pc

R

pc

R…

(ready. queue) Q

w1

w2

wn

B

Page 14: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Non-interference?

f1

:

f2

:

ih:

(code heap) C (state) S ::=(H,R,ie)

cli/stiswitchblock wunblock w

pc

0

r1

1 2 …

r2 r3 … rn

(data heap) H

(register file) R ie

pc

R

pc

R

pc

R…

(ready. queue) Q

w1

w2

wn

B

Use memory partition to control interference!

Page 15: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM – II : Memory Model

B A

INV

A

INV

C

T1 T2

INV1

Page 16: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM – II : cli/sti

T1: cliC A

INV

T1 T2

INV1

T1: C T1: A

INV

T1 T2

INV1

ie = 1 ie = 0

C' A'

INV

T1 T2

INV1

T1: C' T1: A'

INV

T1 T2

INV1

T1: sti

Page 17: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM – II : switch

T1: C T1: A

INV

T1 T2

INV1

T1: switch T2: C T2: A

INV

T1 T2

INV1

ie = 0

T2: switchT1: C' T1: A'

INV

T1 T2

INV1

T2: C' T2: A'

INV

T1 T2

INV1

switchuntouched

INV1 * INV preserved

…sti…cli…

Page 18: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

block

switch

T1: C T1: A

INV

T1 T2

INV1

?

!

T2: C T2: A

INV

T1 T2

INV1

!

T2 : C' T2 : A'

INVINV1

T1 T2

T1: C' T1 : A'

INV

T1

INV1

T2!

unblock

Thread 1

T2

!

AIM-II: block/unblock

Thread 2

block

Page 19: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

AIM-II : block/unblock

Threads block themselves to wait for resources.

w1

w2

wn

B

locks: wait for resources protected by locks

condition variables: wait for conditions to come true

R1

R2

Rn

R can be empty

Unifies different semantics of Condition Variables:

Mesa style

Hoare style

Brinch-Hansen style

Read our paper for details!

Page 20: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Implementations – An Infrastructure for x86 verification

Coq (Higher-Order Logic with Inductive Def.)

x86 semantics (a subset)

Sep. Logic Utilities (e.g. Queues)

AIM Logic & Soundness

Locks, Condition variablesTimer handler, yield/sleep

SCAP

switch, block, unblock

26,000 12,000

26,000 3,000

6,300 4,000

Around 82,000 lines of Coq code

3,300

See http://flint.cs.yale.edu/publications/aim.html

Page 21: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Summary

• Abstract Machine & Program Logic– Hardware interrupts + preemptive threads– Ownership transfer semantics

• cli, sti, switch, block, unblock

• Implementations– Infrastructure for x86 code verification– Certified x86 modules

• Future work– Multi-processor platforms– Liveness properties– Verification of C programs

Page 22: Certifying Low-Level Programs with  Hardware Interrupts and Preemptive Threads

Thank you!