《NetBSD指南-18.9.4.精简NetBSD内核》
发表于 : 2010-03-05 14:36
当构建一个嵌入式的系统时, 经常需要修改内核二进制文件以较少空间和内存的占用。
18.9.4.1. 删除ELF区域及调试信息
我们已经知道了如何删除内核中的驱动程序记忆不需要的内容, 这会节省空间和内存, 如果你不需要调试信号
和两个ELF区域的选项.comment 和 .ident,你也可以删除它们,这样可能节省几K的空间。 ELF用来储存可以
用 ident(1) 看的RCS字符串和一个 gcc(1) 版本的字符串。下例中假设你在 /usr/src/tooldir.NetBSD-2.0-i386
下有 TOOLDIR ,并且目标构架是 i386.
我们看见第三列是16进制的格式。通过加上 .comment 和 .ident 的大小,我们知道我们删除它们后可以节省多少空间:
大约是 120KB (= 52640 + 72164 = 0xcda0 + 0x119e4). 我们用 strip(1)来删除这些项以及可提供的调试符号:
因为我们在这里也删除了调试符, 所以我们总共节省的磁盘空间大约是160KB.
18.9.4.2. 压缩内核
在一些构架上, 引导程序可以可以启动一个压缩的内核。 你可以用这个方法节省几M的磁盘空间, 但是这样启动的时间会长一些.
看一下我们节省了多少空间:
18.9.4.1. 删除ELF区域及调试信息
我们已经知道了如何删除内核中的驱动程序记忆不需要的内容, 这会节省空间和内存, 如果你不需要调试信号
和两个ELF区域的选项.comment 和 .ident,你也可以删除它们,这样可能节省几K的空间。 ELF用来储存可以
用 ident(1) 看的RCS字符串和一个 gcc(1) 版本的字符串。下例中假设你在 /usr/src/tooldir.NetBSD-2.0-i386
下有 TOOLDIR ,并且目标构架是 i386.
代码: 全选
$ /usr/src/tooldir.NetBSD-2.0-i386/bin/i386--netbsdelf-objdump -h /netbsd
/netbsd: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0057a374 c0100000 c0100000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00131433 c067a380 c067a380 0057b380 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .rodata.str1.1 00035ea0 c07ab7b3 c07ab7b3 006ac7b3 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .rodata.str1.32 00059d13 c07e1660 c07e1660 006e2660 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 link_set_malloc_types 00000198 c083b374 c083b374 0073c374 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 link_set_domains 00000024 c083b50c c083b50c 0073c50c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 link_set_pools 00000158 c083b530 c083b530 0073c530 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 link_set_sysctl_funcs 000000f0 c083b688 c083b688 0073c688 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 link_set_vfsops 00000044 c083b778 c083b778 0073c778 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 link_set_dkwedge_methods 00000004 c083b7bc c083b7bc 0073c7bc 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 link_set_bufq_strats 0000000c c083b7c0 c083b7c0 0073c7c0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 link_set_evcnts 00000030 c083b7cc c083b7cc 0073c7cc 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 .data 00048ae4 c083c800 c083c800 0073c800 2**5
CONTENTS, ALLOC, LOAD, DATA
13 .bss 00058974 c0885300 c0885300 00785300 2**5
ALLOC
14 .comment 0000cda0 00000000 00000000 00785300 2**0
CONTENTS, READONLY
15 .ident 000119e4 00000000 00000000 007920a0 2**0
CONTENTS, READONLY
大约是 120KB (= 52640 + 72164 = 0xcda0 + 0x119e4). 我们用 strip(1)来删除这些项以及可提供的调试符号:
代码: 全选
# cp /netbsd /netbsd.orig
# /usr/src/tooldir.NetBSD-2.0-i386/bin/i386--netbsdelf-strip -S -R .ident -R .comment /netbsd
# ls -l /netbsd /netbsd.orig
-rwxr-xr-x 1 root wheel 8590668 Apr 30 15:56 netbsd
-rwxr-xr-x 1 root wheel 8757547 Apr 30 15:56 netbsd.orig
18.9.4.2. 压缩内核
在一些构架上, 引导程序可以可以启动一个压缩的内核。 你可以用这个方法节省几M的磁盘空间, 但是这样启动的时间会长一些.
代码: 全选
# cp /netbsd /netbsd.plain
# gzip -9 /netbsd
代码: 全选
$ ls -l /netbsd.plain /netbsd.gz
-rwxr-xr-x 1 root wheel 8757547 Apr 29 18:05 /netbsd.plain
-rwxr-xr-x 1 root wheel 3987769 Apr 29 18:05 /netbsd.gz
/PRE]
注意这只能用 gzip(1)编码, 因为NetBSD的引导程序不支持bzip2!