通过移植学习linux新版本内核,大概了解一下内核变化。

记录一下移植过程中遇到的问题或值得注意的地方。

1,添加一款arm9芯片的支持

首先修改\arch\arm\tools\mach-types文件

添加一行

w90p950evb		MACH_W90P950EVB		W90P950EVB

同目录下的脚本文件在编译内核时会根据该文件生成

\include\generated\mach-types.h

其中会生成类似这样的定义:
define MACH_TYPE_W90P950EVB           1923
#ifdef CONFIG_MACH_W90P950EVB
# ifdef machine_arch_type
# undef machine_arch_type
# define machine_arch_type __machine_arch_type
# else
# define machine_arch_type MACH_TYPE_W90P950EVB
# endif
# define machine_is_w90p950evb() (machine_arch_type == MACH_TYPE_W90P950EVB)
#else
# define machine_is_w90p950evb() (0)
#endif

如果配置内核的时候打开了CONFIG_MACH_W90P950EVB,

machine_arch_type就等于上面定义的宏 1923。

系统启动时,在/arch/arm/kernel/setup.c中

void __init setup_arch(char **cmdline_p)
{
struct machine_desc *mdesc; setup_processor();
mdesc = setup_machine_fdt(__atags_pointer);
if (!mdesc)
mdesc = setup_machine_tags(__atags_pointer, machine_arch_type);
machine_desc = mdesc;
machine_name = mdesc->name;
......

调用

setup_machine_fdt(__atags_pointer);

该函数bootloader传过来相关参数,匹配machine type。 如果没传过来参数,调用

setup_machine_tags(__atags_pointer, machine_arch_type);

用1923来匹配,与之匹配的是用MACHINE_START初始化的结构体,在内核中搜索MACHINE_START……

MACHINE_START(W90P950EVB, "W90P950EVB")

第一个参数W90P950EVB通过宏会转换成MACH_TYPE_W90P950EVB,函数通过比较这个值和machine_arch_type进行匹配。

MACHINE_START宏网络上有详细分析,大致就是初始化了struct machine_desc结构体并放到相应的段.

值得注意的是struct machine_desc结构体有一定的变化,

unsigned int        phys_io;    /* start of physical io    */
       unsigned int        io_pg_offst;    /* byte offset for io */

移除,

unsigned long        boot_params;    /* tagged list        */

变成了

unsigned long        atag_offset;    /* tagged list (relative) */

变换关系

boot_params=sdram物理地址+atag_offset,即地址变成了偏移.像nuc900系列,sdram地址0x00000000这两个值就相等.

这个值指示了bootloader传来的参数存放位置。

编译期间遇到问题:

warning: type defaults to 'int' in declaration of 'EXPORT_SYMBOL'

加头文件 include<linux/export.h>

warning: type defaults to 'int' in declaration of 'DECLARE_MUTEX'

从linux2.6.37 DECLARE_MUTEX 已从内核移除

可用DEFINE_SEMAPHORE 替换

error: 'PAGE_SHIFT' undeclared here (not in a function)

加头文件

#include<asm/page.h>

移植linux3.7到nuc900系列开发板遇到的问题的更多相关文章

  1. Linux学习 :移植linux-3.4.83到JZ2440开发板

    一.编译环境搭建: 1.linux源码下载:https://www.kernel.org/ (最新)  https://mirrors.edge.kernel.org/pub/linux/kernel ...

  2. 【转载】如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结

    [好文章值得分享,摘自作者:jesse] 来源:www.armjishu.com作者:jesse转载请注明出处 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM ...

  3. 2019年最受欢迎IMX6系列开发板,资料全开源,助力产品研发不在话下

    迅为IMX6开发板: Android4.4系统  Linux + Qt5.7系统  Ubuntu12.04系统 部分真实案例:HMI:3D打印机:医疗设备:工控机:触控一体机:车载终端 板载:4G全网 ...

  4. Linux学习 :移植U-boot_2012.04.01到JZ2440开发板

    一.下载U-boot源码:ftp://ftp.denx.de/pub/u-boot/ 二.uboot的启动过程: 部分硬件初始化——>加载完整uboot到RAM——>跳转到第二阶段入口开始 ...

  5. 移植opencv2.4.9到itop4412开发板

    OpenCV是眼下开源项目中最著名的基于机器视觉方向的图像处理的开发包,眼下已经有被移植到嵌入式Linux环境上. 本文介绍了OpenCV交叉编译的基本步骤. 在opencv交叉编译之前要先进行依赖库 ...

  6. stm32 nucleo系列开发板的接口

    1. 首先说的是 Arduino接口,所有的nucleo系列都支持这个接口,而且像F767这种尺寸长的板子也有的,不过是双排排针,其实就是外侧也是 Arduino接口 2. 板子接上电脑之后有个串口

  7. Linux学习 :移植linux-4.7.4到JZ2440开发板

    一.编译环境搭建: 1.linux源码下载:https://www.kernel.org/2.安装交叉编译工具链: ①手动下载配置工具链: (1):解压 arm-linux-gcc-3.4.1.tar ...

  8. rt3070无线网卡移植到开发板

    Rt3070无线网卡AP功能移植到GEC210一.平台开发板:GEC210 无线网卡:RT3070主机:VMWare--Ubuntu 10.04 LTS内核版本:linux-2.6.35.7编译器:a ...

  9. 移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)

    目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtopia ,但是目前 Qt 已经发展到最新的 5.7 版本了,我个人也已经使用了很长一段时间的 qt5.6 for w ...

随机推荐

  1. vs2013打包

    C#打包需要这个:InstallShield 2013 Limited Edition for Visual Studio  . 下载地址: InstallShield 2013 Limited Ed ...

  2. 模拟title提示!

    转载http://wouit.com/post/2013-08-15/40052169981html <a href="#" tishi="常见的网页新闻循环跳动显 ...

  3. (C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题

    说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢:在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码: void my ...

  4. 总结在Linux终端中进行算术运算的6种方式

    1.使用bash 使用双括号可以像C语言一样直接使用运算符进行计算. +)) a=$((*)) echo $a b=$(($a-)) echo $b d=$(($b/)) echo $d e=$(($ ...

  5. 版本优化-test

    版本优化 标签(空格分隔): 测试 需求经手人太多,直接提bug,开发不乐意,跟Leader确认不靠谱,跟PM确认,不熟悉流程,跟第三方PM确认靠谱了,结果被开发三言两语,变成了不改bug 而改需求 ...

  6. highcharts图表的常见操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  8. java 反射运用

    一,获取私有的属性,方法,构造器(俗名:暴力反射) 现有一个类,属性,方法,构造器均为私有的,如何创建实例对象,更该属性值,调用方法? public class Student { private S ...

  9. JavaSE 学习笔记之集合框架(十八)

    集合框架:,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区 ...

  10. Shell中的循环语句实例

    1.for循环语句实例1.1 最基本的for循环 #!/bin/bash for x in one two three four do     echo number $x done 注:" ...