Compiling kernels

The source for the Plan 9 kernels (other than the original standalone file server kernels in /sys/src/fs) is kept in /sys/src/9. The distribution includes kernels for the Intel PC, the Alpha PC, a MIPS-based workstation called a Carrera, the Compaq iPAQ (bitsy), and a PowerPC-based embedded system.

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)

HOW TO CONFIGURE A CUSTOM KERNEL

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).)

COMPILING WITHOUT WRITE PERMISSIONS FOR /SYS

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.