loader(8)
NAME
loader - kernel bootstrapping final stage
DESCRIPTION
- The program called loader is the final stage of FreeBSD's
- kernel bootstrapping process. On IA32 (i386) architectures, it is a
- BTX client. It is linked statically to libstand(3) and usually located in
- the directory /boot.
- It provides a scripting language that can be used to auto
- mate tasks, do pre-configuration or assist in recovery procedures. This
- scripting language is roughly divided in two main components. The small
- er one is a set of commands designed for direct use by the casual user,
- called "builtin commands" for historical reasons. The main drive
- behind these commands is user-friendliness. The bigger component is an
- ANS Forth compatible Forth interpreter based on FICL, by John Sadler.
- During initialization, loader will probe for a console and
- set the console variable, or set it to serial console (``comcon
- sole'') if the previous boot stage used that. If multiple consoles are se
- lected, they will be listed separated by spaces. Then, devices are
- probed, currdev and loaddev are set, and LINES is set to 24. Next, FICL is
- initialized, the builtin words are added to its vocabulary, and
- /boot/boot.4th is processed if it exists. No disk switching is possible while
- that file is being read. The inner interpreter loader will use with FICL
- is then set to interpret, which is FICL's default. After that,
- /boot/loader.rc is processed if available, and, failing that, /boot/boot.conf
- is read for historical reasons. These files are processed through the
- include command, which reads all of them into memory before processing
- them, making disk changes possible.
- At this point, if an autoboot has not been tried, and if
- autoboot_delay is not set to ``NO'' (not case sensitive), then an autoboot
- will be tried. If the system gets past this point, prompt will be
- set and loader will engage interactive mode. Please note that historically
- even when autoboot_delay is set to ``0'' user will be able to inter
- rupt autoboot process by pressing some key on the console while kernel and
- modules are being loaded. In some cases such behaviour may be undesir
- able, to prevent it set autoboot_delay to ``-1'', in this case loader
- will engage interactive mode only if autoboot has failed.
BUILTIN COMMANDS
- In loader, builtin commands take parameters from the command
- line. Presently, the only way to call them from a script is by us
- ing evaluate on a string. If an error condition occurs, an exception
- will be generated, which can be intercepted using ANS Forth exception
- handling words. If not intercepted, an error message will be displayed and
- the interpreter's state will be reset, emptying the stack and restor
- ing interpreting mode.
- The builtin commands available are:
- autoboot [seconds [prompt]]
- Proceeds to bootstrap the system after a number of
- seconds, if not interrupted by the user. Displays a countdown
- prompt warning the user the system is about to be booted, unless
- interrupted by a key press. The kernel will be loaded first if
- necessary. Defaults to 10 seconds.
- bcachestat
- Displays statistics about disk cache usage. For
- depuration only.
- boot boot kernelname [...] boot -flag ...
- Immediately proceeds to bootstrap the system, load
- ing the kernel if necessary. Any flags or arguments are passed to
- the kernel, but they must precede the kernel name, if a kernel
- name is provided.
- WARNING: The behavior of this builtin is changed if
- loader.4th(8) is loaded.
- echo [-n] [<message>]
- Displays text on the screen. A new line will be
- printed unless -n is specified.
- heap Displays memory usage statistics. For debugging
- purposes only.
- help [topic [subtopic]]
- Shows help messages read from /boot/loader.help.
- The special topic index will list the topics available.
- include file [file ...]
- Process script files. Each file, in turn, is com
- pletely read into memory, and then each of its lines is passed to
- the command line interpreter. If any error is returned by the
- interpreter, the include command aborts immediately, without
- reading any other files, and returns an error itself (see ERRORS).
- load [-t type] file ...
- Loads a kernel, kernel loadable module (kld), or
- file of opaque contents tagged as being of the type type. Kernel
- and modules can be either in a.out or ELF format. Any arguments
- passed after the name of the file to be loaded will be passed as
- arguments to that file. Currently, argument passing does not
- work for the kernel.
- ls [-l] [path]
- Displays a listing of files in the directory path,
- or the root directory if path is not specified. If -l is speci
- fied, file sizes will be shown too.
- lsdev [-v]
- Lists all of the devices from which it may be possi
- ble to load modules. If -v is specified, more details are
- printed.
- lsmod [-v]
- Displays loaded modules. If -v is specified, more
- details are shown.
- more file [file ...]
- Display the files specified, with a pause at each
- LINES displayed.
- pnpscan [-v]
- Scans for Plug-and-Play devices. This is not func
- tional at present.
- read [-t seconds] [-p prompt] [variable]
- Reads a line of input from the terminal, storing it
- in variable if specified. A timeout can be specified with -t,
- though it will be canceled at the first key pressed. A prompt may
- also be displayed through the -p flag.
- reboot Immediately reboots the system.
- set variable set variable=value
- Set loader's environment variables.
- show [variable]
- Displays the specified variable's value, or all
- variables and their values if variable is not specified.
- unload Remove all modules from memory.
- unset variable
- Removes variable from the environment.
- ? Lists available commands.
- BUILTIN ENVIRONMENT VARIABLES
- The loader has actually two different kinds of `environment'
- variables. There are ANS Forth's environmental queries, and a separate
- space of environment variables used by builtins, which are not di
- rectly available to Forth words. It is the latter type that this section
- covers.
- Environment variables can be set and unset through the set
- and unset builtins, and can have their values interactively examined
- through the use of the show builtin. Their values can also be accessed
- as described in BUILTIN PARSER.
- Notice that these environment variables are not inherited by
- any shell after the system has been booted.
- A few variables are set automatically by loader. Others can
- affect the behavior of either loader or the kernel at boot. Some op
- tions may require a value, while others define behavior just by being
- set. Both types of builtin variables are described below.
- acpi_load
Unset this to disable automatic loading of theACPI module. See also hint.acpi.0.disabled in device.hints(5).
- autoboot_delay
- Number of seconds autoboot will wait before boot
- ing. If this variable is not defined, autoboot will default to
- 10 seconds.
- If set to ``NO'', no autoboot will be automatical
- ly attempted after processing /boot/loader.rc, though explicit
- autoboot's will be processed normally, defaulting to 10 sec
- onds delay.
- If set to ``0'', no delay will be inserted, but
- user still will be able to interrupt autoboot process and escape
- into the interactive mode by pressing some key on the con
- sole while kernel and modules are being loaded.
- If set to ``-1'', no delay will be inserted and
- loader will engage interactive mode only if autoboot has
- failed for some reason.
- boot_askname
- Instructs the kernel to prompt the user for the
- name of the root device when the kernel is booted.
- boot_cdrom
- Instructs the kernel to try to mount the root file
- system from CD-ROM.
- boot_ddb Instructs the kernel to start in the DDB debugger,
- rather than
- proceeding to initialize when booted.
- boot_dfltroot
- Instructs the kernel to mount the statically com
- piled-in root file system.
- boot_gdb Selects gdb-remote mode for the kernel debugger by
- default.
- boot_multicons
- Enables multiple console support in the kernel
- early on boot. In a running system, console configuration can be
- manipulated by the conscontrol(8) utility.
- boot_mute
- All console output is suppressed when console is
- muted. In a running system, the state of console muting can be
- manipulated by the conscontrol(8) utility.
- boot_pause
- During the device probe, pause after each line is
- printed.
- boot_serial
- Force the use of a serial console even when an in
- ternal console is present.
- boot_single
- Prevents the kernel from initiating a multi-user
- startup; instead, a single-user mode will be entered when
- the kernel has finished device probing.
- boot_verbose
- Setting this variable causes extra debugging in
- formation to be printed by the kernel during the boot phase.
- bootfile List of semicolon-separated search path for
- bootable kernels.
- The default is ``kernel''.
- comconsole_speed
- Defines the speed of the serial console (i386 and
- amd64 only). If the previous boot stage indicated that a serial
- console is in use then this variable is initialized to the
- current speed of the console serial port. Otherwise it is set
- to 9600 unless this was overridden using the
- BOOT_COMCONSOLE_SPEED variable when loader was compiled. Changes to the
- comconsole_speed variable take effect immediately.
- console Defines the current console or consoles. Multiple
- consoles may
- be specified. In that case, the first listed con
- sole will become the default console for userland output
- (e.g. from init(8)).
- currdev Selects the default device. Syntax for devices is
- odd.
- init_path
- Sets the list of binaries which the kernel will
- try to run as the initial process. The first matching binary is
- used. The default list is ``/sbin/init:/sbin/oinit:/sbin/init.bak:/res
- cue/init:/stand/sysinstall''.
- interpret
- Has the value ``OK'' if the Forth's current state
- is interpreting.
- LINES Define the number of lines on the screen, to be
- used by the
- pager.
- module_path
- Sets the list of directories which will be
- searched for modules named in a load command or implicitly required by
- a dependency. The default value for this variable is ``/boot/kernel;/boot/modules''.
- num_ide_disks
- Sets the number of IDE disks as a workaround for
- some problems in finding the root disk at boot. This has been
- deprecated in favor of root_disk_unit.
- prompt Value of loader's prompt. Defaults to ``${inter
- pret}''. If
- variable prompt is unset, the default prompt is
- `>'.
- root_disk_unit
- If the code which detects the disk unit number for
- the root disk is confused, e.g. by a mix of SCSI and IDE
- disks, or IDE disks with gaps in the sequence (e.g. no primary
- slave), the unit number can be forced by setting this vari
- able.
- rootdev By default the value of currdev is used to set the
- root file
- system when the kernel is booted. This can be
- overridden by setting rootdev explicitly.
- Other variables are used to override kernel tunable parame
- ters. The following tunables are available:
- hw.physmem Limit the amount of physical memory the system
- will use.
- By default the size is in bytes, but the k, K,
- m, M, g and G suffixes are also accepted and indicate
- kilobytes, megabytes and gigabytes respectively. An in
- valid suffix will result in the variable being ignored by
- the kernel.
- hw.pci.host_start_mem, hw.acpi.host_start_mem
- When not otherwise constrained, this limits
- the memory start address. The default is 0x80000000 and
- should be set to at least size of the memory and not con
- flict with other resources. Typically, only systems without
- PCI bridges need to set this variable since PCI bridges
- typically constrain the memory starting address (and the
- variable is only used when bridges do not constrain this
- address).
- hw.pci.enable_io_modes
- Enable PCI resources which are left off by
- some BIOSes or are not enabled correctly by the device driv
- er. Tunable value set to ON (1) by default, but this may
- cause problems with some peripherals.
- kern.maxusers
- Set the size of a number of statically allo
- cated system tables; see tuning(7) for a description of how
- to select an appropriate value for this tunable. When set,
- this tunable replaces the value declared in the kernel com
- pile-time configuration file.
- kern.ipc.nmbclusters
- Set the number of mbuf clusters to be allocat
- ed. The value cannot be set below the default determined
- when the kernel was compiled. Modifies NMBCLUSTERS.
- kern.ipc.nsfbufs
- Set the number of sendfile(2) buffers to be
- allocated. Overrides NSFBUFS.
- kern.maxswzone
- Limits the amount of KVM to be used to hold
- swap meta information, which directly governs the maxi
- mum amount of swap the system can support. This value is
- specified in bytes of KVA space and defaults to around
- 70MBytes. Care should be taken to not reduce this value such
- that the actual amount of configured swap exceeds 1/2
- the kernelsupported swap. The default 70MB allows the
- kernel to support a maximum of (approximately) 14GB of con
- figured swap. Only mess around with this parameter if you
- need to greatly extend the KVM reservation for other resources
- such as the buffer cache or NMBCLUSTERS. Modifies
- VM_SWZONE_SIZE_MAX.
- kern.maxbcache
- Limits the amount of KVM reserved for use by
- the buffer cache, specified in bytes. The default maxi
- mum is 200MB. This parameter is used to prevent the buffer
- cache from eating too much KVM in large-memory machine
- configurations. Only mess around with this parameter if you
- need to greatly extend the KVM reservation for other resources
- such as the swap zone or NMBCLUSTERS. Note that the NBUF
- parameter will override this limit. Modifies
- VM_BCACHE_SIZE_MAX.
- machdep.disable_mtrrs
- Disable the use of i686 MTRRs (x86 only).
- net.inet.tcp.tcbhashsize
- Overrides the compile-time set value of TCB
- HASHSIZE or the preset default of 512. Must be a power of 2.
- vm.kmem_size Sets the size of kernel memory (bytes). This
- overrides the
- value determined when the kernel was compiled.
- Modifies VM_KMEM_SIZE.
- BUILTIN PARSER
- When a builtin command is executed, the rest of the line is
- taken by it as arguments, and it is processed by a special parser which
- is not used for regular Forth commands.
- This special parser applies the following rules to the
- parsed text:
- 1. All backslash characters are preprocessed. , and are processed as in C.
- +o ,,
- +o is converted to a space.
- +o is converted to ASCII 11.
- +o is just skipped. Useful for things like `` xfxf''.
- +o xN and xNN are replaced by the hex N or NN.
- +o is replaced by the octal NNN ASCII character.
- +o from receiving special treatment in Step 2, de
- scribed below.
- +o will be replaced with a single .
- +o In any other occurrence, backslash will just be re
- moved.
- 2. Every string between non-escaped quotes or double
- quotes will be treated as a single word for the purposes of the re
- maining steps.
- 3. Replace any $VARIABLE or ${VARIABLE} with the value of
- the environ ment variable VARIABLE.
- 4. Space-delimited arguments are passed to the called
- builtin command. Spaces can also be escaped through the use of .
- An exception to this parsing rule exists, and is described
- in BUILTINS AND FORTH.
- BUILTINS AND FORTH All builtin words are state-smart, immediate words. If in
- terpreted, they behave exactly as described previously. If they are com
- piled, though, they extract their arguments from the stack instead of the
- command line.
- If compiled, the builtin words expect to find, at execution
- time, the following parameters on the stack: addrN lenN ... addr2 len2 addr1 len1 N
- where addrX lenX are strings which will compose the command
- line that will be parsed into the builtin's arguments. Internally,
- these strings are concatenated in from 1 to N, with a space put between
- each one.
- If no arguments are passed, a 0 must be passed, even if the
- builtin accepts no arguments.
- While this behavior has benefits, it has its trade-offs. If
- the execution token of a builtin is acquired (through ' or [']), and
- then passed to catch or execute, the builtin behavior will depend on the
- system state at the time catch or execute is processed! This is particu
- larly annoying for programs that want or need to handle exceptions. In
- this case, the use of a proxy is recommended. For example: : (boot) boot;
FICL
- FICL is a Forth interpreter written in C, in the form of a
- forth virtual machine library that can be called by C functions and vice
- versa.
- In loader, each line read interactively is then fed to FICL,
- which may call loader back to execute the builtin words. The builtin
- include will also feed FICL, one line at a time.
- The words available to FICL can be classified into four
- groups. The ANS Forth standard words, extra FICL words, extra FreeBSD words,
- and the builtin commands; the latter were already described. The
- ANS Forth standard words are listed in the STANDARDS section. The words
- falling in the two other groups are described in the following subsections.
- FICL EXTRA WORDS
- .env
- .ver
- -roll
- 2constant
- >name
- body>
- compare This is the STRING word set's compare.
- compile-only
- endif
- forget-wid
- parse-word
- sliteral This is the STRING word set's sliteral.
- wid-set-super
- w@
- w!
- x.
- empty
- cell
- -rot
- FREEBSD EXTRA WORDS
- $ (--) Evaluates the remainder of the input buffer, after
- having printed it first.
- % (--) Evaluates the remainder of the input buffer under
- a catch exception guard.
- .# Works like . but without outputting a trailing
- space.
- fclose (fd --) Closes a file.
- fkey (fd -- char) Reads a single character from a file.
- fload (fd --) Processes a file fd.
- fopen (addr len mode -- fd) Opens a file. Returns a file descriptor, or -1 in
- case of failure. The mode parameter selects whether the
- file is to be opened for read access, write access, or both.
- The constants O_RDONLY, O_WRONLY, and O_RDWR are defined in /boot/support.4th, indicating read only, write on
- ly, and readwrite access, respectively.
- fread (fd addr len -- len') Tries to read len bytes from file fd into buffer
- addr. Returns the actual number of bytes read, or -1 in case of
- error or end of file.
- heap? (-- cells) Return the space remaining in the dictionary heap,
- in cells. This is not related to the heap used by dynamic
- memory allocation words.
- inb (port -- char) Reads a byte from a port.
- key (-- char) Reads a single character from the console.
- key? (-- flag) Returns true if there is a character available to
- be read from the console.
- ms (u --) Waits u microseconds.
- outb (port char --) Writes a byte to a port.
- seconds (-- u) Returns the number of seconds since midnight.
- tib> (-- addr len) Returns the remainder of the input buffer as a
- string on the stack.
- trace! (flag --) Activates or deactivates tracing. Does not work
- with catch.
- FREEBSD DEFINED ENVIRONMENTAL QUERIES
- arch-i386 TRUE if the architecture is IA32.
- arch-alpha TRUE if the architecture is AXP.
- FreeBSD_version FreeBSD version at compile time.
- loader_version loader version.
- SYSTEM DOCUMENTATION
FILES
- /boot/loader loader itself. /boot/boot.4th Additional FICL initialization. /boot/boot.conf loader bootstrapping script.
- Deprecated. /boot/defaults/loader.conf /boot/loader.conf /boot/loader.conf.local loader configuration files, as
- described in loader.conf(5).
- /boot/loader.rc loader bootstrapping script. /boot/loader.help Loaded by help. Contains the
- help messages.
EXAMPLES
- Boot in single user mode:
- boot -s
- Load the kernel, a splash screen, and then autoboot in five
- seconds. Notice that a kernel must be loaded before any other load
- command is attempted.
- load kernel load splash_bmp load -t splash_image_data /boot/chuckrulez.bmp autoboot 5
- Set the disk unit of the root device to 2, and then boot.
- This would be needed in a system with two IDE disks, with the second IDE
- disk hardwired to wd2 instead of wd1.
- set root_disk_unit=2 boot /kernel
- See also:
- /boot/loader.4th Extra builtin-like words.
- /boot/support.4th loader.conf processing
- words.
- /usr/share/examples/bootforth/ Assorted examples.
ERRORS
- The following values are thrown by loader:
- 100 Any type of error in the processing of a
- builtin.
- -1 Abort executed.
- -2 Abort" executed.
- -56 Quit executed.
- -256 Out of interpreting text.
- -257 Need more text to succeed -- will finish on
- next run.
- -258 Bye executed.
- -259 Unspecified error.
SEE ALSO
libstand(3), loader.conf(5), tuning(7), boot(8), btxld(8)
STANDARDS
- For the purposes of ANS Forth compliance, loader is an ANS
- Forth System with Environmental Restrictions, Providing .(, :noname, ?do,
- parse, pick, roll, refill, to, value, false, true, <>, 0<>, compile, ,
- erase, nip, tuck and marker from the Core Extensions word set, Providing
- the Exception Extensions word set, Providing the Locals Extensions
- word set, Providing the Memory-Allocation Extensions word set, Providing get, see, words, [if], [else] and [then] from the
- Programming-Tools extension word set, Providing the Search-Order extensions
- word set.
HISTORY
The loader first appeared in FreeBSD 3.1.
AUTHORS
- The loader was written by Michael Smith <msmith@FreeB
- SD.org>.
- FICL was written by John Sadler <john_sadler@alum.mit.edu>.
BUGS
- The expect and accept words will read from the input buffer
- instead of the console. The latter will be fixed, but the former will
- not.
- BSD September 22, 2005