摘要你们好,我是极客范的本期栏目编辑老朽,现今为你们讲解Android系统内核移植流程解读问题。安卓系统移植的目的是在特定的硬件上运行安卓系
你们好,我是极客范的本期栏目编辑老朽,现今为你们讲解Android系统内核移植流程解读问题。
安卓系统移植的目的是在特定的硬件上运行安卓系统。因为安卓系统使用的是linux内核,所以内核移植和嵌入式linux移植区别不大。流程如下:
(1)将boot-loader和linux2.6内核移植到目标平台,这样就可以启动linux内核,容许基本驱动正常。
(2)更改内核配置文件,打开必要的安卓驱动(日志和BINDER),如下所示:
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_LOGGER=y
这部份的代码在内核驱动/暂存/android目录中。
(3)为了增强启动速率,使用ramdisk将部份安卓文件系统压缩到内核中。
首先打开内核驱动程序:
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE='root'
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
之后从安卓源代码编译下来的out/target/product/merlin/根目录被复制到内核目录。
(4)依据安卓文件系统的要求,对nandflash进行重新分区。事例如下:
将nand闪存界定为以下8个分区。
NTIM
自创品牌(OrignalBrandManufactuce)
u形靴
核心
系统
用户数据
大容量存储器
自凝刀
(5)依据分区表更改内核启动参数,如下所示:
CONFIG_CMDLINE='ubi.MTD=4ubi.MTD=5ubi.MTD=6root=ubi0_0rootftype=ubifsconsole=ttys1,115200UART_DMAinit=./init'
参数表示:加载的文件系统有三个分区,分别是nandflash的第4、5、6分区(从0开始编号),文件系统采用ubifs格式,控制台设备为ttyS1,码率为115200。
首先启动的应用程序是/init。
(6)确保控制台设置与硬件一致。例如硬件上并口使用UART1,在内核启动参数中设置console=ttyS1,在安卓启动时应当设置正确。更改部份坐落android源代码系统/core/init/init.c文件中。
将
staTIcchar*console_;
更改为
staTIcchar*console_;
(7)更改安卓源代码系统/core/rootdir目录下的init.rc文件linux启动盘制作工具,并做如下更改(安卓默认yaffs2文件系统):
首先,安卓文件系统被更改为可读可写。
将
装载rootfsrootfs/ro重新装载
更改为
挂载rootfsrootfs/rw重新挂载
之后更改安装系统和用户数据部份的代码,
(8)内核编译完成后linux程序移植到android,可以启动文件系统,控制台可用,但不显示启动日志,不断重启。
(9)系统不断重启,控制台早已可用。自然,我想到了看日志。听到的时侯发觉logcat设备没有上去,是在配置文件中定义的。
虽然我没有早起。我查了内核的驱动/暂存/安卓目录,没有.O文件,证明没有编译。当我看着。在内核目录中,我发觉没有。
cat和binder的宏定义是在配置文件中定义的,而不是在。这肯定是相关的Kconfig文件的问题。通过剖析驱动程序/暂存目录中的宏定义。
找到了Kconfig文件,由于setting_exclude_build宏默认为y,所以您可以在配置文件中拒绝此宏,并将其添加到配置文件中CONFIG_STAGING的定义以后,如下所示:
CONFIG_STAGING=y
#CONFIG_STAGING_EXCLUDE_BUILD未设置
更改重新编译后发觉系统启动正常,启动时启动日志也显示正常。
至此,最初的安卓移植早已完成。其实,系统还存在好多问题,须要在下一步进行更改。
安卓系统移植流程总结:(华清视觉安卓培训内部资料)
(1)移植1)androidlinux内核的通用驱动,使内核可以在目标平台上运行。
(2)正确挂载文件系统,确保内核启动参数和android源代码系统/core/rootdir目录下init.rc中的文件系统正确挂载。
(3)调试控制台,让内核启动参数中的console参数以及android源代码system/core/init/init.c中的console_name设置和硬件保持一致
(4)打开android相关的驱动(logger,binder等)linux程序移植到android,并口输入logcat看logger驱动上去,没有的话调试logger驱动。(ARM的内核配置文件定义在内核arch/arm/configs目录下。)
Android系统移植工作的目的是为了在特定的硬件上运行Android系统,因为Android系统用的是linux内核,因而内核移植和嵌入式linux移植差别不大,过程如下:
(1)移植boot-loader和linux2.6内核到目标平台上,让linux内核可以启动上去,基本的驱动容许正常。
(2)更改内核配置文件linux认证,打开Android必须的驱动(日志和BINDER)如下:CONFIG_ANDROID=yCONFIG_ANDROID_BINDER_IPC=yCONFIG_ANDROID_LOGGER=y此部份的代码在内核drivers/staging/android目录下。
(3)为了提升启动速率,采用ramdisk,将android文件系统的部份内容压缩到内核中。
首先打开内核驱动:CONFIG_BLK_DEV_INITRD=yCONFIG_INITRAMFS_SOURCE="root"CONFIG_INITRAMFS_ROOT_UID=0CONFIG_INITRAMFS_ROOT_GID=0
之后在android源代码编译下来的out/target/product/merlin/root目录复制到内核目录下。
(4)依据android文件系统的要求对nandflash进行重新分区,举例如下:
将nandflash分区以下8个分区NTIMOBMU-bootKernelSystemUserDataMassStorageBBT
(5)依据分区表更改内核启动参数如下:CONFIG_CMDLINE="ubi.mtd=4ubi.mtd=5ubi.mtd=6root=ubi0_0rootfstype=ubifsconsole=ttyS1,115200uart_dmainit="
参数的意思是:载入的文件系统部份有3个分区,分别为nandflash的第4,5,6分区(从0编号),文件系统采用ubifs格式,控制台设备为ttyS1,码率为115200
启动的第一个应用程序是/init
(6)确保控制台的设置和硬件保持一致,如:硬件上并口用的是UART1,则内核启动参数中设置有console=ttyS1,并且android的启动过程中设要设置正确,更改部份坐落android源代码system/core/init/init.c文件中,将staTIcchar*console_name="/dev/console";更改成staTIcchar*console_name="/dev/ttyS1";
(7)更改android源代码system/core/rootdir目录下的init.rc文件,作如下更改(android默认yaffs2文件系统):
首先将android文件系统更改成可读写,将mountrootfsrootfs/roremount更改成mountrootfsrootfs/rwremount
之后更改挂载system和userdata部份的代码,
(8)完成后编译内核,可以启动文件系统,控制台可用,并且没有显示启动log,并且不停的重启。
(9)系统不停的重启,因而控制台早已可用了,自然而然的想到见到logcat日志,一看,发觉logcat设备竟然没上去,配置文件上面都定义了
竟然没上去,查看了下内核drivers/staging/android目录,没有.o文件,证明是没编译到,在看内核目录下的.config文件,发觉竟然没有了
logcat和binder的宏定义,配置文件上面有定义而.config文件中无定义,肯定是相关Kconfig文件的问题,通过剖析drivers/staging目录下的
Kconfig文件发觉是由于STAGING_EXCLUDE_BUILD宏默认是y,在配置文件中否定此宏即可,在配置文件中CONFIG_STAGING定义后加上即可,如下:
CONFIG_STAGING=y#CONFIG_STAGING_EXCLUDE_BUILDisnotset
更改后重新编译发觉系统完成正常启动,启动过程中启动log也显示正常。
至此,android初步移植工作早已完成,其实,系统还有好多问题,须要下一步继续更改。
android系统移植流程小结:(华清远见android培训内部资料)
(1)androidlinux内核的普通驱动移植,让内核可以在目标平台上运行上去。
(2)正确挂载文件系统,确保内核启动参数和android源代码system/core/rootdir目录下的init.rc中的文件系统挂载正确。
(3)调试控制台,让内核启动参数中的console参数以及android源代码system/core/init/init.c中的console_name设置和硬件保持一致
(4)打开android相关的驱动(logger,binder等),并口输入logcat看logger驱动上去,没有的话调试logger驱动。(ARM的内核配置文件定义在内核arch/arm/configs目录下。)
技术专区Linux下spi驱动技术剖析CYCY88CC2020xxxx66A的主机源串行编程Android系统内核移植流程解读学习HTML和CSS的5大理由RX100系列微控制器可以轻松实现高性价比和超低帧率的应用
文章评论