Gneiss A nice component framework in SPARK Johannes Kliemann - - PowerPoint PPT Presentation

gneiss a nice component framework in spark
SMART_READER_LITE
LIVE PREVIEW

Gneiss A nice component framework in SPARK Johannes Kliemann - - PowerPoint PPT Presentation

Gneiss A nice component framework in SPARK Johannes Kliemann FOSDEM, Brussels, 2020-02-02 Component-based Architectures Trusted Components Cant reimplement everything Solution: software reuse Protocol validator Untrusted


slide-1
SLIDE 1

Gneiss A nice component framework in SPARK

Johannes Kliemann FOSDEM, Brussels, 2020-02-02

slide-2
SLIDE 2

2020-02-02 2

Component-based Architectures Trusted Components

■ Can’t reimplement everything ■ Solution: software reuse ▪ Untrusted software (gray) ▪ Policy object (green) ▪ Client software (orange) ■ Policy and proxy components ▪ Formally verified ▪ Limited complexity Network Stack Web browser Protocol validator (e.g. TLS)

slide-3
SLIDE 3

2020-02-02 3

Ensuring Correctness Prerequisites

■ Correctness by proof ▪ Absence of runtime errors ▪ Functional correctness ■ Tools ▪ Formalization language ▪ Mapping between implementation and proof ■ Reusability ▪ Proofs require effort ▪ Abstraction from actual platform ■ Provability ▪ Formal specification ▪ Manageable complexity ▪ Deterministic behaviour

slide-4
SLIDE 4

2020-02-02 4

Correctness by Proof and Tools SPARK

■ Programming Language ▪ Based on Ada ▪ Compilable with GCC and LLVM ▪ Customizable runtime ▪ Contracts (preconditions, postconditions, invariants) ■ Verification Toolset ▪ Absence of runtime errors ▪ Functional correctness

function Abs (I : Integer) return Integer with Pre => I > Integer’First, Post => Abs’Result >= 0; procedure Inc (I : in out Integer) with Pre => I < Integer’Last, Post => I = I’Old + 1, Global => null;

slide-5
SLIDE 5

2020-02-02 5

Provability and Reusability Gneiss

■ Reusability ▪ Platform abstraction ▪ Interface mappable to multiple different semantics ▪ Only dependencies satisfiable by all platforms ■ Provability ▪ Platform formalization ▪ Assumptions coarse enough to be valid on multiple platforms ▪ Assumptions strong enough to ease proving

slide-6
SLIDE 6

2020-02-02 6

Example: Block Client

slide-7
SLIDE 7

2020-02-02 7

Block Devices Client Interface

■ Block device ▪ Storage device of equally sized blocks ▪ Block size is typically 512 or 4096 bytes ■ Packet descriptor ▪ Starting block number ▪ Amount of blocks ▪ Read/Write/Sync/Trim ▪ Memory location ■ Create packet descriptor ■ Allocate memory for request ■ (write data) ■ Send request to block device ■ Receive answer from block device ■ (read data)

slide-8
SLIDE 8

2020-02-02 8

Gneiss Block Client Formalizing properties

■ Formalize properties of platform API ▪ Packet object is needed ▪ Packet object can always be initialized ▪ Request memory must be allocated separately ▪ Memory allocation might fail ▪ Submitting must be checked ▪ Submitting works always if ready

packet = Packet_descriptor( WRITE, start, count); try { packet.alloc_packet( block_size * count); if(ready_to_submit()){ submit(packet); } catch (Alloc_Error) { }

slide-9
SLIDE 9

2020-02-02 9

Gneiss Block Client Formalizing properties

■ Define packet type ▪ No exceptions, allocation success is a property ■ Define precondition from formalized properties ▪ Packet must be allocated ▪ And the platform must be ready

type Packet is record Start : Natural; Length : Positive; Op : Operation; Allocated : Boolean; end record; function Ready return Boolean; procedure Submit (P : Packet) with Pre => P.Allocated and then Ready;

slide-10
SLIDE 10

2020-02-02 10

Gneiss Block Client Formalizing properties

■ Packet properties can be changed by the programmer ▪ Allocation status can be set without actually successfully allocating ▪ Packet can be submitted multiple times ■ Submit does not change the platform state ▪ Calling Submit should invalidate Ready

P := Packet’(Start => 0, Length => 1, Op => READ, Allocated => True); if P.Allocated and then Ready then Submit (P); Submit (P); end if;

slide-11
SLIDE 11

2020-02-02 11

Gneiss Block Client Formalizing properties

■ Use state enum instead of boolean ■ Encapsulate Packet type ▪ Can only be changed by platform calls ▪ Can only be created in state Empty ▪ Cannot be copied (limited)

type Packet is limited private; type Packet_State is (Empty, Allocated); function Create (Start : Natural; Length : Positive; Op : Operation) return Packet with Post => State (Create’Result) = Empty; function State (P : Packet) return Packet_State;

slide-12
SLIDE 12

2020-02-02 12

Gneiss Block Client Formalizing properties

■ Submit changes packet state ■ Submit changes platform state ▪ Ready depends on platform state ▪ Once Submit is called, Ready must be checked again

function Ready return Boolean with Global => (Input => Platform); procedure Submit (P : in out Packet) with Pre => State (P) = Allocated and then Ready, Post => State (P) = Empty, Global => (In_Out => Platform);

slide-13
SLIDE 13

2020-02-02 13

Gneiss Block Client A Second Platform

■ write might fail ▪ ENOSYS (not implemented) ▪ EINVAL (wrong argument) ▪ EFBIG (offset out of file) ▪ EBADF (bad file descriptor) ▪ EAGAIN (out of resources) ■ No way to make sure it succeeds, submit must be able to fail, too

struct block_packet packet = {0, 1, WRITE, 0}; int result; packet.ptr = malloc (block_size * packet.len); if(packet.ptr){ result = write(fd, &packet); }

slide-14
SLIDE 14

2020-02-02 14

Gneiss Block Client A Second Platform

■ Submit must be able to fail ▪ It might change the packet state

  • r leave it as is

▪ An unsuccessfully submitted packet can be submitted again

procedure Submit (P : in out Packet) with Pre => State (P) = Allocated, Post => State (P) in Empty | Allocated, Global => (In_Out => Platform);

slide-15
SLIDE 15

2020-02-02 15

Gneiss Block Client Adapting the first platform

■ Both platforms have different semantics ■ The second platform cannot be expressed with the first one ■ But the first one can be expressed with the second one

procedure Submit (P : in out Packet) is begin if Ready then Submit_Native (P); end if; end Submit;

slide-16
SLIDE 16

2020-02-02 16

Gneiss Summary

■ Asynchronous, event based ■ Supports capabilities ■ Callbacks via generics ■ Limited dynamic resource allocation ▪ Platform dependent ■ No memory pressure ■ No aliasing ■ Multiple platforms ▪ Genode ▪ Linux ▪ Muen ■ Interfaces ▪ Log client/server ▪ Block client/server ▪ Timer client ▪ Message client/server ▪ Shared memory

slide-17
SLIDE 17

2020-02-02 17

Questions?

Johannes Kliemann kliemann@componolit.com

@Componolit · componolit.com · github.com/Componolit