As mentioned in Chapter 1, a neat feature of Linux is its ability to execute files compiled for other operating systems. Of course, this is possible only if the files include machine code for the same computer architecture on which the kernel is running. Two kinds of support are offered for these "foreign" programs:
Emulated execution: necessary to execute programs that include system calls that are not POSIX-compliant
Native execution: valid for programs whose system calls are totally POSIX-compliant
Microsoft MS-DOS and Windows programs are emulated: they cannot be natively executed, because they include APIs that are not recognized by Linux. An emulator such as DOSemu or Wine (which appeared in the example at the end of the previous section) is invoked to translate each API call into an emulating wrapper function call, which in turn uses the existing Linux system calls. Because emulators are mostly implemented as User Mode applications, we don't discuss them further.
On the other hand, POSIX-compliant programs compiled on operating
systems other than Linux can be executed without too much trouble,
because POSIX operating systems offer similar APIs. (Actually, the APIs
should be identical, although this is not always the case.) Minor
differences that the kernel must iron out usually refer to how system
calls are invoked or how the various signals are numbered. This
information is stored in execution domain
descriptors of type
A process specifies ...