Linux内核移植初探

发布者:Xinmei最新更新时间:2025-01-08 来源: elecfans关键字:Linux  内核移植  s5pv210 手机看文章 扫描二维码
随时随地手机看文章

内核移植的梯度:


初级:根据芯片公司的参考配置,编译开发板内核并了解执行过程


中极:添加内核驱动的方式方法


高级:修改或添加BSP包


linux内核特性:


可移植性强、支持的硬件平台广泛;超强的网络功能;多任务多用户系统;模块化的设计


五大子系统:


进程管理;内存管理;文件系统;网络协议;设备管理

内核获取路径:芯片厂商、内核源码官方


linux内核的目录结构层次结构:

平台相关目录树:arch目录下


平台无关目录树:其它


crypto目录:算法、加密涉及的源码目录


Documentation目录:内核官方文档


fs目录:文件系统的信息


ipc目录:进程间通信的机制


mm目录:内存


driver:驱动相关


内核源码开发的头文件命名规范


#include :与CPU体系结构(arch)相关的头文件

#include :平台无关的头文件

#include :与某款芯片公司相关的头文件

#include :与开发板配套的头文件


配置内核


1.配置哪些目录需要编译


2.配置哪些文件需要编译


配置方法:Makefile

主目录Makefile:


包含体系结构下的Makefile


# Use LINUXINCLUDE when you must reference the include/ directory.

# Needed to be compatible with the O= option

LINUXINCLUDE    := -I$(srctree)/arch/$(hdr-arch)/include

                   -Iarch/$(hdr-arch)/include/generated -Iinclude

                   $(if $(KBUILD_SRC), -I$(srctree)/include)

                   -include include/generated/autoconf.h

   hdr-arch := $(SRCARCH)


#包含体系架构下的Makefile

include $(srctree)/arch/$(SRCARCH)/Makefile


ARCH ?= arm

CROSS_COMPILE ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

# Architecture as present in compile.h

UTS_MACHINE := $(ARCH)

SRCARCH := $(ARCH)


# Additional ARCH settings for x86

ifeq ($(ARCH),i386)

SRCARCH := x86

endif

ifeq ($(ARCH),x86_64)

SRCARCH := x86

endif


各个子目录的Makefile

例:arch/arm/mach-s5pv210下的Makefile


# arch/arm/mach-s5pv210/Makefile

#

# Copyright (c) 2010 Samsung Electronics Co., Ltd.

#         http://www.samsung.com/

#

# Licensed under GPLv2


obj-y                :=

obj-m                :=

obj-n                :=

obj-                :=


# Core support for S5PV210 system


obj-$(CONFIG_CPU_S5PV210)    += cpu.o init.o clock.o dma.o

obj-$(CONFIG_CPU_S5PV210)    += setup-i2c0.o

obj-$(CONFIG_S5PV210_PM)    += pm.o sleep.o

obj-$(CONFIG_CPU_FREQ)        += cpufreq.o


# machine support


obj-$(CONFIG_MACH_AQUILA)    += mach-aquila.o

obj-$(CONFIG_MACH_SMDKV210)    += mach-smdkv210.o

obj-$(CONFIG_MACH_SMDKC110)    += mach-smdkc110.o

obj-$(CONFIG_MACH_GONI)        += mach-goni.o

obj-$(CONFIG_MACH_TORBRECK)    += mach-torbreck.o


# device support


obj-y                += dev-audio.o

obj-$(CONFIG_S3C64XX_DEV_SPI)    += dev-spi.o


obj-$(CONFIG_S5PV210_SETUP_FB_24BPP)    += setup-fb-24bpp.o

obj-$(CONFIG_S5PV210_SETUP_FIMC)    += setup-fimc.o

obj-$(CONFIG_S5PV210_SETUP_I2C1)     += setup-i2c1.o

obj-$(CONFIG_S5PV210_SETUP_I2C2)     += setup-i2c2.o

obj-$(CONFIG_S5PV210_SETUP_IDE)        += setup-ide.o

obj-$(CONFIG_S5PV210_SETUP_KEYPAD)    += setup-keypad.o

obj-$(CONFIG_S5PV210_SETUP_SDHCI)       += setup-sdhci.o

obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO)    += setup-sdhci-gpio.o


obj - y  :=   编译进内核

obj - m :=   以模块形式编译

obj - n  :=   不编译 

obj -     :=   不编译


 哪些文件需要编译?


  CONFIG_XXX 


  配置单:


    在/arch/arm/configs默认目录下

  配置过程:


    1、导出需要的默认配置文件到主目录下并更名为.config

    2、交叉编译器的修改

    3、体系结构(System Type)的选择:S5PV210



