You could do worse than Mach ports

David Leimbach leimy2k at mac.com
Fri Jul 18 05:25:58 PDT 2003


   Yes, precisely.  I feel that protection boundaries are better 
handled
    by the port agent.  e.g. this is how a typical message is sent:

    SomeMsg blah;

    blah.XXX = ...				/* ... fill in blah ... */
    code = targetPort->mp_SendMsg(targetPort, &blah);	/* send the 
message */
    if (code == EASYNC)				/* async completion?  */
	code = waitMsg(&blah);			/* yes, wait */
    return(code);				/* else sync completion */

    For user<->user messaging mp_sendMsg() is simply the target port's
    message handling function.  Ditto for kernel<->kernel messaging.
	I am REALLY intersted in the user->user case...  In fact I've had some
    ideas that have to do with Mach-like port permissions and exposed 
regions
    of memory based on the MPI-2 One Sided [RDMA] semantics.  However I 
haven't
    gotten very far with this idea on paper to even decide if its 
doable....
    I want to expose a region of memory for outside access to a known 
group of
    processes or threads for a certain amount of time at which point 
that memory
    could be thought of as "don't touch" for the duration of the 
epoch... All
    accesses to that memory could be considered "remote" during the 
epoch using
    only "put" and "get" requests which I would be relying on the VM 
layer to do
    the writes and reads to the memory in the exposed buffer... even 
for the local
    process.

	Does this sound feasible?  Like I said,  I haven't gotten very far.... 
but this
   	API is present, more or less, on high-speed Infiniband hardware 
drivers as well
	as Myrinet GM where there is hardware to do the DMA accesses needed to 
prevent
	interrupting the CPUs of remote nodes so they can continue crunching 
data while
	messages flow through a cluster.  Its quite beautiful and elegant in 
that context.

	In user<->user messaging it would just be a natural extension, I 
think, of this
	idea.  However I have not counted on context switches and other things 
that may
	need to occur in a BSD/Unix like kernel that may make this design 
horrible.


    But for user<->kernel messaging or kernel<->user messaging the
    targetPort would be the local representation of the port (not the
    actual port), and mp_SendMsg() would broker the message to the 
actual
    port, doing whatever work is required to deal with the protection
    boundary.

    Theoretically this means we can write device and VFS driveres that 
can
    be compiled up as either user OR kernel modules.  They would see 
the
    same API either way and only mp_SendMsg() would change.
	That's pretty dang neat.  The only part that would change is the 
target of
	the message.

    That's the idea.  It is very similar to how the Amiga's I/O system
    (DoIO, SendIO, BeginIO, etc) works.  The performance aspects of the
    design should be obvious... no queueing unless you really need to,
    queueing controlled by target port's agent (could just forward to
    actual target port if targetPort is a shim), no queueing the
    reply unless necessary, no queueing of the reply if the client is
    waiting for it synchronously, easily embeddable port/message 
structures,
    etc.
	queueing occurs only in the synchronous case then?  I need to see that 
AmigaOS :).
						-Matt







More information about the Kernel mailing list