MIPS 平台 Android 移植过程记录2_kernel升级 (2.6.29.4 -> 3.0.72)

这部分记录的是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.

时间: 2024-10-04 18:30:41

MIPS 平台 Android 移植过程记录2_kernel升级 (2.6.29.4 -> 3.0.72)的相关文章

MIPS 平台 Android 移植过程记录1_编译环境搭建

在工作的空闲时间, 尝试着在公司的MIPS平台上移植了Android, 把之前记录的遇到的问题贴到blog上来, 做个记录. 1.设置上网代理   /etc/apt/apt.conf, 在文件中添加下面的内容, 注意最后的 ";" 也是需要添加的, 否则会提示这个文件的结束字符不对 Acquire::http:Proxy "user:[email protected]:port/"; 2. Installing the JDK apt-get install ope

拇指接龙游戏从WIN32向Android移植过程问题记录(2)

本文中,在前文(1)基础上,将尽可能详细记录拇指接龙游戏从WIN32向Android移植过程后期--UI运行级调试出现的问题及可能的解决办法. 问题1 正未运行,问题就来了.忽然发现,工程左上角挂着一个大大的感叹号!请看截图: 打开工程属性对话框,观察到如下现象: 我把鼠标停留在右边的横线处,后面出现一个关键单词missing.也就是说,我们的游戏工程依赖的cocos2d-x库包jar文件丢失了!? 再打开另一处观察,发现如下: 其实,有一个重要细节在上一篇中我没有交待.此前,我使用中家的版本在

拇指接龙游戏从WIN32向Android移植过程问题记录

本文将较细致地记录下最近开发课程中的示例游戏-拇指接龙游戏在从WIN32向Android移植过程中遇到的若干问题及相应解决办法. 目前极不完整,待进一步整理. 问题1 连接真机测试运行时,在SplashScreen运行时便出现如下错误提示(log.txt): 09-16 13:28:16.525: I/GLThread(25784): sending render notification tid=1009-16 13:28:18.530: D/cocos2d-x debug info(2578

QT 5 配置MySQL 过程记录

配置过程记录一下,年纪大了记性很差-- 0 安装环境 Win10x64+Qt5.5(x86)+VS2010(x86) 1 安装MySQL 注意: 以下是按x64版本安装的,x86版本的安装流程没有区别. MySQL安装的版本应该与Qt的版本相对应,切记!切记! 1.1 下载 http://dev.mysql.com/downloads/mysql/ 选择 mysql-5.7.14-winx64.zip下载 1.2 解压 解压缩文件到安装目录 注意:不要在安装目录中保留空格 1.3 配置 (1)将

移植opencv2.4.9到android过程记录

http://blog.csdn.net/brightming/article/details/50606463 在移植到arm开发板的时候已经说过,OpenCV已经为各平台准备了一套cmake交叉编译脚本.为Android移植的脚本在opencv目录/platforms/android/android.toolchain.cmake. 这个脚本里面有很详细的过程介绍,按照它里面的说明,配置好ndk的路径,就可以了. 但我们还需要实现其他目的: 1.使用fpu,neon,且Tag_FP_arch

ORB_SLAM2在Android上的移植过程

作者:Frank 转载请注明出处 一直没时间写博客,最近抽时间写了些关于在ORB_SLAM2在Android上的移植过程,也算是点经验吧. 写完后一个手贱点了个链接,瞬间1/3工作量没了,深夜弄完也是醉了... 正文开始 这篇博客讲述如何在Android平台上移植ORB_SLAM2,讲述过程包括基本的Android环境的搭建和NDK环境的配置,Android下移植的基本概念,ORB的具体移植步骤等. Android平台搭建和NDK环境配置 系统:windows7 32bit IDE:Eclips

【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把环境搭建起来了,把过程记录下来分享给大家. 内容目录: 1.默认基础环境 2.NDK下载与配置 3.安装Cygwin 4.用NDK编译 5.安装

第三章:Android移植平台工具介绍读书笔记

本章主要了解了Android移植平台工具,开发板,U-Boot镜像的下载与烧写等等. 1.U-Boot镜像的下载与烧写 U-Boot镜像文件“u-boot.bin”.使用USB方式下载. 1)设置启动模式 首先安装好串口线,USB下载线,把硬件拨码开关SW1设置为USB启动模式,也就是由原来的“0000”设置为“0001”: 2)打开电源 DNW工具会显示“USB:OK” 3)通过DNW下载“USBInstaller_DDR2.bin” U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能

wifidog 移植到MIPS平台

使用的是一款Broadcom的芯片,现在上面运行wifidog实现认证上网的功能.由于不是openwrt平台,所以就没了make menuconfig 勾选就能自动编译到版本中的.所以想使用交叉编译的方法将wifidog移植到该平台上. 下面写下步骤吧,不是很复杂,但是开始也破费周折.下载源码到http://dev.wifidog.org 下载就可以了. ./configure CC=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc