經過移植學習linux新版本內核,大概瞭解一下內核變化。html
記錄一下移植過程當中遇到的問題或值得注意的地方。linux
1,添加一款arm9芯片的支持網絡
首先修改\arch\arm\tools\mach-types文件函數
添加一行學習
w90p950evb MACH_W90P950EVB W90P950EVB
同目錄下的腳本文件在編譯內核時會根據該文件生成htm
\include\generated\mach-types.hip
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,cmd
machine_arch_type就等於上面定義的宏 1923。it
系統啓動時,在/arch/arm/kernel/setup.c中io
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>