A program to be loaded by the system must have at least one loadable segment (although this is not required by the file format). When the system creates loadable segments' memory images, it gives access permissions, as specified in the p_flags member. All bits included in the PF_MASKPROC mask are reserved for processor-specific semantics.
Table 7-37 Segment Flag Bits, p_flags
Name |
Value |
Meaning |
---|---|---|
PF_X |
0x1 |
Execute |
PF_W |
0x2 |
Write |
PF_R |
0x4 |
Read |
PF_MASKPROC |
0xf0000000 |
Unspecified |
If a permission bit is 0, that type of access is denied. Actual memory permissions depend on the memory management unit, which can vary from one system to another. Although all flag combinations are valid, the system can grant more access than requested. In no case, however, will a segment have write permission unless it is specified explicitly. The following figure shows both the exact flag interpretation and the allowable flag interpretation.
Table 7-38 Segment Permissions
Flags |
Value |
Exact |
Allowable |
---|---|---|---|
None |
0 |
All access denied |
All access denied |
PF_X |
1 |
Execute only |
Read, execute |
PF_W |
2 |
Write only |
Read, write, execute |
PF_W + PF_X |
3 |
Write, execute |
Read, write, execute |
PF_R |
4 |
Read only |
Read, execute |
PF_R + PF_X |
5 |
Read, execute |
Read, execute |
PF_R + PF_W |
6 |
Read, write |
Read, write, execute |
PF_R + PF_W + PF_X |
7 |
Read, write, execute |
Read, write, execute |
For example, typical text segments have read and execute, but not write permissions. Data segments normally have read, write, and execute permissions.