Benutzer:Torte/KernelSizeDraft

Aus wiki.freifunk.net
Zur Navigation springenZur Suche springen

Size reduction

  • The kernel can be reduced by about 30KB (17KB by removing unused PHYs, but that could mean, some devices will not work)
  • This reduction can lead up to 64KB space, because there is some padding in the MTD partition (that also means, this space can be reduced immediately, if the kernel grows only by a few bytes)


Overwritten settings

  • Many kernel options cannot be set by adding them to "config/<target>.config", because they will be overwritten with default values by "make -C $(OPENWRT_DIR) defconfig" (which is required to create the default options for the chosen target).
    • Solution: Add a second step after "defconfig" that includes the additional settings


'config out of sync' warning

  • Some settings can cause a 'config out of sync' warning
    • Cause: The openwrt build system checks the .config by
      • 1. feeding the .config file to a script, that simulates the "make menuconfig" step on it:
        scripts/config/conf --defconfig=.config -w tmp/.config Config.in
      • 2. comparing the results to the originating config and emitting a warning, if there are differences:
        scripts/kconfig.pl '>' .config tmp/.config
    • Differences are, if you try to disable a setting by adding "FOO=n" (might be necessary, if the "defconfig" step already set this option as "FOO=y"). This disabled setting can be changed to "# FOO is not defined" by the "conf" tool, what has the same effect as "FOO=n", but the comparison from "kconfig.pl" will detect this as a difference.
      • Solution: The freifunk Makefile needs a way remove those settings instead of simply adding new ones


Size: Padding

  • Padding: Some settings will not show a size difference on their own.
    • Assumption: Happens, if they fit into a not completely used squashfs block.


Size: Not completely reproducable

  • Not completely reproducable sizes
    • Sometimes, the openwrt build process creates slightly bigger kernels (~500 or ~1000 byte), even if the ".config" file is unchanged. Steps done:
make target/linux/clean
make target/linux/compile
make package/kernel/linux/compile
make target/linux/install
    • Usually this can be reverted, by running a full "make" from the Freifunk directory
    • A "make" from the Freifunk directory can lead to a slightly bigger (~500 byte) Kernel, than building the kernel from the openwrt directory


Hardware

  • Tested on wr841v9
    • eth0: OK
    • wifi: Probably OK (at least "iw list" looks OK)
    • kernel-modules: OK (iptables, etc. got loaded)
Important.png Wichtig: Before flashing these experimental kernels, make sure that the router has an unlocked bootloader (U-Boot) that really accepts the uploaded image using the reset-button method (or manual U-Boot flashing).

I own two devices, that allow tftp upload, but reject flashing those images (a CPE210v1.1 and a CPE510 - unknown version, the CPE510 had "ES" (not EU) printed on the PCB).


Makefile

  • Changes to Makefile to include $TARGET.configadd
diff --git a/Makefile b/Makefile
index 8d1f447cb3..8036cd655f 100644
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,7 @@ REVISION=git describe --always
 FW_DIR=$(shell pwd)
 OPENWRT_DIR=$(FW_DIR)/openwrt
 TARGET_CONFIG=$(FW_DIR)/configs/common.config $(FW_DIR)/configs/$(MAINTARGET)-$(SUBTARGET).config
+TARGET_CONFIGADD=$(FW_DIR)/configs/$(MAINTARGET)-$(SUBTARGET).configadd
 FW_TARGET_DIR=$(FW_DIR)/firmwares/$(MAINTARGET)-$(SUBTARGET)
 VERSION_FILE=$(FW_TARGET_DIR)/VERSION.txt
 UMASK=umask 022
