64-bit Data Models
In 32-bit programs, pointers and data types such as integers generally have the same length; this is not necessarily true on 64-bit machines. Mixing data types in programming languages such as C and its descendants such as C++ and Objective-C may thus function on 32-bit implementations but not on 64-bit implementations.
In many programming environments for C and C-derived languages on 64-bit machines, "int" variables are still 32 bits wide, but long integers and pointers are 64 bits wide. These are described as having an LP64 data model. Another alternative is the ILP64 data model in which all three data types are 64 bits wide, and even SILP64 where "short" integers are also 64 bits wide. However, in most cases the modifications required are relatively minor and straightforward, and many well-written programs can simply be recompiled for the new environment without changes. Another alternative is the LLP64 model, which maintains compatibility with 32-bit code by leaving both int and long as 32-bit. "LL" refers to the "long long integer" type, which is at least 64 bits on all platforms, including 32-bit environments.
Data model | short (integer) | int | long (integer) | long long | pointers/size_t | Sample operating systems |
---|---|---|---|---|---|---|
LLP64/ IL32P64 |
16 | 32 | 32 | 64 | 64 | Microsoft Windows (X64/IA-64) |
LP64/ I32LP64 |
16 | 32 | 64 | 64 | 64 | Most Unix and Unix-like systems, e.g. Solaris, Linux, and Mac OS X; z/OS |
ILP64 | 16 | 64 | 64 | 64 | 64 | HAL Computer Systems port of Solaris to SPARC64 |
SILP64 | 64 | 64 | 64 | 64 | 64 | Unicos |
Many 64-bit compilers today use the LP64 model (including Solaris, AIX, HP-UX, Linux, Mac OS X, FreeBSD, and IBM z/OS native compilers). Microsoft's Visual C++ compiler uses the LLP64 model. The disadvantage of the LP64 model is that storing a long into an int may overflow. On the other hand, casting a pointer to a long will work. In the LLP model, the reverse is true. These are not problems which affect fully standard-compliant code, but code is often written with implicit assumptions about the widths of integer types.
Note that a programming model is a choice made on a per-compiler basis, and several can coexist on the same OS. However, the programming model chosen as the primary model for the OS API typically dominates.
Another consideration is the data model used for drivers. Drivers make up the majority of the operating system code in most modern operating systems (although many may not be loaded when the operating system is running). Many drivers use pointers heavily to manipulate data, and in some cases have to load pointers of a certain size into the hardware they support for DMA. As an example, a driver for a 32-bit PCI device asking the device to DMA data into upper areas of a 64-bit machine's memory could not satisfy requests from the operating system to load data from the device to memory above the 4 gigabyte barrier, because the pointers for those addresses would not fit into the DMA registers of the device. This problem is solved by having the OS take the memory restrictions of the device into account when generating requests to drivers for DMA, or by using an IOMMU.
Read more about this topic: 64-bit Computing
Famous quotes containing the words data and/or models:
“To write it, it took three months; to conceive it three minutes; to collect the data in itall my life.”
—F. Scott Fitzgerald (18961940)
“Friends broaden our horizons. They serve as new models with whom we can identify. They allow us to be ourselvesand accept us that way. They enhance our self-esteem because they think were okay, because we matter to them. And because they matter to usfor various reasons, at various levels of intensitythey enrich the quality of our emotional life.”
—Judith Viorst (20th century)