http://junsun.net/linux/patches/generic/hacks/061102-reserve-low-memory.patch http://junsun.net/linux/patches/generic/hacks/061102-vmplayer-no-module-2.6.16.config The objective is to reserve the first 256MB staring from 0 and hide it from kernel in a 512MB system. In other words, kernel only uses the second 256MB memory. Several notes related to this hack: * In the config, I set CONFIG_PHYSICAL_START to 0x10000000 (256MB) See the .config file in the same directory. My target is vmplayer. (BTW, this config disables module and is quite useful for fast devel) * The patch will change __PAGE_OFFSET from 0xC0000000 to 0xB0000000 so that the virtual address of kernel would still start from 0xC0000000 region. (This may be necessary? Pro's and Con's?) * Since we lose out the first 16MB DMA zone, many drivers will complain. The patch increase MAX_DMA_ADDRESS to 1GB, which effectively cover all memory area. If you have floppy or other ISA devices doing DMA, this change may break your system. * Specify the memory map through kernel command line: memmap=exactmap memmap=0x0fef0000@0x10000000 Note . the memory region must include the kernel itself . also, grub does not seem to understand memmap option (BUG!!). It would still load initrd to the end of memory. So you better specify the size of memory to cover (almost) end of the second 256MB. Otherwise, you will see complains about not finding "LABEL=/" root device. . Tricky enough, you cannot specify the whole 256MB as the size because 0x1000 in the last 1M+ is used for ACPI data and NVS. (What are they for anyway?) When I tried to include them in memmap spec, the system failed to start (BusLogic driver errors) Jun diff -Nru no-module-linux-2.6.15/include/asm-i386/dma.h.orig no-module-linux-2.6.15/include/asm-i386/dma.h --- no-module-linux-2.6.15/include/asm-i386/dma.h.orig 2006-01-02 19:21:10.000000000 -0800 +++ no-module-linux-2.6.15/include/asm-i386/dma.h 2006-11-01 17:56:13.000000000 -0800 @@ -73,7 +73,7 @@ #define MAX_DMA_CHANNELS 8 /* The maximum address that we can perform a DMA transfer to on this platform */ -#define MAX_DMA_ADDRESS (PAGE_OFFSET+0x1000000) +#define MAX_DMA_ADDRESS (PAGE_OFFSET+0x40000000) /* 8237 DMA controllers */ #define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */ diff -Nru no-module-linux-2.6.15/arch/i386/Kconfig.orig no-module-linux-2.6.15/arch/i386/Kconfig --- no-module-linux-2.6.15/arch/i386/Kconfig.orig 2006-10-30 18:00:50.000000000 -0800 +++ no-module-linux-2.6.15/arch/i386/Kconfig 2006-11-01 16:51:13.000000000 -0800 @@ -518,7 +518,7 @@ default 0xB0000000 if VMSPLIT_3G_OPT default 0x78000000 if VMSPLIT_2G default 0x40000000 if VMSPLIT_1G - default 0xC0000000 + default 0xB0000000 config HIGHMEM bool