ARCH ?= arm

CROSS_COMPILE ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

    4、配置单(.config)增删改查--->使用make menuconfig实现图形化更改配置


                      Kconfig----> make menuconfig ---> .config ---->Makefile


Kconfig语法:

source:相当于include描述一包含关系

menu、endmenu:用来定义菜单如:


menu 'System Info'

end menu

执行make menuconfig 则:

.config中增加一条:CONFIG_ABC = y

即config ----> CONFIG_ABC =y---->Makefile中的obj-$(CONFIG_ABC) += xx.o


通过make menuconfig中的-----相应选项的help----->找到相应选项的Kconfig---->Makefile中对应的文件 .c


  例如:

     找menuconfig下的Samsung SoC serial support定义的(Kconfig)位置:


            法一:选中这个选项键盘单击h按键

            法二:搜索grep -nR 'Samsung SoC serial support'


    同样在Kconfig所在目录下的Makefile文件即可找到对应的.c文件                                              


通过Makefile  .o ----->找到Kconfig:同上↑


config:用来配置菜单子目录的内容


menu 'System Info'

config ABC

     bool 'This is a test config'

   help 

     Support test config

endmenu


执行make menuconfig 则:

Kconfig配置主线


# For a description of the syntax of this configuration file,

# see Documentation/kbuild/kconfig-language.txt.

#

mainmenu 'Linux/$ARCH $KERNELVERSION Kernel Configuration'


config SRCARCH

    string

    option env='SRCARCH'


source 'arch/$SRCARCH/Kconfig'


      ---->source “arch/$SRCARCH/Kconfig”      


config ARM

        bool

        default y

        select HAVE_AOUT

        select HAVE_DMA_API_DEBUG

        select HAVE_IDE

        select HAVE_MEMBLOCK

.......

...........

config HAVE_PWM

        bool

config MIGHT_HAVE_PCI

        bool

config SYS_SUPPORTS_APM_EMULATION

        bool

config HAVE_SCHED_CLOCK

        bool

config GENERIC_GPIO

        bool

............

................

menu 'Power management options'

source 'kernel/power/Kconfig'

config ARCH_SUSPEND_POSSIBLE

        depends on !ARCH_S5P64X0 && !ARCH_S5PC100

        depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 ||

                CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE

        def_bool y

endmenu

source 'net/Kconfig'

source 'drivers/Kconfig'

source 'fs/Kconfig'

source 'arch/arm/Kconfig.debug'

source 'security/Kconfig'

source 'crypto/Kconfig'

source 'lib/Kconfig'


        --->source 'net/Kconfig'

   --->source 'drivers/Kconfig'

   --->source 'fs/Kconfig'

   --->source 'arch/arm/Kconfig.debug'

   --->source 'security/Kconfig'

   --->source 'crypto/Kconfig'

   --->source 'lib/Kconfig'


添加驱动到Linux内核中的步骤:以myled.c字符驱动为例

1.可以在/drivers/char/目录下新建文件夹mydriver,然后复制myled.c到mydriver目录

2、在mydriver目录下创建Makefile文件



obj-$(CONFIG_MYLED) += myled.o

3、在上层的Makefile文件添加一句obj-y += mydriver/这样上层Makefile文件就会找到mydriver目录下的Makefile文件

4、在mydriver目录下创建Kconfig文件


menu 'My Personal Device Driver'

config MYLED    

    bool 'Support myled device driver'

    help

           Support led driver for S5PV210

endmenu


 5、在上层的Kconfig文件添加一句source 'driver/char/mydriver/Kconfig'这样上层Kconfig文件就会找到mydriver目录下的Kconfig文件

 6、执行make menuconfig 选中My Personal Device Driver --->Support myled device driver之后执行make uImage 重新编译内核即可


内核编译过程


make :


  make Image     make zImage   make uImage (专为uboot启动准备的内核镜像 )      //编译的是obj-y    


  make modules   //编译的是obj-m


make uImage (vmlinux-->Image-->vmlinux-->zImage-->uImage) 


直接执行make uImage 报错解决办法:

  进入u-boot源码,在编译完成的uboot源码中进入tool目录,找到mkimage文件,将其复制到/bin根目录


vmlinux :OS elf file  ---OBJCOPY拷贝生成Image

Image:未压缩,所以比较大

zImage:经过压缩的Image文件 


自定义BSP的过程


关键字:Linux  内核移植  s5pv210 引用地址:Linux内核移植初探

上一篇:linux下的misc设备led示例
下一篇:5.4.9.linux内核的gpiolib学习1

