Next: Exchanging Port Rights, Previous: Mach Message Call, Up: Messaging Interface
A Mach message consists of a fixed size message header, a
mach_msg_header_t
, followed by zero or more data items. Data
items are typed. Each item has a type descriptor followed by the actual
data (or the address of the data, for out-of-line memory regions).
The following data types are related to Mach ports:
The
mach_port_t
data type is an unsigned integer type which represents a port name in the task's port name space. In GNU Mach, this is anunsigned int
.
The following data types are related to Mach messages:
The
mach_msg_bits_t
data type is anunsigned int
used to store various flags for a message.
The
mach_msg_size_t
data type is anunsigned int
used to store the size of a message.
The
mach_msg_id_t
data type is aninteger_t
typically used to convey a function or operation id for the receiver.
This structure is the start of every message in the Mach IPC system. It has the following members:
mach_msg_bits_t msgh_bits
- The
msgh_bits
field has the following bits defined, all other bits should be zero:
MACH_MSGH_BITS_REMOTE_MASK
MACH_MSGH_BITS_LOCAL_MASK
- The remote and local bits encode
mach_msg_type_name_t
values that specify the port rights in themsgh_remote_port
andmsgh_local_port
fields. The remote value must specify a send or send-once right for the destination of the message. If the local value doesn't specify a send or send-once right for the message's reply port, it must be zero and msgh_local_port must beMACH_PORT_NULL
.MACH_MSGH_BITS_COMPLEX
- The complex bit must be specified if the message body contains port rights or out-of-line memory regions. If it is not specified, then the message body carries no port rights or memory, no matter what the type descriptors may seem to indicate.
MACH_MSGH_BITS_REMOTE
andMACH_MSGH_BITS_LOCAL
macros return the appropriatemach_msg_type_name_t
values, given amsgh_bits
value. TheMACH_MSGH_BITS
macro constructs a value formsgh_bits
, given twomach_msg_type_name_t
values.mach_msg_size_t msgh_size
- The
msgh_size
field in the header of a received message contains the message's size. The message size, a byte quantity, includes the message header, type descriptors, and in-line data. For out-of-line memory regions, the message size includes the size of the in-line address, not the size of the actual memory region. There are no arbitrary limits on the size of a Mach message, the number of data items in a message, or the size of the data items.mach_port_t msgh_remote_port
- The
msgh_remote_port
field specifies the destination port of the message. The field must carry a legitimate send or send-once right for a port.mach_port_t msgh_local_port
- The
msgh_local_port
field specifies an auxiliary port right, which is conventionally used as a reply port by the recipient of the message. The field must carry a send right, a send-once right,MACH_PORT_NULL
, orMACH_PORT_DEAD
.mach_port_seqno_t msgh_seqno
- The
msgh_seqno
field provides a sequence number for the message. It is only valid in received messages; its value in sent messages is overwritten.mach_msg_id_t msgh_id
- The
mach_msg
call doesn't use themsgh_id
field, but it conventionally conveys an operation or function id.
This macro composes two
mach_msg_type_name_t
values that specify the port rights in themsgh_remote_port
andmsgh_local_port
fields of amach_msg
call into an appropriatemach_msg_bits_t
value.
This macro extracts the
mach_msg_type_name_t
value for the remote port right in amach_msg_bits_t
value.
This macro extracts the
mach_msg_type_name_t
value for the local port right in amach_msg_bits_t
value.
This macro extracts the
mach_msg_bits_t
component consisting of themach_msg_type_name_t
values for the remote and local port right in amach_msg_bits_t
value.
This macro extracts the
mach_msg_bits_t
component consisting of everything except themach_msg_type_name_t
values for the remote and local port right in amach_msg_bits_t
value.
Each data item has a type descriptor, a mach_msg_type_t
or a
mach_msg_type_long_t
. The mach_msg_type_long_t
type
descriptor allows larger values for some fields. The
msgtl_header
field in the long descriptor is only used for its
inline, longform, and deallocate bits.
This is an
unsigned int
and can be used to hold themsgt_name
component of themach_msg_type_t
andmach_msg_type_long_t
structure.
This is an
unsigned int
and can be used to hold themsgt_size
component of themach_msg_type_t
andmach_msg_type_long_t
structure.
This is an
natural_t
and can be used to hold themsgt_number
component of themach_msg_type_t
andmach_msg_type_long_t
structure.
This structure has the following members:
unsigned int msgt_name : 8
- The
msgt_name
field specifies the data's type. The following types are predefined:
MACH_MSG_TYPE_UNSTRUCTURED
MACH_MSG_TYPE_BIT
MACH_MSG_TYPE_BOOLEAN
MACH_MSG_TYPE_INTEGER_16
MACH_MSG_TYPE_INTEGER_32
MACH_MSG_TYPE_CHAR
MACH_MSG_TYPE_BYTE
MACH_MSG_TYPE_INTEGER_8
MACH_MSG_TYPE_REAL
MACH_MSG_TYPE_STRING
MACH_MSG_TYPE_STRING_C
MACH_MSG_TYPE_PORT_NAME
The following predefined types specify port rights, and receive special treatment. The next section discusses these types in detail. The type
MACH_MSG_TYPE_PORT_NAME
describes port right names, when no rights are being transferred, but just names. For this purpose, it should be used in preference toMACH_MSG_TYPE_INTEGER_32
.
MACH_MSG_TYPE_MOVE_RECEIVE
MACH_MSG_TYPE_MOVE_SEND
MACH_MSG_TYPE_MOVE_SEND_ONCE
MACH_MSG_TYPE_COPY_SEND
MACH_MSG_TYPE_MAKE_SEND
MACH_MSG_TYPE_MAKE_SEND_ONCE
msgt_size : 8
- The
msgt_size
field specifies the size of each datum, in bits. For example, the msgt_size ofMACH_MSG_TYPE_INTEGER_32
data is 32.msgt_number : 12
- The
msgt_number
field specifies how many data elements comprise the data item. Zero is a legitimate number.The total length specified by a type descriptor is
(msgt_size * msgt_number)
, rounded up to an integral number of bytes. In-line data is then padded to an integral number of long-words. This ensures that type descriptors always start on long-word boundaries. It implies that message sizes are always an integral multiple of a long-word's size.msgt_inline : 1
- The
msgt_inline
bit specifies, whenFALSE
, that the data actually resides in an out-of-line region. The address of the memory region (avm_offset_t
orvm_address_t
) follows the type descriptor in the message body. Themsgt_name
,msgt_size
, andmsgt_number
fields describe the memory region, not the address.msgt_longform : 1
- The
msgt_longform
bit specifies, whenTRUE
, that this type descriptor is amach_msg_type_long_t
instead of amach_msg_type_t
. Themsgt_name
,msgt_size
, andmsgt_number
fields should be zero. Instead,mach_msg
uses the followingmsgtl_name
,msgtl_size
, andmsgtl_number
fields.msgt_deallocate : 1
- The
msgt_deallocate
bit is used with out-of-line regions. WhenTRUE
, it specifies that the memory region should be deallocated from the sender's address space (as if withvm_deallocate
) when the message is sent.msgt_unused : 1
- The
msgt_unused
bit should be zero.
This macro returns
TRUE
if the given type name specifies a port type, otherwise it returnsFALSE
.
This macro returns
TRUE
if the given type name specifies a port type with a send or send-once right, otherwise it returnsFALSE
.