Main index | Section 7 | Options |
If not explicitly mentioned, sizes are in bytes. The architecture details in this document apply to FreeBSD 10.0 and later, unless otherwise noted.
FreeBSD uses a flat address space. Variables of types unsigned long, uintptr_t, and size_t and pointers all have the same representation.
In order to maximize compatibility with future pointer integrity mechanisms, manipulations of pointers as integers should be performed via uintptr_t or intptr_t and no other types. In particular, long and ptrdiff_t should be avoided.
On some architectures, e.g. sparc64, powerpc and AIM variants of powerpc64, the kernel uses a separate address space. On other architectures, kernel and a user mode process share a single address space. The kernel is located at the highest addresses.
On each architecture, the main user mode thread's stack starts near the highest user address and grows down.
FreeBSD architecture support varies by release. This table shows the first FreeBSD release to support each architecture, and, for discontinued architectures, the final release.
Architecture | Initial Release | Final Release |
alpha | 3.2 | 6.4 |
amd64 | 5.1 | |
arm | 6.0 | |
armeb | 8.0 | |
armv6 | 10.0 | |
arm64 | 11.0 | |
ia64 | 5.0 | 10.x |
i386 | 1.0 | |
mips | 8.0 | |
mipsel | 9.0 | |
mipselhf | 12.0 | |
mipshf | 12.0 | |
mipsn32 | 9.0 | |
mips64 | 9.0 | |
mips64el | 9.0 | |
mips64elhf | 12.0 | |
mips64hf | 12.0 | |
pc98 | 2.2 | 11.x |
powerpc | 6.0 | |
powerpcspe | 12.0 | |
powerpc64 | 6.0 | |
riscv64 | 12.0 | |
riscv64sf | 12.0 | |
sparc64 | 5.0 |
ILP32 | int, long, void * types machine representations all have 4-byte size. |
LP64 | int type machine representation uses 4 bytes, while long and void * are 8 bytes. |
Some machines support more that one FreeBSD ABI. Typically these are 64-bit machines, where the "native" LP64 execution environment is accompanied by the "legacy" ILP32 environment, which was historical 32-bit predecessor for 64-bit evolution. Examples are:
LP64 | ILP32 counterpart |
amd64 | i386 |
powerpc64 | powerpc |
mips64* | mips* |
On all supported architectures:
Type | Size |
short | 2 |
int | 4 |
long | sizeof(void*) |
long long | 8 |
float | 4 |
double | 8 |
Machine-dependent type sizes:
Architecture | void * | long double | time_t |
amd64 | 8 | 16 | 8 |
arm | 4 | 8 | 8 |
armeb | 4 | 8 | 8 |
armv6 | 4 | 8 | 8 |
arm64 | 8 | 16 | 8 |
i386 | 4 | 12 | 4 |
mips | 4 | 8 | 8 |
mipsel | 4 | 8 | 8 |
mipselhf | 4 | 8 | 8 |
mipshf | 4 | 8 | 8 |
mipsn32 | 4 | 8 | 8 |
mips64 | 8 | 8 | 8 |
mips64el | 8 | 8 | 8 |
mips64elhf | 8 | 8 | 8 |
mips64hf | 8 | 8 | 8 |
powerpc | 4 | 8 | 4 |
powerpcspe | 4 | 8 | 4 |
powerpc64 | 8 | 8 | 8 |
riscv64 | 8 | 16 | 8 |
riscv64sf | 8 | 16 | 8 |
sparc64 | 8 | 16 | 8 |
time_t is 8 bytes on all supported architectures except i386 and 32-bit variants of powerpc.
Architecture | Endianness | char Signedness |
amd64 | little | signed |
arm | little | unsigned |
armeb | big | unsigned |
armv6 | little | unsigned |
arm64 | little | unsigned |
i386 | little | signed |
mips | big | signed |
mipsel | little | signed |
mipselhf | little | signed |
mipshf | big | signed |
mipsn32 | big | signed |
mips64 | big | signed |
mips64el | little | signed |
mips64elhf | little | signed |
mips64hf | big | signed |
powerpc | big | unsigned |
powerpcspe | big | unsigned |
powerpc64 | big | unsigned |
riscv64 | little | signed |
riscv64sf | little | signed |
sparc64 | big | signed |
Architecture | Page Sizes |
amd64 | 4K, 2M, 1G |
arm | 4K |
armeb | 4K |
armv6 | 4K, 1M |
arm64 | 4K, 2M, 1G |
i386 | 4K, 2M (PAE), 4M |
mips | 4K |
mipsel | 4K |
mipselhf | 4K |
mipshf | 4K |
mipsn32 | 4K |
mips64 | 4K |
mips64el | 4K |
mips64elhf | 4K |
mips64hf | 4K |
powerpc | 4K |
powerpcspe | 4K |
powerpc64 | 4K |
riscv64 | 4K |
riscv64sf | 4K |
sparc64 | 8K |
Architecture | float, double | long double |
amd64 | hard | hard, 80 bit |
arm | soft | soft, double precision |
armeb | soft | soft, double precision |
armv6 | hard(1) | hard, double precision |
arm64 | hard | soft, quad precision |
i386 | hard | hard, 80 bit |
mips | soft | identical to double |
mipsel | soft | identical to double |
mipselhf | hard | identical to double |
mipshf | hard | identical to double |
mipsn32 | soft | identical to double |
mips64 | soft | identical to double |
mips64el | soft | identical to double |
mips64elhf | hard | identical to double |
mips64hf | hard | identical to double |
powerpc | hard | hard, double precision |
powerpcspe | hard | hard, double precision |
powerpc64 | hard | hard, double precision |
riscv64 | hard | hard, double precision |
riscv64sf | soft | soft, double precision |
sparc64 | hard | hard, quad precision |
(1) Prior to FreeBSD 11.0, armv6 used the softfp ABI even though it supported only processors with a floating point unit.
The full set of predefined macros can be obtained with this command:
cc -x c -dM -E /dev/null
Common type size and endianness macros:
Macro | Meaning |
__LP64__ | 64-bit (8-byte) long and pointer, 32-bit (4-byte) int |
__ILP32__ | 32-bit (4-byte) int, long and pointer |
BYTE_ORDER | Either BIG_ENDIAN or LITTLE_ENDIAN. PDP11_ENDIAN is not used on FreeBSD . |
Architecture-specific macros:
Architecture | Predefined macros |
amd64 | __amd64__, __x86_64__ |
arm | __arm__ |
armeb | __arm__ |
armv6 | __arm__, __ARM_ARCH >= 6 |
arm64 | __aarch64__ |
i386 | __i386__ |
mips | __mips__, __MIPSEB__, __mips_o32 |
mipsel | __mips__, __mips_o32 |
mipselhf | __mips__, __mips_o32 |
mipshf | __mips__, __MIPSEB__, __mips_o32 |
mipsn32 | __mips__, __MIPSEB__, __mips_n32 |
mips64 | __mips__, __MIPSEB__, __mips_n64 |
mips64el | __mips__, __mips_n64 |
mips64elhf | __mips__, __mips_n64 |
mips64hf | __mips__, __MIPSEB__, __mips_n64 |
powerpc | __powerpc__ |
powerpcspe | __powerpc__, __SPE__ |
powerpc64 | __powerpc__, __powerpc64__ |
riscv64 | __riscv__, __riscv64 |
riscv64sf | __riscv__, __riscv64 |
sparc64 | __sparc64__ |
ARCH (7) | May 16, 2017 |
Main index | Section 7 | Options |
Please direct any comments about this manual page service to Ben Bullock.