s5pv210 linux内核移植,S5PV210-kernel-从三星官方的内核开始移植
1、拿到三星官方移植过的内核
2、在Linux下解压一份在共享目录下,解压一份在Linux的源生目录下。一份编辑,一份编译
3、建立SI工程,添加kernel源代码
4、在Linux下先看makefile中的CROSS_COMPINE交叉编译工具链和ARCH的架构对不对
5、在arch/arm/configs这个目录下找到和我们开发板最接近的一个配置,用这个配置文件,我们在kernel根目录下,make xx_defconfig这个配置文件,得到一个将这个配置文件的内容复制到.config的这个文件,在make menuconfig,退出后,在make -j2 我的Ubuntu是2个处理器,所以可以用2线程加速编译,编译好后,在uboot下用tftp命令下载到内存中,启动一下这个内核看下情况。
5、
(1)我们启动后发现,内核无法启动,并且第一句话都没有打印出来,就是那句解压代码运行的时候打印的信息都没有打印出来,
(2)所以问题就是出在了这里,但是解压代码是不可能出现问题的,因为解压代码是和架构无关的。
(3)所以问题出在内核配置中,配置解压代码将内核解压后,将内核放在哪里了,可能是解压代码解压后将内核放的内存位置不对导致的,这个是在内核配置中可以配置的
(4)内核配置的解压地址应该和内核的链接地址一样,否则自解压后内核是无法运行的。
所以要看内核的链接地址等于多少?内核配置的解压后的内核地址是多少
(5)但是这里面有个问题,就是,我们内核链接的地址是虚拟地址,而我们解压代码解压内核的时候需要的是物理地址,所以上面说的内核配置的解压后的地址的等于,应该是等于内核链接处虚拟地址对应的物理地址。
(6)所以我们要看我们的物理地址和虚拟地址分别是多少,内核链接的时候
在head.S中,虚拟地址找到 虚拟地址是 0XC0008000 物理地址是0X20008000。所以可以知道我们内核配置的自解压地址应该是0X30008000,
(7)自解压地址在mach/Makefile.boot中可以找到,但是这个文件中没有对应的我们开发板的宏中的地址,因为我们的物理地址是根据SMDKV210这个宏找的,所以我们要在这个文件中添加一个配置,配置信息如下:
# override for SMDKV210
zreladdr-$(CONFIG_MACH_SMDKV210):= 0x30008000
params_phys-$(CONFIG_MACH_SMDKV210):= 0x30000100
这里面还有内核参数的地址,都不对,解压地址需要弄成30008000,参数地址要弄成30000100,虽然这个文件中默认配置的解压地址是20008000,内核参数地址是20000100,并且内核物理链接地址在这个kernel中配置的也是20008000,但是因为我们DDR在uboot阶段初始化配置的时候,我们的DDR是从0X30000000-0X3FFFFFFF这段空间的,所以没有2开头的物理内存来用,在下载内核的时候我们也不能将内核下载到这个20008000地址去运行,所以是不行的,多以需要改成30008000,内核链接的物理地址,和解压的物理地址都要改成30008000
1、6、老朱插播的一节课,内核中机器码的确定
1、MACHINE_START宏
(1)这个宏是用来定义一个机器码的数据结构的
(2)在每一个mach-xxx.c的文件中,最后的位置都有一个这个宏,这个宏定义了这个开发板对应的机器码对应的数据结构,这个宏带的参数一个是tpye,一个是name,如果我们将这个宏解析开后,会发现一个是将MACH_TYPE_XXX(这个XXX用tpye这个参数替代了)的机器码,和对应的开发板的名字,并且这个宏将定义的这一个结构体变量放在了一个特定的段中,将我们通过和我们uboot中传递过来的机器码来在这个段中进行机器码的匹配,匹配到了就将这个机器码对应的结构体数据结构取出来准备进行使用。
(3)经过对arch/arm/mach-s5pv210/Makefile的分析,我们发现我们用的是mach-smdkc110.c这个开发板。所以这个文件才是我们值得关注的文件,
2、硬件驱动的加载和初始化函数执行
(4)这个宏中定义的那个结构体变量中,.init_machine= smdkc110_machine_init这个很重要,这个函数就是将来我们内核启动的时候,加载硬件驱动时的初始化函数,如果一旦找到了对应的机器码对应的结构体变量,就会把这个结构体变量拿出来使用,这个变量中的这个.init_machine= smdkc110_machine_init成员,在使用的时候,就会对硬件驱动加载。所以这个函数非常的重要。
分析:由于我们在这个文件machine-smdkc110.c中用那个宏定义了一个结构体变量,放在了特定段中,包含了开发板的机器码。开发板的名字。开发板对应的硬件驱动加载初始化函数的函数指针,这个函数是我们内核启动时初始化所有硬件,内核初始化硬件时打印的相关信息也是从这里打印出来的。
在我们的start_kernel这函数中,将uboot的bootargs参数分割成一个一个的项目,然后又将uboot中传过来的机器码在自己的那个特定段中进行匹配所对应的那个数据结构,这个循环匹配是最终搜索是在.S文件中用__loop去寻找的,并且返回了一个这个类型的结构体指针给一个结构体指针,在后来这个结构体中的那个关于初始化硬件,硬件驱动加载的那个函数就被调用了。所以对硬件驱动进行了加载。所以我们才能在内核启动的时候看到那么多的硬件信息
1、7、之前我们启动内核的时候,内核会重新启动,解决内核启动时的错误
1、认识内核启动OOPS
(1)内核启动时的致命信息就叫OOPS,内核死的原因就在这附近
(2)经过分析这两个错误信息提供了有效信息
PC is at dev_driver_string+0xc/0x44
LR is at max8698_pmic_probe+0x150/0x32c
(3)因为我们的x210开发板,没有这个max8698电源管理IC,而我们的内核中却配置了这个电源IC的驱动,所以会找不到硬件,所以会错误,我们只要在内核配置信息中,将这个配置信息去掉就行,利用make menuconfig,用/搜索max8698,将这项配置取消就行。
s5pv210 linux内核移植,S5PV210-kernel-从三星官方的内核开始移植相关推荐
- 十三.linux开发之uboot移植(十三)——三星官方uboot移植过程详解
2018/08/12 21:39 有道云地址:http://note.youdao.com/noteshare?id=9ab91347c6ce1b15ef0c3fa8e8a60605&sub= ...
- uboot移植——使用三星官方的uboot进行移植
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6460902.html 总结的思维导图下载地址:https:// ...
- 三星官方smdkv210 uboot移植到我的s5pv210开发板
北京 2020-7-26 19:44 周日 昨天外面闷热 今日凉快.空调一开啥事没有!O(∩_∩)O 用了差不多两个周末蹲家里移植的.进度比较慢,算是把uboot相关的一些东西基本了解了. uboot ...
- s5pv210 linux内核移植,S5PV210(TQ210)学习笔记——内核移植与文件系统构建之二
由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习. 三 设置uboot启动参数 我的nfs根目录为/nfsroot,我 ...
- S5PV210 Linux内核移植 - 天嵌E8
1.获取Linux-4.19.114 内核代码 从kernel.org下载最新版本的内核: https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ ...
- linux中内核中machine_desc,Linux-内核-学习笔记(13):移植三星官方内核
Linux-内核-学习笔记(13):移植三星官方内核 一.移植前的准备 当拿到源代码时,首先要在window下利用SourceInsight创建一个工程,并将uboot源代码加载到SI中,方便修改和查 ...
- kernel移植——从三星官方内核开始移植
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.内核移植初体验 1.三星官方移植版内核获取 源码包来于三星的SMDKV210开发板附带的光盘资料,下载地址. 2.构建移植环境 (1)W ...
- TQ210 —— s5pv210 Linux内核结构
Linux内核结构 1.内核的子系统 (1) 系统调用接口SCI(System Call Interface):SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核 ...
- 《17.内核的移植1-从三星官方内核开始移植》
转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <17.内核的移植1-从三星官方内核开始移植> 第一部分.章节目录 2.17.1.内核移植初体 ...
最新文章
- c3074 无法使用带圆括号的_助力带分类简介
- 使用Flink的Savepoint功能
- 《机器学习》 —— 第一章:绪论 学习笔记
- label标签/标记
- “约见”面试官系列之常见面试题之第四十九篇之ie6bug的解决办法(建议收藏)
- C++(3)--编译、gdb调试
- mysql numeric float_sql 下,float和numeric
- 使用SQL PLUS生成报表
- 多元线性回归模型_Eviews系列3|经典线性回归模型之相关分析及多元线性回归分析...
- SSH: scp 拉取云端文件到本地端
- firework算法_FireWorks 自从烟花算法的开创性论文由谭营教授等人于2010年发表之后 联合开发网 - pudn.com...
- cpu压测 windows_小白求问怎么用AIDA64进行CPU压力测试
- 《C陷阱与缺陷》学习笔记(1):这本书值得看吗?
- 不明白如何将批量图片格式转换?2招教你们快速搞定
- 华硕ProArt创16 2022:为创作而生
- QT图形显示和处理7
- 实体认证与身份识别概述
- 从今天起,我决定去掉cnzz统计
- C语言程序设计实验报告——实验七
- 混合现实门户SteamVR环境下