pub struct ProcessId { /* private fields */ }
Expand description

Userspace process identifier.

This is an opaque type that can be used to represent a running process on the board without requiring an actual reference to a Process object. Having this ProcessId reference type is useful for managing ownership and type issues in Rust, but more importantly ProcessId serves as a tool for capsules to hold pointers to applications.

Since ProcessId implements Copy, having an ProcessId does not ensure that the process the ProcessId refers to is still valid. The process may have been removed, terminated, or restarted as a new process. Therefore, all uses of ProcessId in the kernel must check that the ProcessId is still valid. This check happens automatically when .index() is called, as noted by the return type: Option<usize>. .index() will return the index of the process in the processes array, but if the process no longer exists then None is returned.

Outside of the kernel crate, holders of an ProcessId may want to use .id() to retrieve a simple identifier for the process that can be communicated over a UART bus or syscall interface. This call is guaranteed to return a suitable identifier for the ProcessId, but does not check that the corresponding application still exists.

This type also provides capsules an interface for interacting with processes since they otherwise would have no reference to a Process. Very limited operations are available through this interface since capsules should not need to know the details of any given process. However, certain information makes certain capsules possible to implement. For example, capsules can use the get_editable_flash_range() function so they can safely allow an app to modify its own flash.


Create a new ProcessId object based on the app identifier and its index in the processes array.

This constructor is public but protected with a capability so that external implementations of Process can use it.

Get a usize unique identifier for the app this ProcessId refers to.

This function should not generally be used, instead code should just use the ProcessId object itself to refer to various apps on the system. However, getting just a usize identifier is particularly useful when referring to a specific app with things outside of the kernel, say for userspace (e.g. IPC) or tockloader (e.g. for debugging) where a concrete number is required.

Note, this will always return the saved unique identifier for the app originally referred to, even if that app no longer exists. For example, the app may have restarted, or may have been ended or removed by the kernel. Therefore, calling id() is not a valid way to check that an application still exists.

Returns the full address of the start and end of the flash region that the app owns and can write to. This includes the app’s code and data and any padding at the end of the app. It does not include the TBF header, or any space that the kernel is using for any potential bookkeeping.

Get the storage permissions for the process. These permissions indicate what the process is allowed to read and write. Returns None if the process has no storage permissions.

Trait Implementations

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.