linux 内核移植(八)——移植三星移植过的内核

8.21

1:做好移植前的准备工作

获取三星移植过的kernel,创建SI工程,添加到虚拟机中,修改Makefile的ARCH和CROSS_COMPILE修改结果如下

ARCH = arm

CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

然后试着去配置,(在arch/configs/下找一个最接近自己开发板的,这里选择的是smdkv210_android_defconfig)得到.config文件,然后make menuconfig,因为暂时还没有进行移植,所以这里先不进行配置,直接make -j4去编译。并将编译后得到的zImage下载到开发板中,尝试去运行,

2:运行结果如下

并没有看到

自解压代码运行后打印的信息

kernel运行打印的第一句信息

分析:

(1)kernel运行只得到Starting kernel ...并且没有看到自解压代码运行后的打印信息,说明kernel根本就没有被运行,所以问题出在解压相关的部分

(2)进一步分析,因为自解压代码是硬件无关的,所以自解压代码是不会出错的,所以问题出在解压后,运行前,也就是解压后kernel被放置到什么地方去运行了。

(3)内核里面可以设置将来解压后代码被放到什么地方,这个地址如果设置不对,内核就有可能运行不起来,所以这个内核配置的解压地址地址必须和我们的链接地址相同,所以这个时候需要确定内核的链接地址和内核中配置的解压地址是多少

(4)还有一个问题:内核的链接地址是一个虚拟地址,而自解压代码解压内核时需要的是物理地址(原因是自解压代码运行时内核还未运行,MMU还未开启),所以上面说的等于,其实是链接地址的虚拟地址等于解压地址的物理地址

(5)在head.S中就定义了这两个地址

分别是0xC0008000和0x30008000。那么自解压代码配置的解压地址应该是30008000.

(6)解决办法:自解压代码对应的自解压地址在mach/Makefile.boot文件中。在其中修改,加入两行:

# override for SMDKV210

zreladdr-$(CONFIG_MACH_SMDKV210) := 0x30008000

params_phys-$(CONFIG_MACH_SMDKV210) := 0x30000100

(7)同步代码,并且编译,得到的zImage复制到/tftpboot,然后重新下载运行查看结果。

3:结果就是:

还是没运行,但是有效果。自解压代码解压打印信息已经出来了。但是内核还没运

分析:

自解压的代码已经打印,说明自解压已经完成,所以问题应该处在代码运行的地方,查看head.S中的物理地址宏定义可知

这里将PHYS_OFFSET这个宏设置在了2000000这个地址处,而我们在uboot是将内存配置在30000000开头处的

解决办法:将物理地址的宏定义20000000 改为30000000

重新烧录运行结果如下

内核已经启动,但是5秒后由会重启,说明内核启动还是有问题

分析:

说明机器码校验通过

说明uboot传参没问题

错误发生的地方,内核遭遇了野指针,

继续往下分析

这里的pgd是内存管理相关的,和我们移植没关

Internel error :内部错误

Oops :内核错误的致命信息,启动时看到Oops表示内核已经死了,死亡信息也在这附近

PC is at dev_driver_string+0xc/0x44

LR is at max8698_pmic_probe+0x150/0x32c

从以上错误信息中的PC和LR的值可以看出,程序是执行到dev_driver_string或者max8698_pmic_probe(这两个是函数或者汇编中的标号)符号部分的时候出错了。我们就从这两个符号出发去寻找、思考可能出错的地方然后试图去解决。

分析:

(1)max8698_pmic_probe看名字是max8698这个电源管理IC的驱动安装函数部分出错了,应该是我们的开发板系统中配置了支持这个电源管理IC,于是乎启动时去加载他的驱动,结果驱动在加载执行的过程中出错了OOPS了。

(2)结合我们X210开发板的硬件实际情况来分析:我们X210开发板上根本就没有max8698这个电源管理IC,既然硬件都没有驱动执行了肯定会出错。

(3)回忆当时从三星版本的uboot移植的时候,在uboot的lowlevel_init.S中也有调用个电源管理IC初始化函数(PMIC_init),后来解决的办法就是屏蔽掉了这个函数的调用,uboot就成功运行下去了。

解决办法:通过menuconfig配置面板中去配置,取消max8698的配置,使其不被编译(先使用搜索/功能区定位配置的路径,然后去配置即可)

编译运行结果

