Embedded 版 (精华区)
发信人: twowood (二木), 信区: Embedded
标 题: 我是这样裁减内核的 ZZ
发信站: 哈工大紫丁香 (2003年05月04日16:48:49 星期天), 站内信件
zz
这几天一直想把 uClinux 移植到 512k 的 Samsung 4510 的板子上,
可惜最后还是以失败告终,错误出在 init() 创建 /bin/init 进程时,
Kernel panic: Out of memory and no killable processes... :(
虽然就差了一点点,但也积累了一些内核裁减的经验和心得,刚好看到版上
有人问,就花了点时间写出来,希望对大家有用。
1、选好一个适当的 uClinux release 版本
最初我下载了那个台湾网站上的 uClinux-Samsung-20020318.tar.gz,
编译后内核过大,后来用了 uClinux-dist-20020701.tar.gz,并打了一个
uClinux-20020701-20020816.patch ,也就是 SkyEye 上用的那个,这样
编译出来的内核就比较小了。而且选择 2.0 的内核还是 2.4 的内核也会
有比较大的影响。
节省空间( ***** ): ~100k
2、make menuconfig
把网络支持,System V IPC,ext2 文件系统支持等很多选项去掉,
反正似乎只要保证 romfs support,samsung serial port support,
其他的编译选项基本上都可以去掉。
节省空间( **** ): 50k~100k
3、修改 linux-2.4.x/makefile
这个就比较复杂了,也需要做一些修补工作。把链接时的网络和其他
无关的设备驱动去掉,比如 net/network.o /net/net.o media/media.o ,
这样修改之后,编译会报错,接下来就需要注释一些代码,主要有这么
几个文件,都是一些和 sock 相关的部分:
linux-2.4.x/init/main.c
linux-2.4.x/arch/armnommu/kernel/calls.S
linux-2.4.x/fs/fcntl.c
节省空间( *** ): ~50k
4、修改链接文件 arch/armnommu/vmlinux-armv.lds.in
由于编译出来的代码主要是 4 个段:init,bss,data 和 text
前面三个段都需要写操作,只能放在 RAM 里,而 text 只要读权限就可以,
放在 flash 里面就可以节省 300k 左右的空间。
节省空间( ********** ): ~300k
5、修改 romfs 的连接位置 drivers/block/blkmem.c
romfs.img 可以放在 RAM 里,但为了节省 RAM 空间,将 romfs 放在
flash 里也可以,只要固定位置,并修改相关的代码就可以了。由于 romfs
的大小变化很大,从 30k 到 xM 都行,所以这个办法也能节省不少 ram.
节省空间( ***** ): 30~80k
6、再次修改链接文件,把其中 ALIGN 的值改小一些
链接时为了对齐,会采用 . = ALIGN(8192); 这样的写法,虽然好看整齐,
但会浪费一些空间,可以适当得改小一些例如: . = ALIGN(32); 这样运气好
的话,可以节省 4、5k 的空间。虽然不多,但有一点是一点,唉。
节省空间( * ): 1~8k
总之,为了能在 512k 里面把 uClinux run 起来,真是煞费苦心,
最后还是功亏一篑了,算了不提。最后把我的一些参数写出来供大家参考:
1) 写入 flash 和 sdram 的文件大小: ll uClinux-dist/images/
total 476
-rwxrwxr-x 1 Atari Atari 338240 Apr 30 20:36 linux.text
-rwxrwxr-x 1 Atari Atari 52584 Apr 30 20:36 linux.data
-rw-rw-r-- 1 Atari Atari 82944 Apr 30 20:36 romfs.img
2) linux 的段信息: arm-elf-readelf -a linux > linux.r
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf
Al
[ 0] NULL 00000000 000000 000000 00 0
0 0
[ 1] .init PROGBITS 00008000 008000 007000 00 WAX 0
0 3
[ 2] .data PROGBITS 00010000 010000 004d68 00 WA 0
0 3
[ 3] .bss NOBITS 00014d80 014d80 01be80 00 WA 0
0 3
[ 4] .debug_abbrev PROGBITS 00000000 06a940 000021 00 0
0 1
[ 5] .debug_info PROGBITS 00000000 06a961 0000e8 00 0
0 1
[ 6] .debug_line PROGBITS 00000000 06aa49 000000 00 0
0 1
[ 7] .debug_pubnames PROGBITS 00000000 06aa49 000020 00 0
0 1
[ 8] .debug_aranges PROGBITS 00000000 06aa69 000020 00 0
0 1
[ 9] .text PROGBITS 01820000 018000 052940 00 AX 0
0 3
[10] .shstrtab STRTAB 00000000 06aa89 000077 00 0
0 1
[11] .symtab SYMTAB 00000000 06ad08 00b860 10 12
63e 4
[12] .strtab STRTAB 00000000 076568 009076 00 0
0 1
Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), O (extra OS processing required)
o (os specific), p (processor specific) x (unknown)
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x008000 0x00008000 0x00008000 0x0cd68 0x28c00 RWE 0x8000
LOAD 0x018000 0x01820000 0x01820000 0x52940 0x52940 R E 0x8000
Section to Segment mapping:
Segment Sections...
00 .init .data .bss
01 .text
3) 板子的存储空间分配:
SDRAM:( 512k )
0x00000000 to 0x0000003F Exception vector table and address constants
0x00000040 to 0x00000FFF Unused
0x00001000 to 0x00007FFF Read-write data space for bootloader
0x00008000 to 0x0007FFFF download and execute area for linux.data ( 480k )
FLASH: ( 512k )
0x01800000 to 0x01807FFF Bootstrap loader
0x01808000 to 0x0181FFFF download area romfs.img ( 96k )
0x01820000 to 0x0187FFFF download and execute area linux.text ( 384k )
现在 flash 和 sdram 都很便宜,其实这么瞎折腾也没什么意思,呵呵...
--
*/ .\* . [] * * __
*/ . ./\~~~~~~~~~~~~'\. |◆
\* ,/,..,\,...........,\.◆
|| ..▎# ▎田 田 ▎ | ▎◆
|| &&▎ ▎ ▎'|'▎ o
|| ##■■■■■■■■■■〓
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.4]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.441毫秒