这部分记录的是kernel的升级, 之前在FPGA上跑了2.6.29的kernel去验证一些IP的功能.
而从google的网站上得到的android的source code是不包含kernel的部分的,kernel需要单独下载.
从google下载后发现是3.0.72的版本.
所以这边记录的就是kernel从2.6.29.4上升级到3.0.72上的过程.
最开始的想法就是, 先找一个3.0上的mips架构下的config档, 然后对比2.6.29上的config档的差异, 将差异弥补即可.
找了下configs的文件, 选了bcm63xx的defconfig.
下面是具体的步骤. 总体过程还算比较顺利, 3天左右搞定.
1.config文件的配置
a.arch/mips/company 的目录copy到3.0上,kconfig/makefile的修改也copy过去
b.在3.0上make bcm63xx_defconfig,然后make menuconfig,会出错.
提示很多错误
...
scripts/kconfig/lxdialog/menubox.o: In function `do_scroll‘:
menubox.c:(.text+0x55): undefined reference to `wrefresh‘
scripts/kconfig/lxdialog/menubox.o: In function `print_arrows‘:
menubox.c:(.text+0x1a4): undefined reference to `wrefresh‘
scripts/kconfig/lxdialog/menubox.o: In function `do_print_item‘:
menubox.c:(.text+0x3a9): undefined reference to `wrefresh‘
scripts/kconfig/lxdialog/menubox.o: In function `print_buttons‘:
menubox.c:(.text+0x4b1): undefined reference to `wrefresh‘
collect2: ld returned 1 exit status
make[1]: *** [scripts/kconfig/mconf] Error 1
make: *** [menuconfig] Error 2
解决办法见http://blog.csdn.net/bdc995/article/details/8235429
sudo apt-get install libncurses5 libncurses5-dev
解决后,由于bcm63xx是big endian的,删掉-EL的编译选项后,能编译通过.
c.对比2.6.29的.config文件和3.0默认的bcm63xx的.config文件.
其中2.6中的CONFIG_DMA_NEED_PCI_MAP_STATE,对应3.0中的CONFIG_NEED_DMA_MAP_STATE
d.公司芯片是little endian, bcm63xx是big endian.
CONFIG_GENERIC_FIND_NEXT_BIT在2.6.29上是开的,但是3.0上接口不一样,关闭.
e.2.6.29上CONFIG_SWAP_IO_SPACE没有打开,而bcm上打开了,所以关闭
f.CONFIG_GENERIC_GPIO在2.6.29上是没打开的,所以3.0上也关闭
g.CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ在2.6.29上打开,但是3.0上接口变了,维持关闭.
h.CONFIG_GENERIC_TIME同上
i.cpu选2.6.29的MIPS32R2
j.
CONFIG_CPU_HAS_LLSC=y
CONFIG_CPU_MIPSR2_IRQ_VI=y 这2个保持2.6.29的
#CONFIG_SELECT_MEMORY_MODEL=y
#CONFIG_FLATMEM_MANUAL=y 这2个2.6.29上没有,关闭
CONFIG_UNEVICTABLE_LRU在2.6.29上是开的,但是3.0的相关代码不需要用预编译,3.0上不需要.
CONFIG_HIGH_RES_TIMERS在2.6.29上打开的,3.0也打开
CONFIG_HZ 维持2.6.29的1000
CONFIG_PREEMPT_VOLUNTARY维持2.6.29默认的
CONFIG_HAVE_IRQ_WORK在3.0上也没用到,关闭
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y这2个在3.0上也打开,维持2.6.29的配置
CONFIG_GENERIC_IRQ_SHOW=y维持3.0上的打开状态
CONFIG_IKCONFIG=y维持2.6.29的配置
CONFIG_RELAY=y
CONFIG_NAMESPACES=y这2个维持2.6.29的配置
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y这2个维持2.6.29的配置
CONFIG_BLK_DEV_INITRD=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_CLASSIC_RCU=y这3个维持2.6.29的配置
CONFIG_EMBEDDED=y维持2.6.29,替换3.0上的CONFIG_EXPERT
# CONFIG_BASE_FULL is not set维持2.6.29的关闭
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y这5个维持2.6.29的打开配置
CONFIG_SLUB维持3.0的,2.6.29用的是CONFIG_SLAB
# CONFIG_COMPAT_BRK is not set维持2.6.29的关闭
CONFIG_TRACEPOINTS=y维持2.6.29的打开
CONFIG_MARKERS 3.0不需要打开
CONFIG_RT_MUTEXES=y维持打开
CONFIG_BASE_SMALL=1维持2.6.29, 3.0上默认是0
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y这3个维持2.6.29的打开
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_BLK_DEV_INTEGRITY=y这2个维持2.6.29的打开
io scheduler维持2.6.29默认的cfq的配置
# CONFIG_PCCARD is not set维持2.6.29的配置, 3.0上的关闭
PCI相关的配置,3.0上也关闭
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y这2个维持2.6.29配置
CONFIG_MTD_CONCAT=m
CONFIG_MTD_PARTITIONS=y
CONFIG_MTD_CMDLINE_PARTS=y这3个维持3.0上的,关闭配置
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y这3个维持2.6.29上的打开配置
CONFIG_MTD_PHYSMAP=y维持3.0的配置
2.irq_desc中各个成员的不一致的问题,copy_thread/arch_ptrace函数的定义问题.
3.根文件系统, 采用2.6.29中已经编译好的mdev.cpio, porting结束后, 跑vmlinux.bin会发现在加载跟文件系统的时候, 死机在populate_rootfs里面.
[ 4.554000] Unhandled kernel unaligned access[#1]:
[ 4.554000] Cpu 0
[ 4.554000] $ 0 : 00000000 00000000 00010000 81f69f16
[ 4.554000] $ 4 : 00000001 81c18acc 00000002 81f69f2a
[ 4.554000] $ 8 : 00010000 8051991c 00000001 0000000a
[ 4.554000] $12 : 000000cd 00000005 00000000 20b91340
[ 4.554000] $16 : 80540000 80400000 00002850 000007d0
[ 4.554000] $20 : 80540000 80540000 80540000 00000007
[ 4.554000] $24 : 00000000 00000000
[ 4.554000] $28 : 81c16000 81c17e20 00000030 8019d984
[ 4.554000] Hi : 0000bf68
[ 4.554000] Lo : 00000005
[ 4.554000] epc : 801a00dc fget+0x70/0xd8
[ 4.554000] Not tainted
[ 4.554000] ra : 8019d984 sys_fchown+0x24/0x84
[ 4.554000] Status: 11005003 KERNEL EXL IE
[ 4.554000] Cause : 00800010
[ 4.554000] BadVA : 81f69f2a
[ 4.554000] PrId : 00019655 (MIPS 24Kc)
[ 4.554000] Modules linked in:
[ 4.554000] Process swapper (pid: 1, threadinfo=81c16000, task=81c14888, tls=00000000)
[ 4.554000] Stack : 00000030 8010b76c 30303030 80540000 80400000 80540000 80400000 80540000
[ 4.554000] 804a0000 8051dfec 53e3561b 81caf696 803fe0e8 0000013c 00000000 00000000
[ 4.554000] 0000000a 8051d6f8 81cae8f0 000009d8 81caf628 00008000 80540000 8051d46c
[ 4.554000] 80546000 81ca8000 8051d2c4 8052b4d4 00008000 81c89580 00000000 00000000
[ 4.554000] 80546000 81ca8000 8051d2c4 8052b4d4 00008000 8052b788 00000000 8042f860
[ 4.554000] ...
[ 4.554000] Call Trace:
[ 4.554000] [<801a00dc>] fget+0x70/0xd8
[ 4.554000] [<8019d984>] sys_fchown+0x24/0x84
[ 4.554000] [<8051dfec>] do_name+0x148/0x31c
[ 4.554000] [<8051d46c>] flush_buffer+0xcc/0x124
[ 4.554000] [<8052b788>] gunzip+0x2ac/0x390
[ 4.554000] [<8051da30>] unpack_to_rootfs+0x1d8/0x364
[ 4.554000] [<8051e598>] populate_rootfs+0x20/0xb8
[ 4.554000] [<8010e31c>] do_one_initcall+0xfc/0x1d8
[ 4.554000] [<8051c314>] kernel_init+0xa8/0x140
[ 4.554000] [<80114d8c>] kernel_thread_helper+0x10/0x18
[ 4.554000]
[ 4.554000]
[ 4.554000] Code: 00481024 1040000a 00000000 <c0e50000> 14a40005 00000000 00c00821 e0e10000 1020fffa
[ 4.554000] Disabling lock debugging due to kernel taint
[ 4.754000] Unhandled kernel unaligned access[#2]:
[ 4.754000] Cpu 0
[ 4.754000] $ 0 : 00000000 00000000 00000001 81c18af4
[ 4.754000] $ 4 : 81f69f2a 81c18ac4 00000000 00000000
[ 4.754000] $ 8 : 0000000a 00000001 00000001 0000000a
[ 4.754000] $12 : 000000cd 00000005 00000000 21055e80
[ 4.754000] $16 : 00000000 81f69f16 81c18ac4 00000000
[ 4.754000] $20 : 81c18acc 00010000 8051991c 00000007
[ 4.754000] $24 : 00000000 00000000
[ 4.754000] $28 : 81c16000 81c17c58 00000030 8019cdb0
[ 4.754000] Hi : 0000d2f0
[ 4.754000] Lo : 00000005
[ 4.754000] epc : 801a07e4 fput+0x40/0x29c
[ 4.754000] Tainted: G D
[ 4.754000] ra : 8019cdb0 filp_close+0x7c/0x98
[ 4.754000] Status: 11005003 KERNEL EXL IE
[ 4.754000] Cause : 00800010
[ 4.754000] BadVA : 81f69f2a
[ 4.754000] PrId : 00019655 (MIPS 24Kc)
[ 4.754000] Modules linked in:
[ 4.754000] Process swapper (pid: 1, threadinfo=81c16000, task=81c14888, tls=00000000)
[ 4.754000] Stack : 00000000 00000000 3b9aca00 8013400c 81c16000 81c17c90 00000000 81f69f16
[ 4.754000] 81c18ac4 00000000 81c18acc 00010000 8051991c 8019cdb0 00000000 00000000
[ 4.754000] 00000001 00000080 81c18ac4 00000001 00000000 801356c8 0000000a 00000001
[ 4.754000] 0000000b 81c17d70 0000000b 81c17d70 81c14888 00000000 80540000 80540000
[ 4.754000] 00000001 80137340 80540000 80540000 80540000 00000007 00000000 00000000
[ 4.754000] ...
[ 4.754000] Call Trace:
[ 4.754000] [<801a07e4>] fput+0x40/0x29c
[ 4.754000] [<8019cdb0>] filp_close+0x7c/0x98
[ 4.754000] [<801356c8>] put_files_struct+0x134/0x1c4
[ 4.754000] [<80137340>] do_exit+0x23c/0x62c
[ 4.754000] [<80119210>] nmi_exception_handler+0x0/0x34
[ 4.754000]
[ 4.754000]
[ 4.754000] Code: 7c420400 10400008 00000000 <c0830000> 2462ffff e0820000 1040fffc 2462ffff 0806820a
[ 4.928000] Fixing recursive fault but reboot is needed!
具体是populate_rootfs
unpack_to_rootfs
write_buffer
do_name
sys_fchown
fget 里面. (很奇怪, do_name操作31个文件后就不行)
这个问题很奇怪, 然后看initramfs的相关的脚本, 在kernel的usr目录下, 尝试使用压缩格式的选项, 但是还是不行.
然后将产生rootfs的cpio档的源文件重新打包, 删掉一些不必要的文件, 发现会有些变化, 等do_name操作的文件数小于31个后, 确实能进入到系统的login界面中.
而且root账号还能登陆, 但是进去后会有写莫名其妙的问题.
重新思考这个问题, 不应该会出现这样的现象才对. 然后对比porting的过程, 仔细检查3.0的kernel上的文件的改动(具体如下).
====================================================================================
arch\mips\boot\compressed\dbg.c
arch\mips\boot\compressed\decompress.c
arch\mips\include\asm\abi.h 还有同一个目录下的其他文件
arch\mips\kernel 下的c文件, 用2.6.29的替代了(因为涉及到很多的结构体的定义的差异, 一开始图省事, 后面看来这个动作不需要)
arch\mips\company 目录, 新增
arch\mips\mm\cache.c
arch\mips\kernel\c-r4k.c
arch\mips\kernel\mmap.c
drivers\tty\serial\concerto_uart.c(新加)
drivers\usb\host\ehci-hcd.c 此外新增usb驱动
fs\yaffs2\yaffs_vfs.c 修改一些结构体的差异
fs\binfmt_elf.c 某个变量
fs\exec.c 一些参数类型差异
include\generated\asm-offsets.h 这个文件是生成的, 但是和标准的3.0.72差异很大,
ipc\syscall.c 取消, 本来也编译不到
kernel\irq\chip.c 新增了set_irq_chip_and_handler函数, 从2.6.29上copy过来的
kernel\irq\irqdesc.c 结构体的定义
====================================================================================
决定重新检查修改前面的工作.
************************************************************************************
arch\mips\company 目录, 新增, 一定要的
arch\mips\include\asm\mach-xxxx 新增(xxxx对应具体芯片型号), 也要的
arch\mips\include\asm\cacheflush.h 新增 extern void (*flush_data_cache_range)(unsigned long addr, unsigned long size); 这个维持2.6.29的配置
arch\mips\mm\cache.c 同上, 也要的
arch\mips\mm\c-r4k.c 新增 r4k_flush_data_cache_range 函数, 也是维持和2.6.29上一样.
arch\mips\Kconfig 将2.6.29上的配置copy过来
arch\mips\Makefile 同上
drivers\tty\serial\xxxx_uart.c 芯片串口驱动, 将2.6.29上的文件直接copy过来, 同样有kconfig和makefile, 名字用xxxx替代了. 也是必须的.
usb host的驱动相关的文件copy过去, 但是usb的驱动没有做编译(改makefile)
yaffs2编译报错, 直接make menuconfig关掉这个选项.
消除include\linux\dma-mapping.h 中__deprecated 的编译问题
include\linux\serial_core.h新增port的宏定义
kernel\irq\chip.c 增加 set_irq_chip_and_handler 函数, 这个也是参考2.6.29的
最后修改整个kernel的makefile的toolchain和编译选项.
CROSS_COMPILE ?= /usr/local/xxx/mips-4.3/bin/mips-linux-gnu-
CC = $(CROSS_COMPILE)gcc -EL
在这里, .config使用的是第一次porting的.config, 除了usb和yaffs2的差异外.
initramfs用的还是2.6.29中的mdev.cpio
经过这样的修改后, 编译后的vmlinux.bin和uImage都跑的很正常.
后续将USB和YAFFS相关的编译问题解决后, 也都跑的很顺利.
特此记录.
最后, 提醒一下, 在3.0.72的kernel中, android\configs目录下有个android-recommended.cfg, 可以再检查下最后生成的.config和它的差异. 看看有木有漏掉重要的cfg.