[[!meta copyright="Copyright © 2002, 2003, 2010, 2012 Free Software Foundation, Inc."]] [[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable id="license" text="Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled [[GNU Free Documentation License|/fdl]]."]]"""]] *Messages* are collections of typed data, with a defined layout, including an [[ID|msgh_id]]. They are used for [[IPC]], and are sent to and received from [[port]]s using the `mach_msg` interface. These messages are not only opaque data. They can also contain [[port rights|port]] to be passed to another [[task]]. Port rights are either *copied* or *moved*. Notice that port receive right must be moved but not copied because there can't be more than one task that holds the receive right to a port. The receiving task creates new local port name to the port rights it received. Some data in the message can be *out-of-line data*. In the message, these are *references* to memory regions ([[memory_object]]s) that are *virtually copied*. When the message is received in a task, these virtual copies become part of the task by mapping them into the receiver's [[virtual_address_space]]. Another key concept that is applied is using *copy-on-write*, which means that data is not copied immediately, but only when it is changed. This is primarily used to send large blocks of data efficiently, as it is too expensive to store them in the kernel address space: extra copied need only be made at the moment that the memory regions begin to diverge, by threads modifying them.