通过移植学习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>