错误原因是没有挂载根文件系统

分析:

(1)我们这里本身就没有挂载根文件系统,所以,这里报错是正常的

(2)内核启动到根文件系统挂载,说明之前的初始化配置都是正确的。

时间: 2024-12-20 01:08:56

linux 内核移植(八)——移植三星移植过的内核的相关文章

linux 链表之: list.h移植

链表是内核中非常非常重要的基础设施,并且在应用层也可将该套设施拿过来用. 这里就是将内核的list.h中部分接口拿到应用层用,其实应用层.内核层都一样, 这里之所以在应用层操作,只是因为测试更为方便. 将内核中的链表list.h移植到应用层的文件如下: [email protected]:/mnt/shared/kernelbox/list# tree . ├── list.h //内核中的list.h移植过来 ├── listuse.c//测试代码 ├── Makefile //Makefil

S5PV210开发系列八_Yaffs的移植

S5PV210开发系列八 Yaffs的移植 象棋小子    1048272975 Nand作为市面上最基本的非易失性闪存技术之中的一个,应用在各种固态大容量存储解决方式中.因为Nand flash自身的特点,Nand存储器往往须要一款专用的Nand文件系统进行管理.开源的Yaffs文件系统因为其优异的性能,在Nand flash中受到广泛的应用,笔者此处就Yaffs的移植作一个简单的介绍. 1. Yaffs概述 Yaffs是由Aleph One公司所发展出来的Nand flash文件系统,专门为

QT5.6移植到ARM三星4412

嵌入式linux之QT5.6移植 1 1.1 简介 1 1.2 移植 2 1.2.1 源码下载链接 2 1.2.2 移植准备工作 3 1.2.3 解压qt源码包 3 1.2.4 配置编译环境 3 1.2.5 删除目录 4 1.2.6 生成Makefile 5 1.2.7 编译安装 5 1.2.8 编译成功 6 1.2.9 添加环境变量 6 1.2.10 查看qmake版本 7 1.2.11 编译ARM版的QT程序 7 1.3 部署开发板运行环境 7 1.3.1 拷贝QT运行库 7 1.3.2 l

(转)在嵌入式Linux系统(OK6410)中移植Boa 服务器

OK6410的Boa服务器移植: <一> Boa的编译 1. 从 www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz. 2. 解压:tar xzf boa-0.94.13.tar.gz 3. 进入解压后的文件夹 boa-0.94.13内部的 src文件夹,对源文件进行如下修改 ================================================= 由于arm-linux-gcc 编译器版本过高,对语法的支持有一些改变,所以需要

20135302魏静静——linux课程第八周实验及总结

linux课程第八周实验及总结 实验及学习总结 1. 进程切换在内核中的实现 linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的. 实现的时机有以下三个时机: 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度: 用户

攻城狮在路上(叁)Linux(十八)--- 文件系统的简单操作

本篇仅作为补漏. 一.查看磁盘和目录的容量:df  du df:列出文件系统的整体磁盘使用量. du:评估文件系统的磁盘使用量(常用于评估目录所占容量) 二.连接文件:ln 1.hard link:硬连接或实际连接 ln /etc/crontab crontab1; <== 创建硬连接 硬连接不创建文件(虽然使用ls命令时可以看到一个新的文件,但是两者的inode一致),仅是在目录block中增加一个文件名-inode的映射而已. 限制: A.不能跨文件系统. B.不能连接到目录(因为复杂度较高

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)

linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86可以有4种模式RING0~RING3  RING0特权模式给LINUX内核空间RING3给用户空间linux内核是如何组成的?答:linux内核由SCI(System Call Interface)系统调用接口.PM(Process Management)进程管理.MM(Memory Managem

大话Linux内核中锁机制之RCU、大内核锁

大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linux内核中锁机制>系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点. 十.RCU机制 本节将讨论另一种重要锁机制:RCU锁机制.首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界

linux安全第八周总结

20135336 王维臻 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 一.知识概要 (一)进程切换的关键代码switch_to分析 1.进程进度与进程调度的时机分析 2.进程上下文切换相关代码分析 (二)Linux系统的一般执行过程 1.Linux系统的一般执行过程分析 2.Linux系统执行过程中的几个特殊情况 3.内核与舞女 (三)Linux系统架构和执行过程概览 1.Linux操作系统架构概览 2