Table Of ContentEverything You Always Wanted
(cid:1)
To Know About MIG
(cid:1)
But Were Afraid To Ask
Richard P(cid:1) Draves
rpd(cid:1)cs(cid:2)cmu(cid:2)edu
School of Computer Science
Carnegie Mellon University
Pittsburgh(cid:2) PA (cid:3)(cid:4)(cid:5)(cid:3)(cid:6)
(cid:1)
Mig
(cid:2)
Stub generator for Mach IPC(cid:1)
(cid:2)
Pack(cid:2) unpack(cid:2) demultiplex messages(cid:1)
(cid:2)
NOT transparent language(cid:7)level RPCs(cid:1)
(cid:2)
Doesn(cid:8)t hide IPC features(cid:1)
(cid:2)
Assumes client(cid:9)server model(cid:1)
(cid:2)
Mig History
early Matchmaker
Mary Thompson
Keith Wright
Mike Jones - exceptions
Mike Young - C
late Matchmaker
Mike Jones
real types
Lisp, Pascal, C
MIG
Mike Young
Rich Draves - rewrote
Draves & Golub - features
(cid:3)
Mig Programming Model
(cid:2)
Clients call stubs
mach(cid:1)port(cid:1)t server(cid:1)port(cid:2)
kr (cid:3) getbalance(cid:4)server(cid:1)port(cid:5) (cid:6)balance(cid:7)(cid:2)
(cid:2)
Server loop processes requests
extern boolean(cid:1)t bank(cid:1)server(cid:4)(cid:7)(cid:2)
mach(cid:1)port(cid:1)t server(cid:1)port(cid:2)
(cid:8)define MAX(cid:1)SIZE (cid:9)(cid:10)(cid:11)
(cid:4)void(cid:7) mach(cid:1)msg(cid:1)server(cid:4)bank(cid:1)server(cid:5) MAX(cid:1)SIZE(cid:5)
server(cid:1)port(cid:7)(cid:2)
kern(cid:1)return(cid:1)t getbalance(cid:4)server(cid:1)port(cid:5) balance(cid:7)
mach(cid:1)port(cid:1)t server(cid:1)port(cid:2)
int (cid:12)balance(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13)
(cid:14)
(cid:15)(cid:15)(cid:15)
(cid:16)
(cid:4)
Mig Example
(cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13)
subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2)
(cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22)
(cid:13)(cid:12) manipulate a bank account (cid:12)(cid:13)
routine getbalance(cid:4)
server (cid:23) mach(cid:1)port(cid:1)t(cid:2)
out balance (cid:23) int(cid:7)(cid:2)
Client call(cid:10)
(cid:8)include (cid:24)example(cid:15)h(cid:24)
mach(cid:1)port(cid:1)t server(cid:2)
int balance(cid:2)
kern(cid:1)return(cid:1)t kr(cid:2)
kr (cid:3) getbalance(cid:4)server(cid:5) (cid:6)balance(cid:7)(cid:2)
Server function(cid:10)
kern(cid:1)return(cid:1)t getbalance(cid:4)server(cid:5) balance(cid:7)
mach(cid:1)port(cid:1)t server(cid:2)
int (cid:12)balance(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13)
(cid:14)
(cid:12)balance (cid:3) server(cid:1)balance(cid:2)
return KERN(cid:1)SUCCESS(cid:2)
(cid:16)
(cid:5)
Type De(cid:1)nitions
(cid:13)(cid:12) from mach(cid:13)std(cid:1)types(cid:15)defs (cid:12)(cid:13)
type mach(cid:1)port(cid:1)t (cid:3) MACH(cid:1)MSG(cid:1)TYPE(cid:1)COPY(cid:1)SEND(cid:2)
type int (cid:3) MACH(cid:1)MSG(cid:1)TYPE(cid:1)INTEGER(cid:1)(cid:17)(cid:11)(cid:2)
type kern(cid:1)return(cid:1)t (cid:3) int(cid:2)
(cid:13)(cid:12) pointer to out(cid:25)of(cid:25)line memory (cid:12)(cid:13)
type pointer(cid:1)t (cid:3) (cid:26)array(cid:27)(cid:28) of MACH(cid:1)MSG(cid:1)TYPE(cid:1)BYTE(cid:2)
(cid:13)(cid:12) a (cid:17)(cid:18)(cid:25)byte structure (cid:12)(cid:13)
type mach(cid:1)port(cid:1)status(cid:1)t (cid:3) struct(cid:27)(cid:29)(cid:28) of int(cid:2)
(cid:13)(cid:12) C declarations for these types (cid:12)(cid:13)
import (cid:21)mach(cid:13)std(cid:1)types(cid:15)h(cid:22)(cid:2)
(cid:6)
Asynchronous Messages
(cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13)
subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2)
(cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22)
(cid:13)(cid:12) set bank account balance (cid:12)(cid:13)
routine setbalance(cid:4)
server (cid:23) mach(cid:1)port(cid:1)t(cid:2)
in balance (cid:23) int(cid:7)(cid:2)
(cid:13)(cid:12) set it with an asynchronous message (cid:12)(cid:13)
simpleroutine asetbalance(cid:4)
server (cid:23) mach(cid:1)port(cid:1)t(cid:2)
in balance (cid:23) int(cid:7)(cid:2)
(cid:1)
Client and server code looks like RPC(cid:1)
(cid:1)
Message(cid:2)ordering problems in multi(cid:2)threaded
servers(cid:1)
(cid:1)
Control(cid:2)(cid:3)ow worries(cid:1)
(cid:1)
Not recommended for general use(cid:1)
(cid:7)
Asynchronous Messages
Client call(cid:10)
(cid:8)include (cid:24)example(cid:15)h(cid:24)
mach(cid:1)port(cid:1)t server(cid:2)
int balance(cid:2)
kern(cid:1)return(cid:1)t kr(cid:2)
kr (cid:3) setbalance(cid:4)server(cid:5) balance(cid:7)(cid:2)
(cid:15)(cid:15)(cid:15)
kr (cid:3) asetbalance(cid:4)server(cid:5) balance(cid:7)(cid:2)
Server function(cid:10)
kern(cid:1)return(cid:1)t setbalance(cid:4)server(cid:5) balance(cid:7)
mach(cid:1)port(cid:1)t server(cid:2)
int balance(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13)
(cid:14)
server(cid:1)balance (cid:3) balance(cid:2)
return KERN(cid:1)SUCCESS(cid:2)
(cid:16)
kern(cid:1)return(cid:1)t asetbalance(cid:4)server(cid:5) balance(cid:7)
mach(cid:1)port(cid:1)t server(cid:2)
int balance(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13)
(cid:14)
server(cid:1)balance (cid:3) balance(cid:2)
return KERN(cid:1)SUCCESS(cid:2)
(cid:16)
(cid:8)
Structure Arguments
(cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13)
subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2)
(cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22)
(cid:8)include (cid:24)example(cid:1)types(cid:15)defs(cid:24)
routine structdemo(cid:4)
server (cid:23) mach(cid:1)port(cid:1)t(cid:2)
in arg(cid:10) (cid:23) small(cid:1)struct(cid:1)t(cid:2)
out arg(cid:11) (cid:23) small(cid:1)struct(cid:1)t(cid:2)
inout arg(cid:17) (cid:23) small(cid:1)struct(cid:1)t(cid:7)(cid:2)
(cid:13)(cid:12) file example(cid:1)types(cid:15)defs (cid:12)(cid:13)
(cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22)
type small(cid:1)struct(cid:1)t (cid:3) struct(cid:27)(cid:17)(cid:28) of int(cid:2)
import (cid:24)example(cid:1)types(cid:15)h(cid:24)(cid:2)
(cid:13)(cid:12) file example(cid:1)types(cid:15)h (cid:12)(cid:13)
(cid:8)ifndef (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1)
(cid:8)define (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1)
typedef struct small(cid:1)struct (cid:14)
int one(cid:2)
int two(cid:27)(cid:11)(cid:28)(cid:2)
(cid:16) small(cid:1)struct(cid:1)t(cid:2)
(cid:8)endif (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1)
(cid:9)
Structure Arguments
Client call(cid:10)
(cid:8)include (cid:24)example(cid:15)h(cid:24)
mach(cid:1)port(cid:1)t server(cid:2)
small(cid:1)struct(cid:1)t arg(cid:10)(cid:5) arg(cid:11)(cid:5) arg(cid:17)(cid:2)
kern(cid:1)return(cid:1)t kr(cid:2)
kr (cid:3) structdemo(cid:4)server(cid:5) arg(cid:10)(cid:5) (cid:6)arg(cid:11)(cid:5) (cid:6)arg(cid:17)(cid:7)(cid:2)
Server function(cid:10)
kern(cid:1)return(cid:1)t structdemo(cid:4)server(cid:5) arg(cid:10)(cid:5) arg(cid:11)(cid:5) arg(cid:17)(cid:7)
mach(cid:1)port(cid:1)t server(cid:2)
small(cid:1)struct(cid:1)t arg(cid:10)(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13)
small(cid:1)struct(cid:1)t (cid:12)arg(cid:11)(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13)
small(cid:1)struct(cid:1)t (cid:12)arg(cid:17)(cid:2) (cid:13)(cid:12) inout (cid:12)(cid:13)
(cid:14)
(cid:12)arg(cid:11) (cid:3) (cid:12)arg(cid:17)(cid:2)
(cid:12)arg(cid:17) (cid:3) arg(cid:10)(cid:2)
return KERN(cid:1)SUCCESS(cid:2)
(cid:16)
(cid:1)(cid:10)
Description:Lisp, Pascal, C early Matchmaker. Mary Thompson. Keith Wright. Mike Jones - exceptions. Mike Young - C. MIG. Mike Young. Rich Draves - rewrote.