In Linux, as in UNIX, programs and commands are normally executed by a command
interpreter.
A command interpretter is a user process like any other process and is called a shell
.
There are many shells in Linux, some of the most popular are sh, bash and
tsch.
With the exception of a few built in commands, such as cd and pwd , a
command is an executable binary file.
For each command entered, the shell searches the directories in the processes search
path, held in the PATH environment variable, for an executable image with a matching
name.
If the file is found it is loaded and executed.
The shell clones itself using the fork mechanism described above and then the new child
process replaces the binary image that it was executing, the shell, with the contents of
the executable image file just found.
Normally the shell waits for the command to to complete, or rather for the child process
to exit.
You can cause the shell to run again by pushing the child process to the
background by typing control-Z causes a SIGSTOP signal to be sent to
the child process, stopping it.
You then use the shell command bg to push it into a background, the
shell sends it a SIGCONT signal to restart it, where it will stay
until either it ends or it needs to do terminal input or output.
An executable file can have many formats or even be a script file. Script files have to be recognized and the appropriate interpreter run to handle them; for example /bin/sh interprets shell scripts. Executable object files contain executable code and data together with enough information to allow the operating system to load them into memory and execute them. The most commonly used object file format used by Linux is ELF but, in theory, Linux is flexible enough to handle almost any object file format.
Figure: Registered Binary Formats
As with file systems, the binary formats supported by Linux are either built
into the kernel are kernel build time or available to be loaded as modules.
The kernel keeps a list of supported binary formats (see figure )
and when an attempt is made to execute a file is made, each binary format is tried
in turn until one works.
Commonly supported Linux binary formats are a.out and ELF. Executable files do not have to be read completely into memory, a technique known as demand loading is used. As each part of the executable image is used by a process it is brought into memory. Unused parts of the image may be discarded from memory.