@@ -131,6 +132,19 @@ $(OPENWRT_DIR)/.config: .stamp-patched $(TARGET_CONFIG) .stamp-build_rev $(OPENW
 	sed -i "/^CONFIG_VERSION_CODE=/c\CONFIG_VERSION_CODE=\"$(FW_REVISION)\"" $(OPENWRT_DIR)/.config
 	$(UMASK); \
 	  $(MAKE) -C $(OPENWRT_DIR) defconfig
+	# add/undefine values that got overwritten by "make defconfig"
+	if [ -e $(TARGET_CONFIGADD) ] ; then \
+	  REM="-- removed" ; \
+	  cat $(TARGET_CONFIGADD)|while read LINE ; do \
+	    [[ $$LINE == "#"* ]] && continue ; \
+	    if [[ $$LINE == *"=-" ]]; then \
+	      SYM=$${LINE%=-} ; \
+	      sed -i "s/^$${SYM}=.*/# & $${REM}/" $(OPENWRT_DIR)/.config ; \
+	      LINE="# $${SYM} is not set" ; \
+	    fi ; \
+	    echo "$${LINE}" >> $(OPENWRT_DIR)/.config ; \
+	  done ; \
+	fi \
 
 # prepare openwrt working copy
 prepare: stamp-clean-prepared .stamp-prepared


ar71xx-tiny.configadd

  • Settings tested so far (work-in-progress):
    file: ar71xx-tiny.configadd
## -- NET_VENDOR --
## size:0
#CONFIG_KERNEL_NET_CADENCE=n
#CONFIG_KERNEL_NET_VENDOR_3COM=n
#CONFIG_KERNEL_NET_VENDOR_8390=n
#CONFIG_KERNEL_NET_VENDOR_ADAPTEC=n
#CONFIG_KERNEL_NET_VENDOR_AGERE=n
#CONFIG_KERNEL_NET_VENDOR_ALTEON=n
#CONFIG_KERNEL_NET_VENDOR_AMAZON=n
#CONFIG_KERNEL_NET_VENDOR_AMD=n
#CONFIG_KERNEL_NET_VENDOR_ARC=n
#CONFIG_KERNEL_NET_VENDOR_AURORA=n
#CONFIG_KERNEL_NET_VENDOR_BROADCOM=n
#CONFIG_KERNEL_NET_VENDOR_BROCADE=n
#CONFIG_KERNEL_NET_VENDOR_CAVIUM=n
#CONFIG_KERNEL_NET_VENDOR_CHELSIO=n
#CONFIG_KERNEL_NET_VENDOR_CISCO=n
#CONFIG_KERNEL_NET_VENDOR_DEC=n
#CONFIG_KERNEL_NET_VENDOR_DLINK=n
#CONFIG_KERNEL_NET_VENDOR_EMULEX=n
#CONFIG_KERNEL_NET_VENDOR_EXAR=n
#CONFIG_KERNEL_NET_VENDOR_EZCHIP=n
#CONFIG_KERNEL_NET_VENDOR_HP=n
#CONFIG_KERNEL_NET_VENDOR_I825XX=n
#CONFIG_KERNEL_NET_VENDOR_INTEL=n
#CONFIG_KERNEL_NET_VENDOR_MARVELL=n
#CONFIG_KERNEL_NET_VENDOR_MELLANOX=n
#CONFIG_KERNEL_NET_VENDOR_MICREL=n
#CONFIG_KERNEL_NET_VENDOR_MICROCHIP=n
#CONFIG_KERNEL_NET_VENDOR_MYRI=n
#CONFIG_KERNEL_NET_VENDOR_NATSEMI=n
#CONFIG_KERNEL_NET_VENDOR_NETRONOME=n
#CONFIG_KERNEL_NET_VENDOR_NVIDIA=n
#CONFIG_KERNEL_NET_VENDOR_OKI=n
#CONFIG_KERNEL_NET_VENDOR_QLOGIC=n
#CONFIG_KERNEL_NET_VENDOR_QUALCOMM=n
#CONFIG_KERNEL_NET_VENDOR_RDC=n
#CONFIG_KERNEL_NET_VENDOR_REALTEK=n
#CONFIG_KERNEL_NET_VENDOR_RENESAS=n
#CONFIG_KERNEL_NET_VENDOR_ROCKER=n
#CONFIG_KERNEL_NET_VENDOR_SAMSUNG=n
#CONFIG_KERNEL_NET_VENDOR_SEEQ=n
#CONFIG_KERNEL_NET_VENDOR_SILAN=n
#CONFIG_KERNEL_NET_VENDOR_SIS=n
#CONFIG_KERNEL_NET_VENDOR_SMSC=n
#CONFIG_KERNEL_NET_VENDOR_STMICRO=n
#CONFIG_KERNEL_NET_VENDOR_SUN=n
#CONFIG_KERNEL_NET_VENDOR_SYNOPSYS=n
#CONFIG_KERNEL_NET_VENDOR_TEHUTI=n
#CONFIG_KERNEL_NET_VENDOR_TI=n
#CONFIG_KERNEL_NET_VENDOR_TOSHIBA=n
#CONFIG_KERNEL_NET_VENDOR_VIA=n
#CONFIG_KERNEL_NET_VENDOR_WIZNET=n
#CONFIG_KERNEL_NET_VENDOR_XILINX=n

## -- USB --
## size:0
#CONFIG_KERNEL_USB=n
#CONFIG_KERNEL_USB_ACM=n
#CONFIG_KERNEL_USB_COMMON=n
#CONFIG_KERNEL_USB_EHCI_ATH79=n
#CONFIG_KERNEL_USB_EHCI_HCD=n
#CONFIG_KERNEL_USB_EHCI_HCD_PLATFORM=n
#CONFIG_KERNEL_USB_EHCI_PCI=n
#CONFIG_KERNEL_USB_EHCI_ROOT_HUB_TT=n
#CONFIG_KERNEL_USB_EHCI_TT_NEWSCHED=n
#CONFIG_KERNEL_USB_LEDS_TRIGGER_USBPORT=n
#CONFIG_KERNEL_USB_NET_DRIVERS=n
#CONFIG_KERNEL_USB_NET_CDCETHER=n
#CONFIG_KERNEL_USB_NET_RNDIS_HOST=n
#CONFIG_KERNEL_USB_OHCI_ATH79=n
#CONFIG_KERNEL_USB_OHCI_HCD=n
#CONFIG_KERNEL_USB_OHCI_HCD_PLATFORM=n
#CONFIG_KERNEL_USB_SERIAL=n
#CONFIG_KERNEL_USB_SERIAL_OPTION=n
#CONFIG_KERNEL_USB_SERIAL_WWAN=n
#CONFIG_KERNEL_USB_STORAGE=n

## -- KERNEL COMPRESSION --
## ignored
#CONFIG_KERNEL_HAVE_KERNEL_GZIP=n
#CONFIG_KERNEL_HAVE_KERNEL_BZIP2=n
#CONFIG_KERNEL_HAVE_KERNEL_LZMA=n
#CONFIG_KERNEL_HAVE_KERNEL_XZ=n
#CONFIG_KERNEL_HAVE_KERNEL_LZO=n
#CONFIG_KERNEL_HAVE_KERNEL_LZ4=n

## -- KERNEL TRACER --
## ignored
#CONFIG_KERNEL_HAVE_FUNCTION_TRACER=y
#CONFIG_KERNEL_HAVE_FUNCTION_GRAPH_TRACER=y
#CONFIG_KERNEL_HAVE_DYNAMIC_FTRACE=y
#CONFIG_KERNEL_HAVE_FTRACE_MCOUNT_RECORD=y
#CONFIG_KERNEL_HAVE_SYSCALL_TRACEPOINTS=y
#CONFIG_KERNEL_HAVE_C_RECORDMCOUNT=y
#CONFIG_KERNEL_TRACING_SUPPORT=y

## -- MISC --
## no difference
#CONFIG_KERNEL_DEBUG_BUGVERBOSE=n
#CONFIG_KERNEL_X86_DEBUG_FPU=n
#CONFIG_KERNEL_DEBUG_RODATA_TEST=n
#CONFIG_KERNEL_X86_MCE=n
#CONFIG_KERNEL_X86_MCE_INTEL=n
#CONFIG_KERNEL_X86_MCE_AMD=n
#CONFIG_KERNEL_MICROCODE=n
#CONFIG_KERNEL_MICROCODE_INTEL=n
#CONFIG_KERNEL_ACPI=n

## -- FILESYSTEMS --
#CONFIG_KERNEL_JBD2=n
## ignored
#CONFIG_KERNEL_FAT_FS=n
#CONFIG_KERNEL_VFAT_FS=n
## size:0
CONFIG_KERNEL_CIFS=n

## -- FILESYSTEM ENCODING --
## ignored
#CONFIG_KERNEL_NLS=n
#CONFIG_KERNEL_NLS_CODEPAGE_437=n
#CONFIG_KERNEL_NLS_ISO8859_1=n
#CONFIG_KERNEL_NLS_ISO8859_15=n
#CONFIG_KERNEL_NLS_UTF8=n

## ignored
#CONFIG_KERNEL_ARCH_HIBERNATION_POSSIBLE=n
#CONFIG_KERNEL_ARCH_SUSPEND_POSSIBLE=n

## ignored
#CONFIG_KERNEL_HAVE_IDE=n

## size:0
CONFIG_KERNEL_ISDN=n

## ignored
#CONFIG_KERNEL_HAVE_KVM=n

# --------------------

## size:1940
CONFIG_KERNEL_EFI_PARTITION=n

## triggers 'config out of sync' (when set to 'n')
## size:4196
CONFIG_KERNEL_ELF_CORE=-
CONFIG_KERNEL_COREDUMP=-
####CONFIG_KERNEL_COREDUMP=n
## size:0
CONFIG_KERNEL_ALLOW_DEV_COREDUMP=n

# -- PHY --
## size:17072
CONFIG_KERNEL_AT803X_PHY=n
CONFIG_KERNEL_MARVELL_PHY=n
CONFIG_KERNEL_MICREL_PHY=n
CONFIG_KERNEL_IP17XX_PHY=n
##CONFIG_KERNEL_AR8216_PHY=n
##CONFIG_KERNEL_AR8216_PHY_LEDS=n
CONFIG_KERNEL_RTL8306_PHY=n
CONFIG_KERNEL_RTL8366_SMI=n
CONFIG_KERNEL_RTL8366S_PHY=n
CONFIG_KERNEL_RTL8366RB_PHY=n
CONFIG_KERNEL_RTL8367_PHY=n
CONFIG_KERNEL_INTEL_XWAY_PHY=n

## size:576
CONFIG_KERNEL_NETWORK_FILESYSTEMS=n

## triggers 'config out of sync' (when set to 'n')
## size:5516
CONFIG_KMOD_BATMAN_ADV_DEBUGFS=-
CONFIG_PACKAGE_MAC80211_DEBUGFS=-
CONFIG_KERNEL_DEBUG_FS=-

## triggers 'config out of sync' (when set to 'n')
## size:576
## ? EARLY_PRINTK: =y reduced size by ~1000 - not reproducible
#CONFIG_KERNEL_DEBUG_INFO=n
#CONFIG_KERNEL_EARLY_PRINTK=n
#CONFIG_KERNEL_DEBUG_PINCTRL=n
#CONFIG_KERNEL_DEBUG_GPIO=n
#CONFIG_KERNEL_PROVE_LOCKING=n
#CONFIG_KERNEL_DEBUG_KERNEL=n
## automatically set by CONFIG_EXPERT - can be forced off by setting to "n", but that triggers the 'config out of sync' warning
## size:0
CONFIG_KERNEL_DEBUG_KERNEL=-
####CONFIG_KERNEL_DEBUG_KERNEL=n

## size:1240
CONFIG_KERNEL_USB_SUPPORT=n

## triggers 'config out of sync' (when set to 'n')
## size:1124
CONFIG_KERNEL_MAGIC_SYSRQ=-