Subject: Re: New FOURMEG kernel
To: None <port-arm26@netbsd.org>
From: David Brownlee <abs@netbsd.org>
List: port-arm26
Date: 07/19/2000 18:05:44
On Wed, 19 Jul 2000, Ben Harris wrote:

> I've now put together a configuration for a kernel which might stand half
> a chance of booting on a 4Mb system.  At least, its text segment is a good
> 250KB smaller than the GENERIC kernel's which is a good start.  I've
> uploaded it to
> <ftp://ftp.netbsd.org/arch/arm26/snapshot/20000714/binary/kernel/netbsd.FOURMEG.gz>.
> It should be included automatically in future snapshots.
> 

	I just saw a posting to the handhelds list asking about reducing the
	size of the linux kernel. Whiloe not directly applicable, I wondered
	if some of the concepts might be useful for NetBSD - reducing hash
	tables and suchlike.

	It might be useful to have a set of kernel options that provide
	the ability to be smaller at the expense of performance or
	even features.

	PS: Excellent work on the new kernel - are you going to be
	    at the next acorn show? :)

                David/absolute
			       -- www.netbsd.org: A pmap for every occasion --


> From: lars brinkhoff <lars@nocrew.org>
> 
> The following message is a courtesy copy of an article
> that has been posted to comp.os.linux.development.system,comp.os.linux.misc,comp.os.linux.advocacy as well.
> 
> *** I'd be very interested in hearing about work done by others ***
> *** to reduce the size of Linux.  I already know about Graham   ***
> *** Stoney's CONFIG_MESSAGES and dead function optimisation     ***
> *** patches.                                                    ***
> 
> Wallace Owen wrote:
> > Can anyone tell me what files in the Linux kernel have data
> > declarations whose dimensions can be safely reduced?  My efforts
> > at producing a small kernel have got the code segment down below
> > half a meg, but the data segment is 1.5 megabytes.
> 
> I started a port of Linux 2.3.99 to our MIPS R3000-ish device (IDT
> RC32064, really).  This device usually has 2M flash and 4M RAM.
> 
> To reduce the size of the text and data sections, I sorted the output
> of the "size" command and investigated the files with the largest
> sections.
> 
> These are the memory-saving changes I arrived at.  They are not really
> tested, so some of them may break some functionality.
> 
> fs/dcache.c
> 
>         Changed HASH_BITS from 14 to 8.  This reduces the size of the
>         cache from 128K to 2K.
> 
> fs/inode.c
> 
>         Changed HASH_BITS from 14 to 8.  This reduces the size of the
>         cache from 128K to 2K.
> 
> include/linux/blk.h
> 
>         Changed NR_REQUEST from 256 to 16.  This reduces the number of
>         requests that can be queued.  The size of the queue is reduce
>         from 16K to 1K.
> 
> include/linux/major.h
> 
>         Changed MAX_BLKDEV and MAX_CHRDEV from 256 to 10 and 20,
>         respectively.  This reduces the number of block and character
>         devices and saves about 40K.
> 
> kernel/printk.c
> 
>         Changed LOG_BUF_LEN from 16384 bytes to 2048 bytes.
> 
> include/linux/tty.h
> 
>         Changed NR_PTYS and NR_LDISCS from 256 and 16, respectively,
>         to 16 and 4, respectively.  Saved about 12K.
> 
>         Warning: this change may break the pty driver, in which
>         case further modifications will have to be done to
>         drivers/char/pty.c.
> 
> kernel/panic.c
> 
>         Changed a buffer from 1024 bytes to 200 bytes.
> 
> include/linux/sched.h
> 
>         Changed PIDHASH_SZ from 1024 to 16, which saves
>         1008 bytes.
> 
> arch/mips/kernel/entry.S
> 
>         (Has 21184 bytes of data which might be trimmed?)
> 
> include/linux/mmzone.h
> 
>         NR_GPFINDEX from 0x100 to 0x10.  Saves 4800 bytes,
>         but I'm not sure it doesn't break anything.
> 
> net/Makefile, net/socket.c, net/nosocket.c
> 
>         Replacing socket.c with nosocket.c, a file containing
>         dummy replacement functions for those in socket.c, saves
>         about 24K.
> 
>         Warning: this disables the socket API entirely, but it
>         is currently not used in our product.
> 
> net/Makefile, net/network.a, net/core
> 
>         Excluding net/core/core.o from net/network.a doesn't save
>         anything.  I guess core.o isn't referenced by anything
>         in the rest of the kernel (except maybe socket.c, see
>         above).
> 
> mm/Makefile, mm/swapfile.c, mm/swap_state.c, mm/noswapfile.c, mm/noswap_state.c
> 
>         Replacing swapfile.c with noswapfile.c, and swap_state.c with
>         noswap_state.c saves about 12K.  The no*.c files contains empty
>         replacement functions.
> 
>         Warning: this disables swapping of anonymous memory, which isn't
>         used in our product.  But note that demand paging of executables
>         still works.
> 
> mm/Makefile, mm/mmap.c
> 
>         The functions in mmap.c could probably also be replaced by
>         empty functions.  Estimated saving: 9K (not included in the
>         grand total below).
> 
> *, CONFIG_MESSAGES
> 
>         Applying the CONFIG_MESSAGES patch and disabling all
>         kernel messages saves about 80K.
> 
>         The CONFIG_MESSAGES patch was written by Graham Stoney
>         <greyham@research.canon.com.au>.
> 
> With all of the above, and only this enabled in .config:
>         CONFIG_EXPERIMENTAL=y
>         CONFIG_CPU_R3000=y
>         CONFIG_CPU_LITTLE_ENDIAN=y
>         CONFIG_ELF_KERNEL=y
>         CONFIG_BINFMT_ELF=y
>         CONFIG_MODULES=y
>         CONFIG_MODVERSIONS=y
>         CONFIG_KMOD=y
>         CONFIG_CROSSCOMPILE=y
> , the kernel is down to about 550K.