• 移植linux3.7到nuc900系列开发板遇到的问题


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

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

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

    首先修改archarm oolsmach-types文件

    添加一行

    w90p950evb		MACH_W90P950EVB		W90P950EVB

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

    includegeneratedmach-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>

  • 相关阅读:
    游戏开发挑战中心规划(16)
    游戏开发关卡设计(16)
    借鉴来的面试经验
    Scrapy:学习笔记(2)——Scrapy项目
    Scrapy:学习笔记(1)——XPath
    Django:学习笔记(8)——文件上传
    And Design:拓荒笔记——Form表单
    React:快速上手(7)——使用中间件实现异步操作
    JavaScript:学习笔记(9)——Promise对象
    JavaScript:学习笔记(8)——对象扩展运算符
  • 原文地址:https://www.cnblogs.com/fengeryi/p/3419160.html
Copyright © 2020-2023  润新知