推荐阅读最新更新时间:2026-03-23 10:58

Linux移植内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容较多,这里只是简单介绍下内核启动流程。先看一下内核启动的流程框图,截图来自《嵌入式Linux应用开发完全手册》。内核引导阶段已经分析过,接下来分析一下内核启动的第二阶段。 1、start_kernel函数全局概览 2、start_kernel函数调用层次 1、start_kernel函数全局概览,对start_kernel作一下粗略注释。 打开initMain.c ,下面主要分析处理UBOOT传入的参数,其中r1是传入的第一个参
[单片机]
<font color='red'>Linux</font><font color='red'>移植</font>之<font color='red'>内核</font>启动过程start_kernel函数简析
基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 摘要 上一篇 博文在tiny4412上移植了MMA7660驱动程序,使用的是exynos4
[单片机]
基于tiny4412的<font color='red'>Linux</font><font color='red'>内核</font><font color='red'>移植</font> -- MMA7660驱动<font color='red'>移植</font>(九-2)
基于tiny4412的Linux内核移植(支持device tree)(二)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 步骤 继续上文。 由于Linux-4.4.0对tiny4412已经有了很好的支持,所以留给我
[单片机]
linux内核移植s3c2410,准备工作,继续
vmlinux在链接时,使用的文件是在vmlinux-all中定义的所有文件,链接俄脚本是在arch/arm/kernel/vmlinux.lds中定义该如何 链接这些文件。 总结上面: 真个的 linux的源码是通过Makefile来实现项目的 管理的,顶层的Makefile定义了那些文件夹 中的 内容 被编译进内核,各级 的子目录下的Makefile决定该目录下的那些文件被编译进内核。 对于编译选项的设置的话,存在全局的,局部的和仅对一个文件 起作用的选项。 3.内核的Kconfig文件的 分析 在linux内核目录下,如果直接使用make menuconfig的话,出现的配置界面就是使用的是Kbuild来实现的。最终通过ma
[单片机]
S3C2440移植linux3.4.2内核之支持YAFFS文件系统
获取yaffs2源码并给内核打补丁 首先获取yaffs2源码(参考git命令使用详解) cd /work/nfs_root git clone git@github.com:lifeyx/yaffs2.git //若下载出现error:403,可以试试vi /etc/resolv.conf,将nameserver地址改为: 114.114.114.114 将yaffs2源码来配置到内核里(使内核支持yaffs2) vi /work/nfs_root/yaffs2/README-linux 参考上图: /*给内核打补丁*/ cd /work/nfs_root/yaffs2/ ./patch-ker.sh c m /w
[单片机]
linux内核移植之二 linux-4.1.4的移植过程
linux-4.1.4中已经有mini2440的驱动程序,所以移植工作比较少. 1. 分区表的修改 arch/arm/mach-s3c24xx/mach-mini2440.c中修改为分区表mini2440_default_nand_part使得分区于移植u-boot的分区定义一致,如下: 0 - 0x100000 1M u-boot 0x100000 - 0x140000 256K u-boot环境参数 0x140000 - 0x540000 4M linux内核 0x540000 - 最后 文件系统 2. 修改配置文件 cp arch/arm/configs/s3c2410_defconfig arch/arm/confi
[单片机]
mini2440 u-boot linux 内核启动,移植较新(Linux3.19)内核至mini2440开发板(一)
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns s3c24xx-nand s3c2440-nand: NAND soft ECC nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda nand: Samsung NAND 256MiB 3,3V 8-bit nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64 Creating 5 MTD partitions on nand : 0x000000
[单片机]
05-S3C2440学习之内核移植linux3.4.2移植(2) yffs2文件系统移植+内核裁剪+内核制作补丁
一、移植YFFS2文件系统 yffs文件系统更加支持nand设备 上节移植了jffs2文件系统(点击查看)到移植的内核中,这节我们将yffs2文件系统移植到刚移植好的内核中。 (1)获取源码并解压 git clone git://www.aleph1.co.uk/yaffs2 tar xjf yaffs2.tar.bz2 (2)给内核打上yffs2补丁 ./patch-ker.sh c m /home/book/linux-3.4.2 (3) 配置内核支持YAFFS 1. ls fs/yaffs2 (4)编译、生成uImage 出错,制作yffs2 source工程. (
[单片机]
05-S3C2440学习之<font color='red'>内核</font>(<font color='red'>移植</font>)<font color='red'>linux</font>3.4.2<font color='red'>移植</font>(2) yffs2文件系统<font color='red'>移植</font>+<font color='red'>内核</font>裁剪+<font color='red'>内核</font>制作补丁
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved