|
|
1.1 ! root 1: .\" Copyright (c) 1983 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)3.t 6.2 (Berkeley) 6/3/86 ! 6: .\" ! 7: .\".ds RH "System Building Process ! 8: .ne 2i ! 9: .NH ! 10: SYSTEM BUILDING PROCESS ! 11: .PP ! 12: In this section we consider the steps necessary to build a bootable system ! 13: image. We assume the system source is located in the ``/sys'' directory ! 14: and that, initially, the system is being configured from source code. ! 15: .PP ! 16: Under normal circumstances there are 5 steps in building a system. ! 17: .IP 1) 3 ! 18: Create a configuration file for the system. ! 19: .IP 2) 3 ! 20: Make a directory for the system to be constructed in. ! 21: .IP 3) 3 ! 22: Run ! 23: .I config ! 24: on the configuration file to generate the files required ! 25: to compile and load the system image. ! 26: .IP 4) ! 27: Construct the source code interdependency rules for the ! 28: configured system with ! 29: .I make depend ! 30: using ! 31: .IR make (1). ! 32: .IP 5) ! 33: Compile and load the system with ! 34: .IR make . ! 35: .PP ! 36: Steps 1 and 2 are usually done only once. When a system configuration ! 37: changes it usually suffices to just run ! 38: .I config ! 39: on the modified configuration file, rebuild the source code dependencies, ! 40: and remake the system. Sometimes, ! 41: however, configuration dependencies may not be noticed in which case ! 42: it is necessary to clean out the relocatable object files saved ! 43: in the system's directory; this will be discussed later. ! 44: .NH 2 ! 45: Creating a configuration file ! 46: .PP ! 47: Configuration files normally reside in the directory ``/sys/conf''. ! 48: A configuration file is most easily constructed by copying an ! 49: existing configuration file and modifying it. The 4.3BSD distribution ! 50: contains a number of configuration files for machines at Berkeley; ! 51: one may be suitable or, in worst case, a copy ! 52: of the generic configuration file may be edited. ! 53: .PP ! 54: The configuration file must have the same name as the directory in ! 55: which the configured system is to be built. ! 56: Further, ! 57: .I config ! 58: assumes this directory is located in the parent directory of ! 59: the directory in which it ! 60: is run. For example, the generic ! 61: system has a configuration file ``/sys/conf/GENERIC'' and an accompanying ! 62: directory named ``/sys/GENERIC''. ! 63: Although it is not required that the system sources and configuration ! 64: files reside in ``/sys,'' the configuration and compilation procedure ! 65: depends on the relative locations of directories within that hierarchy, ! 66: as most of the system code and the files created by ! 67: .I config ! 68: use pathnames of the form ``../''. ! 69: If the system files are not located in ``/sys,'' ! 70: it is desirable to make a symbolic link there for use in installation ! 71: of other parts of the system that share files with the kernel. ! 72: .PP ! 73: When building the configuration file, be sure to include the items ! 74: described in section 2. In particular, the machine type, ! 75: cpu type, timezone, system identifier, maximum users, and root device ! 76: must be specified. The specification of the hardware present may take ! 77: a bit of work; particularly if your hardware is configured at non-standard ! 78: places (e.g. device registers located at funny places or devices not ! 79: supported by the system). Section 4 of this document ! 80: gives a detailed description of the configuration file syntax, ! 81: section 5 explains some sample configuration files, and ! 82: section 6 discusses how to add new devices to ! 83: the system. If the devices to be configured are not already ! 84: described in one of the existing configuration files you should check ! 85: the manual pages in section 4 of the UNIX Programmers Manual. For each ! 86: supported device, the manual page synopsis entry gives a ! 87: sample configuration line. ! 88: .PP ! 89: Once the configuration file is complete, run it through ! 90: .I config ! 91: and look for any errors. Never try and use a system which ! 92: .I config ! 93: has complained about; the results are unpredictable. ! 94: For the most part, ! 95: .IR config 's ! 96: error diagnostics are self explanatory. It may be the case that ! 97: the line numbers given with the error messages are off by one. ! 98: .PP ! 99: A successful run of ! 100: .I config ! 101: on your configuration file will generate a number of files in ! 102: the configuration directory. These files are: ! 103: .IP \(bu 3 ! 104: A file to be used by \fImake\fP\|(1) ! 105: in compiling and loading the system, ! 106: .IR Makefile . ! 107: .IP \(bu 3 ! 108: One file for each possible system image for this machine, ! 109: .IR swapxxx.c , ! 110: where ! 111: .I xxx ! 112: is the name of the system image, ! 113: which describes where swapping, the root file system, and other ! 114: miscellaneous system devices are located. ! 115: .IP \(bu 3 ! 116: A collection of header files, one per possible device the ! 117: system supports, which define the hardware configured. ! 118: .IP \(bu 3 ! 119: A file containing the I/O configuration tables used by the system ! 120: during its ! 121: .I autoconfiguration ! 122: phase, ! 123: .IR ioconf.c . ! 124: .IP \(bu 3 ! 125: An assembly language file of interrupt vectors which ! 126: connect interrupts from the machine's external buses to the main ! 127: system path for handling interrupts, ! 128: and a file that contains counters and names for the interrupt vectors. ! 129: .PP ! 130: Unless you have reason to doubt ! 131: .IR config , ! 132: or are curious how the system's autoconfiguration scheme ! 133: works, you should never have to look at any of these files. ! 134: .NH 2 ! 135: Constructing source code dependencies ! 136: .PP ! 137: When ! 138: .I config ! 139: is done generating the files needed to compile and link your system it ! 140: will terminate with a message of the form ``Don't forget to run make depend''. ! 141: This is a reminder that you should change over to the configuration ! 142: directory for the system just configured and type ``make depend'' ! 143: to build the rules used by ! 144: .I make ! 145: to recognize interdependencies in the system source code. ! 146: This will insure that any changes to a piece of the system ! 147: source code will result in the proper modules being recompiled ! 148: the next time ! 149: .I make ! 150: is run. ! 151: .PP ! 152: This step is particularly important if your site makes changes ! 153: to the system include files. The rules generated specify which source code ! 154: files are dependent on which include files. Without these rules, ! 155: .I make ! 156: will not recognize when it must rebuild modules ! 157: due to the modification of a system header file. ! 158: The dependency rules are generated by a pass of the C preprocessor ! 159: and reflect the global system options. ! 160: This step must be repeated when the configuration file is changed ! 161: and ! 162: .I config ! 163: is used to regenerate the system makefile. ! 164: .NH 2 ! 165: Building the system ! 166: .PP ! 167: The makefile constructed by ! 168: .I config ! 169: should allow a new system to be rebuilt by simply typing ``make image-name''. ! 170: For example, if you have named your bootable system image ``vmunix'', ! 171: then ``make vmunix'' ! 172: will generate a bootable image named ``vmunix''. Alternate system image names ! 173: are used when the root file system location and/or swapping configuration ! 174: is done in more than one way. The makefile which ! 175: .I config ! 176: creates has entry points for each system image defined in ! 177: the configuration file. ! 178: Thus, if you have configured ``vmunix'' to be a system with the root file ! 179: system on an ``hp'' device and ``hkvmunix'' to be a system with the root ! 180: file system on an ``hk'' device, then ``make vmunix hkvmunix'' will generate ! 181: binary images for each. ! 182: As the system will generally use the disk from which it is loaded ! 183: as the root filesystem, separate system images are only required ! 184: to support different swap configurations. ! 185: .PP ! 186: Note that the name of a bootable image is different from the system ! 187: identifier. All bootable images are configured for the same system; ! 188: only the information about the root file system and paging devices differ. ! 189: (This is described in more detail in section 4.) ! 190: .PP ! 191: The last step in the system building process is to rearrange certain commonly ! 192: used symbols in the symbol table of the system image; the makefile ! 193: generated by ! 194: .I config ! 195: does this automatically for you. ! 196: This is advantageous for programs such as ! 197: \fInetstat\fP\|(1) and \fIvmstat\fP\|(1), ! 198: which run much faster when the symbols they need are located at ! 199: the front of the symbol table. ! 200: Remember also that many programs expect ! 201: the currently executing system to be named ``/vmunix''. If you install ! 202: a new system and name it something other than ``/vmunix'', many programs ! 203: are likely to give strange results. ! 204: .NH 2 ! 205: Sharing object modules ! 206: .PP ! 207: If you have many systems which are all built on a single machine ! 208: there are at least two approaches to saving time in building system ! 209: images. The best way is to have a single system image which is run on ! 210: all machines. This is attractive since it minimizes disk space used ! 211: and time required to rebuild systems after making changes. However, ! 212: it is often the case that one or more systems will require a separately ! 213: configured system image. This may be due to limited memory (building ! 214: a system with many unused device drivers can be expensive), or to ! 215: configuration requirements (one machine may be a development machine ! 216: where disk quotas are not needed, while another is a production machine ! 217: where they are), etc. In these cases it is possible ! 218: for common systems to share relocatable object modules which are not ! 219: configuration dependent; most of the modules in the directory ``/sys/sys'' ! 220: are of this sort. ! 221: .PP ! 222: To share object modules, a generic system should be built. Then, for ! 223: each system configure the system as before, but before recompiling and ! 224: linking the system, type ``make links'' in the system compilation directory. ! 225: This will cause the system ! 226: to be searched for source modules which are safe to share between systems ! 227: and generate symbolic links in the current directory to the appropriate ! 228: object modules in the directory ``../GENERIC''. A shell script, ! 229: ``makelinks'' is generated with this request and may be checked for ! 230: correctness. The file ``/sys/conf/defines'' contains a list of symbols ! 231: which we believe are safe to ignore when checking the source code ! 232: for modules which may be shared. Note that this list includes the definitions ! 233: used to conditionally compile in the virtual memory tracing facilities, and ! 234: the trace point support used only rarely (even at Berkeley). ! 235: It may be necessary ! 236: to modify this file to reflect local needs. Note further that ! 237: interdependencies which are not directly visible ! 238: in the source code are not caught. This means that if you place ! 239: per-system dependencies in an include file, they will not be recognized ! 240: and the shared code may be selected in an unexpected fashion. ! 241: .NH 2 ! 242: Building profiled systems ! 243: .PP ! 244: It is simple to configure a system which will automatically ! 245: collect profiling information as it operates. The profiling data ! 246: may be collected with \fIkgmon\fP\|(8) and processed with ! 247: \fIgprof\fP\|(1) ! 248: to obtain information regarding the system's operation. Profiled ! 249: systems maintain histograms of the program counter as well as the ! 250: number of invocations of each routine. The \fIgprof\fP ! 251: command will also generate a dynamic call graph of the executing ! 252: system and propagate time spent in each routine along the arcs ! 253: of the call graph (consult the \fIgprof\fP documentation for elaboration). ! 254: The program counter sampling can be driven by the system clock, or ! 255: if you have an alternate real time clock, this can be used. The ! 256: latter is highly recommended, as use of the system clock will result ! 257: in statistical anomalies, and time spent in the clock routine will ! 258: not be accurately attributed. ! 259: .PP ! 260: To configure a profiled system, the ! 261: .B \-p ! 262: option should be supplied to \fIconfig\fP. ! 263: A profiled system is about 5-10% larger in its text space due to ! 264: the calls to count the subroutine invocations. When the system ! 265: executes, the profiling data is stored in a buffer which is 1.2 ! 266: times the size of the text space. The overhead for running a ! 267: profiled system varies; under normal load we see anywhere from 5-25% ! 268: of the system time spent in the profiling code. ! 269: .PP ! 270: Note that systems configured for profiling should not be shared as ! 271: described above unless all the other shared systems are also to be ! 272: profiled.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.