系统移植----系统移植步骤

来源:互联网 发布:浙江工业大学内网软件 编辑:程序博客网 时间:2024/04/29 13:41

1、源码

2、解压

# tar xvf linux-3.9.8.tar.xz

 

3、指定交叉编译工具链:两种方法:A B

A、修改源码顶层下的Makeifle

ARCH            ?= $(SUBARCH)

CROSS_COMPILE       ?= $(CONFIG_CROSS_COMPILE:"%"=%)

改为:

ARCH            ?= arm

CROSS_COMPILE       ?= /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-  (目录和编译工具看自己的编译工具及路径)

B、编译时手工指定

# make ARCH=armCROSS_COMPILE=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-

 

4、使用缺省配置

(1)拷贝缺省配置到源码顶层目录下  (将s5pc100_defconfig拷贝到linux-3.9.8目录下)

arch/arm/configs/s5pc100_defconfig --->/

(2)编译系统使用的配置文件是.config

       A、

       #mv s5pc100_defconfig .config

       B、

       #make s5pc100_defconfig   (会生成 . 文件,此文件为隐藏文件 ll 可查看)

 

5、编译

# make zImage  (编译生成内核,u-boot本身只能加载uImage格式的,华清修改后可以加载zImage 压缩的)

# make

/*************************************/

将第五步生成部内核下载到板子上

 

6、运行验证

QA:

错误信息:

Uncompressing Linux... done, booting thekernel.

Warning: Neither atags nor dtb found

错误原因:

U-BOOT传递给内核启动参数错误

       A、U-BOOT设置的内核启动参数就有问题"console"

       B、格式问题(两者格式)

解决办法:

      首先通过命令进入内核配置菜单make muneconfig

       A、内核里面写死启动参数

Boot options  --->

       (...)Default kernel command string

              Kernel command line type (Always use thedefault kernel command string)  --->

       B、使用老格式传递内核启动参数

Boot options  --->

       [*]     Provide old way to pass kernel parameters

===============================================================================

1、编译系统工作原理

make---> 当在终端输入make命令时,会去读取Makefile配置规则并解释执行执行

A、Makefile语法解释

B、shell

C、编译器

 

源码底层/Makefile   (在linux-3.9.8下的makefile, 当运行make命令时,在顶层的makefile文件会去读取每个目录下的makefile文件并执行里面的代码,当执行了会退出目录)

       --->遍历每个源码目录(或配置指定的源码目录)Makefile

              定制要编译对象

       --->回到顶层目录的Makeifle执行编译

 

2、配置规则 

Kconfig ---> (每个源码目录下)提供选项

.config    --->(源码顶层目录下)保存选择结果

Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译

 

Kconfig语法

config CPU_S5PC100

       bool

       selectS5P_EXT_INT

       selectSAMSUNG_DMADEV

       help

         Enable S5PC100 CPU support

 

//对上面的程序进行解释

config ---> 选配 

CPU_S5PC100 --->如果该选项选中则选择结果表示CONFIG_CPU_S5PC100

       bool--->选择可能:TRUE选中、FALSE不选

              如果后面没有字符串名称,则表示其不会出现在选择软件列表中

       select---> 当前选项选中后则select后指定的选项自动被选择

 

config MACH_SMDKC100

       bool"SMDKC100"

       selectCPU_S5PC100

       ...

       help

         Machine support for the Samsung SMDKC100

---------------------------------------------------------

config DM9000

       tristate"DM9000 support"

       dependson ARM || BLACKFIN || MIPS || COLDFIRE

       selectCRC32

       selectNET_CORE

       selectMII

       ---help---

         Support for DM9000 chipset.

 

         To compile this driver as a module, choose Mhere.  The module

         will be called dm9000.

tristate ---> 选中并编译进内核、不选、选中并编译成模块

depends ---> 其后的选项必须先选中,这个选项才能出现被选择

 

这种选择组件进内核编译的形式和VxWorks下组件管理器去选择添加功能一样,选中一个组件,他的Select都会被选中,而depends的会依赖其他组件,就像SSH组件会依赖防火墙组件.

---------------------

当这个配置所在的选项的选中后其自动被选的前提是PCI或ISA或PCMCIA被选中

select HAVE_IDE if PCI || ISA || PCMCIA

 

------------------------

config ARM_DMA_IOMMU_ALIGNMENT

       int"Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->该选项是一个整型值

       range4 9 ---->该选项的范围值

       default8 ---->该选项的默认值

       help

         DMA mapping framework by default aligns allbuffers to the smallest

         ...

------------------------

 

config STACKTRACE_SUPPORT

       bool --->该选项可以选中或不选,且不会出现在选择列表中

       defaulty ---->表示缺省情况是选中

 

------------------------

if ARCH_S5PC100 --->如果ARCH_S5PC100选项选中了则,在endif范围内的选项才会被选

 

config CPU_S5PC100

       bool

       selectS5P_EXT_INT

       selectSAMSUNG_DMADEV

       help

         Enable S5PC100 CPU support

 

....

 

endif

----------------------------

menu "Boot options"  ----> menu表示该选项是不可选的菜单,其后是在选择列表的菜单名

 

config USE_OF

       bool"Flattened Device Tree support"

       selectIRQ_DOMAIN

       selectOF

       selectOF_EARLY_FLATTREE

       help

         Include support for flattened device treemachine descriptions.

....

 

endmenu    ----> menu菜单结束

 

menuconfig MODULES ---> menuconfig表示MODULE是一个可选菜单,其选中后是CONFIG_MODULES

       bool"Enable loadable module support"

       help

         Kernel modules are small pieces of compiledcode which can

         be inserted in the running kernel, ratherthan being 

if MODULES

...

endif # MODULES

 

...

 

----------------------------------

source "init/Kconfig"  --->source表示加载其后字符串中指定的Kconfig

----------------------------------

choice            --->表示选择列表

       prompt"Default I/O scheduler"

       defaultDEFAULT_CFQ

       help

         Select the I/O scheduler which will be usedby default for all

         block devices.

 

       configDEFAULT_DEADLINE

              bool "Deadline" ifIOSCHED_DEADLINE=y

 

       configDEFAULT_CFQ

              bool "CFQ" if IOSCHED_CFQ=y

 

       configDEFAULT_NOOP

              bool "No-op"

 

endchoice

==================================================

.config选择结果

CONFIG_选项名=y 编译进内核

CONFIG_选项名=m 编译成内核模块

CONFIG_选项名=... 参数

==================================================

Makeifle

obj-y += xxx.o表示对应目录下的xxx.c要被编译进内核

obj-m += xxx.o表示对应目录下的xxx.c要被编译成模块

 

obj-$(CONFIG_选项名) += xxx.o表示对应目录下的xxx.c要被编译进内核(当CONFIG_选项名=y时)

                     xxx.o表示对应目录下的xxx.c要被编译成模块(当CONFIG_选项名=m时)

 

内核启动参数:init/linuxrc 第一个运行的程序, 

 

交换分区:

       系统会将一部分程序放在内存上运行,运行完后把当前数据放到一个地方保存(这个地方叫交换分区),然后将另外的程序搬上内存,所以较小的内存可以运行较大的数据。

 

 

 

 

0 0