linux内核移植初探(代码片段)

embeded-linux embeded-linux     2022-12-09     671

关键词:

内核移植的梯度:

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

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

高级:修改或添加BSP包

linux内核特性:

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

五大子系统:

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

技术图片

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

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

技术图片

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

平台无关目录树:其它

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

Documentation目录:内核官方文档

fs目录:文件系统的信息

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

mm目录:内存

driver:驱动相关

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

#include <asm/xxx.h>:与CPU体系结构(arch)相关的头文件
#include <linux/xxx.h>:平台无关的头文件
#include <plat/xxx.h>:与某款芯片公司相关的头文件
#include <mach/xxx.h>:与开发板配套的头文件

配置内核

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
arch/arm/mach-s5pv210/Makefile

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-
主Makefile

    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"
主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"
arch/arm/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、在driver目录下创建Makefile文件

技术图片
obj-$(CONFIG_MYLED) += myled.o
Makefile

3、在上层的Makefile文件添加一句obj-y += mydriver/这样上层Makefile文件就会找到mydriver目录下的Makefile文件
4、在driver目录下创建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内核裁剪框架初探(代码片段)

...时希望将Linux作为手机的操作系统, 于是才有了进行内核裁剪的想法并辅助实践,效果尚好,已经能在PDA上执行手机的功能了。一晃20多年过去了,Linux已经有了太大的变化,内核裁剪的技术和方式也有了较大... 查看详情

linux内核裁剪框架初探(代码片段)

...时希望将Linux作为手机的操作系统, 于是才有了进行内核裁剪的想法并辅助实践,效果尚好,已经能在PDA上执行手机的功能了。一晃20多年过去了,Linux已经有了太大的变化,内核裁剪的技术和方式也有了较大... 查看详情

linux系统移植:内核获取和编译(代码片段)

文章目录Linux系统移植:内核获取和编译一、获取Linux内核二、Linux内核编译Linux系统移植:内核获取和编译一、获取Linux内核Linux由Linux基金会管理与发布,Linux官网为https://www.kernel.org,选取合适的版本来使用就行... 查看详情

linux系统移植:bootz启动linux内核(代码片段)

文章目录Linux系统移植:bootz启动Linux内核一、images的全局变量二、do_bootz函数三、bootz_start函数四、do_bootm_states函数五、bootm_os_get_boot_func函数六、do_bootm_linux函数Linux系统移植:bootz启动Linux内核一、images的全局变量启动Linu... 查看详情

2内核的配置和移植(代码片段)

1.linux内核源码目录结构1源码从哪里来之前讲过,我们使用2.6.35.7版本的内核。这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本。我们讲课时使用第三种内核来讲解,... 查看详情

linux系统移植:原厂kernel移植到开发板(代码片段)

...Linux系统移植:原厂Kernel移植到开发板一、获取原厂内核并编译二、内核启动测试三、添加自己板子文件3.1板子配置文件3.2板子设备树3.3编译四、重要配置修改4.1主频修改4.2EMMC驱动修改4.3网络驱动修改4.4保存修改后配置文件... 查看详情

一个linux内核模块移植到低版本时发生的异常(代码片段)

在3.10的内核版本下,有一个运行稳定的内核模块,移植到suse11的时候,编译正常,运行则直接出现crash:<4>[503.347297]CPU0<4>[503.347300]Moduleslinkedin:caq_sendmsg(EN)mysendmsg(EN)witdriver(EN)datalink(EN)w83627dhg(EN)tipc(EX)ossmod(E 查看详情

linux内核移植入门(代码片段)

文章目录基本概念内核源码目录结构内核配置主目录Makefile各子目录Makefile如何配置内核?1.配置仓库选取2.交叉编译器的修改3.体系结构体的选择4.修改配置文件内核编译编译结果:几种linux内核文件的区别开发板上U-Boot启动linux内核... 查看详情

移植linux内核到i.mx6ull过程(代码片段)

...;不错过精彩内容转自|Mculover666本文描述移植NXP官方linux5.4内核到i.MX6ULL开发板。一、NXP官方linux内核1.下载NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。选择该分支下载zip包即可,不要整个 查看详情

移植linux内核到i.mx6ull过程(代码片段)

...;不错过精彩内容转自|Mculover666本文描述移植NXP官方linux5.4内核到i.MX6ULL开发板。一、NXP官方linux内核1.下载NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。选择该分支下载zip包即可,不要整个 查看详情

docker初探(代码片段)

...以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极... 查看详情

linux内核rtc时间架构(代码片段)

...8平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统。《Linux驱动|rtc-hym8563移植笔记》一、Linux时间操作命令:date、hwclockLinux时间有两个:系统时间(WallTime),RTC时间。1)系统时间(WT):由Linux... 查看详情

linux|移植nxp官方linux内核到imx6ull开发板(4.1.15)(代码片段)

一、NXP官方linux内核1.下载NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc。这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是4.1.15)。2.编译安装 查看详情

stm32mp157系统移植|移植st官方5.10内核到小熊派开发板(代码片段)

Linux内核移植流程移植Linux内核到一个新的板子上时,需要以下步骤:(1)选择一个硬件设计接近的板子,基于此板相关文件开始移植(2)拷贝单板配置文件(arch/arm/configs)(3)拷贝设... 查看详情

stm32mp157系统移植|移植st官方5.10内核到小熊派开发板(代码片段)

Linux内核移植流程移植Linux内核到一个新的板子上时,需要以下步骤:(1)选择一个硬件设计接近的板子,基于此板相关文件开始移植(2)拷贝单板配置文件(arch/arm/configs)(3)拷贝设... 查看详情

linux系统移植:kernel顶层makefile(下)(代码片段)

...统移植:Kernel顶层Makefile(下)继续分析Linux内核源码顶层Ma 查看详情

正点原子i.mx6u-mini移植篇u-boot移植过程详解(代码片段)

...移植一个bootloader代码,这个bootloader代码用于启动Linux内核,bootloader有很多,常用的就是U-Boot。移植好U-Boot以后再移植Linux内核,移植完Linux内核以后Linux还不能正常启动,还需要再移植一个根文件系统(rootfs)... 查看详情

apollo移植(代码片段)

...ml)sudoapt-getupdatesudoapt-getupgrade键入以下命令以安装Linux4.4内核sudoapt-getinstalllinux-generic-lts-xenial步骤二:安装Apollo内核从github上的发行版部分下载发行包https://github.com/ApolloAuto/apollo-kernel/releases安装内核在下载发行包之后tarzxvflinux-4... 查看详情