The machine-independent source code is in /sys/src/9/port. Each architecture also has a machine-dependent directory: pc, alphapc, carrera, mpc, and so on.
To build a kernel for a pre-existing configuration you cd into the corresponding arch directory and then run mk with the CONF variable set to the configuration file you want to use.
For example to build the default terminal kernel pcf:
cd /sys/src/9/pc mk 'CONF=pcf'
To install the new kernel copy the generated kernel with the name of the config file preceded by 9(eg., 9pcf) to your 9fat directory:
9fat: cp /sys/src/9/pc/9pcf /n/9fat/
It is recommended that you keep your old kernel around so you can boot it in case something is wrong with the new one, for details of how to do this see plan9.ini(8)
A distinction is made between the kernel configuration for terminals and for CPU servers: they have slightly different boot sequences, and different kernel-to-user memory ratios.
Each kernel is described by a configuration file. For example, this is an abridged version of the pcdisk terminal configuration file /sys/src/9/pc/pcdisk.
dev root cons arch env ip link ether2000 ether8390 ethermedium misc archmp mp apic kfs.root vgamach64xx +cur vgamga2164w +cur ip il tcp port int cpuserver = 0; boot boot #S/sdC0/ il local
The format is simple: each word on each indented line is the name of an object file to link. The non-indented lines mark sections. You can include or exclude various drivers by inserting or removing lines.
The bootdir section describes how the the #//boot directory is populated.
You might want to edit a pre-existing kernel configuration file if for example you want to build a standalone terminal/CPU/auth server but the default server configuration doesn't have your video card driver. To rebuild 9pccpuf with your card driver, edit /sys/src/9/pc/pccpuf and add the appropriate vga line.
For multiprocessors, make sure the line
archmp mp apic
appears in your config file or the new kernel will only use one CPU.
Then rebuild that kernel and install it:
cd /sys/src/9/pc mk 'CONF=pccpuf' cp 9pccpuf /386 9fat: cp 9pccpuf /n/9fat/
The argument to mk specifies which configuration file to use. The default for the pc kernels is ``pc''.
It is usually best to play in a copy of the config files rather than edit them directly. Then you can mk with
mk 'CONF=pcmyusername'
But even if you overwrite the existing files, remember that you can always refer to the originals stored in /n/dump (see yesterday(1).)
Personally, I prefer not to pollute my default install files. I create a set of empty directories that mirror /sys/src with srcbind:
#!/bin/rc
if(! test -d $1) exit 'base directory not found (test -d ' ^$1 ^' failed)'
for (d in (sys sys/src sys/src/9) ) if(! test -d $1/$d ) mkdir $1/$d
for(d in (boot port pc)) if(! test -d $1/sys/src/9/$d ) mkdir $1/sys/src/9/$d
bind -b -c $1/sys/src/9/boot /sys/src/9/boot bind -b -c $1/sys/src/9/port /sys/src/9/port bind -b -c $1/sys/src/9/pc /sys/src/9/pc
and then
ramfs srcbind /tmp cp /sys/src/9/pc/pcf /tmp/sys/src/9/pc/pcf
edit pcf
cd /sys/src/9/pc mk 'CONF=pcf'
ls -l /tmp/sys/src/9/pc/9pcf
--rwxrwxr-x M 111 maht maht 2446793 Mar 5 22:56 /tmp/sys/src/9/pc/9pcf
It would be wise not to use ramfs if you want to keep your updated copy of pcf
Copy to 9fat and /386 in the normal way. You only need it in /386 if you boot diskless terminals as they get their kernels from /386
In this way you can compile and use a new kernel without having to be in sys or have write permissions turned off.