The following information are adapted from the page of Rik van Riel. They concern 2.0.x as well as 2.2.x kernels, and 2.4.x.
First of all, the IA32 Intel architecture is limited by construction in its memory management to 4 GB. Space which should be divided into virtual memory and physical memory. Which means that if you choose to recognize more RAM, the maximum size for a program decreases.
But Linux can't manage more than 1 GB by default. To go above that, in fact up to 2 GB today, because Linux can't manage more memory for the moment, you need to modify 2 files provided with kernel sources and recompile it. Those 2 sources are /usr/src/linux/include/asm-i386/page.h and /usr/src/linux/arch/i386/vmlinux.lds.
From 2.0.37 and 2.2.12 kernels on, the patch was integrated in the kernel and may be activated when doing a make {menu,x}config.
The maximum Ram managed in the i386 version was ported to 64 GB after 2.3.23.
Up to the version 2.8x of the util-linux package, the mkswap command could create swap partitions only up to 128 MB maximum. You then had to create as much partitions as necessary. Till the 2.9 version, included in standard in RedHat 6.0 and following distributions, it's possible to create directly swap partitions up to 2 GB and to 8 partitions.
Multi-processing is supported by Linux operationnaly till the 2.0 version of the kernel. For a 2.0.x kernel, you have to recompile it and set up the SMP variable in the Makefile to 1. For a 2.2.x or 2.4.x kernel, you have to set it up during the make {menu,x}config. For more details, please consult the SMP-HOWTO.
Generally, Linux is Y2K compatible. For more information please consult the FAQ.
For 2.2.x kernels, you need to edit the file /usr/src/linux/include/linux/tasks.h, modify the value of the constant NR_TASKS (512 by default) and set it to a value which doesn't exceed 4092 or 4090 if APM is configured. It could be useful to set MAX_TASKS_PER_USER at the same time to an appropriate value. Then recompile the kernel as usual.
You need to edit the file /usr/src/linux/drivers/block/loop.c, For 2.2.x kernels, you need to modify the value of the constant MAXLOOP (8 by default). For 2.4.x kernels, you need to modify the value of the static int max_loop variable. Then recompile the kernel as usual.
You need to have a kernel 2.4.x, glibc 2.1.3 at least and that all necessary tools have been recompiled. Look at http://www.suse.de/~aj/linux_lfs.html