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毫秒