关注分享主机优惠活动
国内外VPS云服务器

linux内核移植介绍(Linux内核安装教程)

摘要:要表达,不要用压缩。两者的区别是内核先解压到低端内存,内核再解压到高端内存。如果内核很小,可以用任一个,如果很大,就要用。这样内核就可以开始复制一个文件或链接到它。

文章目录基本概念内核源码目录结构内核配置主目录Makefile如何在各个子目录下配置内核Makefile?1.配置仓库2的选择。交叉编译3的修改。建筑的选择。修改配置文件内核编译和编译结果:开发板上几个linux内核文件U-Boot的区别启动linux内核1的Kconfig语法。Makemenuconfig是怎么找到Kconfig的?2.安怎么样。o由2编译的文件。在Kconfig中配置的Makefile?将驱动程序添加到内核概念中。添加步骤1。把我们开发的驱动myleddev.c放到一个可以自我描述的目录下,比如/drive/char/myled目录。2.在myled目录中添加并编辑Makefile。将myleddev.c与Makefile相关联:3。使用make menuconfig编译并执行应用程序。1.将编译好的内核下载到开发板。2.确定内核是否运行了指示灯驱动程序。3.创建一个设备节点,其中LED驱动器与应用程序直接相连。4.测试图资源。

基本概念linux内核特性:

1.可移植性,广泛支持的硬件平台2。超级网络功能3。多任务多用户系统。模块化设计。

五个子系统:

1.流程管理子系统2。内存管理子系统3。文件系统子系统4。网络协议子系统5。设备管理子系统。

获取linux内核:

1.内核2官方发布点。由芯片制造商提供

内核源目录结构

内核配置Makefile并使主目录Makefile和子目录Makefile共同指定内核的编译规则。

2.通过make menuconfig和Kconfig修改内核的配置列表,从而自动完成内核配置。

选择将哪些文件编译到内核中。

Makefile Makefile主目录位置:linux-3.0.8/Makefile。

以下是Makefile中的部分代码。根据arch平台,配置包含子目录的头文件目录和子目录的Makefile。

根据SUBARCH配置SRCARCH,SUBARCH默认为X86。

导出KBUILD _ build host:= $(SUBARCH)ARCH?= $(SUBARCH)CROSS_COMPILE?= $(config _ Cross _ compile:" % " = %)//交叉编译器设置# compile中存在的体系结构。huts _ machine:= $ (arch)src arch:= $(arch)# x86 ifeq的附加arch设置($(arch),i386)src arch:= x86 endif ifeq($(arch),x86 _ 64) src arch: = x86 endif头文件目录包含子目录arch/arm/include:

-I $(srctree)/arch/$(HDR -arch)/include包含子目录arch/arm/Makefile文件:

include $(srctree)/arch/$(SRCARCH)/Makefile SRCARCH = arm HDR -arch arm

每个子目录Makefile obj-y:编译成内核obj-:不编译成obj-m:以模块形式编译。

如何配置内核?1.选择配置仓库。1.SUBARCH默认是X86,内容默认配置是安装变量X86 ARCH,改成arm。

CROSS_COMPILE:在一个计算机环境中运行的编译器可以编译在另一个环境中运行的代码。

2.将编译哪些文件?

这些文件是否编译取决于子目录下的Makfile文件中是否定义了CONFIG_xxx变量(obj-y编译成内核,obj-m以模块形式编译)。

主Makefile如何将这些文件引入到我们的整个环境变量中?通过配置表中定义的CONFIG_xxx

3.配置表:芯片厂商在提供BSP的时候,会提供一个参考配置表,可以大大简化我们的配置流程。

cs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8/arch/arm $ ls # arm架构下的子目录kconfig common mach -at 91 mach -dove mach -Gemini mach -IOP 32 mach -kirkwood mach -MMP mach -netx MAC。H-Orion 5 x mach -s3c 2400 mach -s3c 2443 mach -s5pv 210 mach -spear 6 xx mach -多功能nwfpe plat -omap plat -三星vfpkconfig -n ommu configs mach -BCM ring mach -ebsa 110 mach -h720 x mach -IOP 33 x mach -ks 8695 mach -MSM mach -nomadik mach -pnx 4008 mach -s3c 2411 plat -nomadik pl at-s5p tools cs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8/arch/arm $ CD configs/cs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8/arch/arm/configs $ ls # 配置表所在的目录Config sacs 5k _ def Config at 91 Sam 9260 ek _ def Config CERF Cube _ def Config CPU 9g 20 _ def Config exy nos 4 _ def Config h 7202 _ def Config ixp 4 xx _ def Config魔术师_ def Config mx3 _ def Config nuc 960 _ def Config px a168 _ def Config s 3c 2410 _ def Config spear 3 xx _ de fconfig us B-a 9260 _ DefConfig ACS 5k _ tiny _ def Config at 91 Sam 9260 at 91 Sam 9 rlek _ def config colibri _ pxa 270 _ def config ebsa 110 _ def config g3evm _ def config IOP 13 xx _ def config lart _ def config MSM _ def config net winder _ def config palmz 72 _ def config qil -a 9260 _ def config s5pv 210 _ def config TCT _ hammer _ def config xcep _ def config AP 4 evb _ def config at 91 x40 _ def config colibri _ pxa 300 _ def config EDB 721 默认配置,并且每个配置列表对应arm架构下的目录,例如“ixp2000_defconfig”对应“mach-ixp2000”。

配置表的内容如下(y表示其对应的文件将被编译到内核中):

cs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8/arch/arm/configs $ cat s5pv 210 _ defconfigCONFIG _ EXPERIMENTAL = yCONFIG _ sys fs _ DEPRECATED _ V2 = yCONFIG _ BLK _ DEV _ INITRD = yCONFIG _ KALLSYMS _ ALL = yCONFIG _ MODULES = yCONFIG _ module E _ unload = y # config _ blk _ DEV _ bsg未设置...我们将配置表导出到内核的主目录。配置。

4.将defconfig配置表修改为适用于该板的文件。

2.将交叉编译器修改回内核主目录,并修改Makefile。

修改以下两行:

拱门?= $(SUBARCH) #设置架构系统,比如设置arm直接;也可以在make中修改CROSS_COMPILE?= $(config _ cross _ compile:" % " = %)#设置交叉编译器的修改结果如下:

拱门?= arm交叉_编译?=/opt/friendly arm/tools chain/4 . 5 . 1/bin/arm -Linux -3。架构结构的选择将待移植平台的参考配置文件复制到主目录下:

cs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8 $ CP arch/arm/configs/s5pv 210 _ def config。configcs @ cspc:/mnt/d/Linux/Linux -3 . 0 . 8 $ ls -a。..。配置。gitignore。mailmap copy CREDITS Documentation Kbuild Kconfig MAINTAINERS Makefile README reporting -B ugs arch block cryptodrivers固件fs包括init IPC kernel lib mm net samples脚本安全声音工具usrvirt 4。修改配置文件。您可以使用make menuconfig来修改。这比修改。文本格式的配置文件。

关系:make menuconfig-解析Kconfig-->后修改。config-act on-—> Makefile并且makemenuconfig中有很多字符串,这些字符串来自解析的Kconfig文件。

内核编译将芯片厂商提供的配置表的文件名改为。查看makefile中的交叉编译器是否设置正确。config 4.make编译文件内核编译(make)后,会生成两个文件,一个Image,一个zImage。

Image是内核镜像文件,而zImage是内核的镜像压缩文件。图像约为4M,而齐马格小于2M。

什么是uImage?

它是uboot的特殊图像文件。它在zImage前加了一个64字节的“头”来说明这个内核的版本、加载位置、生成时间、大小等信息。0x40之后,就和zImage没什么区别了。

生成uImage文件:

1.首先在uboot的/tools目录下寻找mkimage文件,并复制到system /usr/local/bin目录下,这样就完成了制作工具。2.在内核目录下运行make uImage,成功的话可以在arch/arm/boot/目录下找到uImage文件,比zImage大64字节。

有了uImage头的描述,u-boot就知道镜像对应的信息了。如果没有头文件,您需要自己手动设置这些参数。

vmlinum --> Image --> zImage --> ui Image:

编译结果:几个linux内核文件的区别1。vmlinux:原始elf内核文件编译后不压缩,文件无法烧录到flash中。

2.图片:VMLinux在OBJCOPY之后会产生的文件比较大,但是已经可以烧到flash了。

2.zImage :Image是gzip压缩的文件。

3.Bzimage: BZ代表“大zimage”,没有被bzip2压缩。两者的区别在于,zImage把内核解压到低端内存(前640K),bzImage把内核解压到高端内存(1M以上)。如果内核比较小,可以用Zimmage或者bzImage。如果它很大,你应该使用bzImage。

4.UImage:U-boot的专用镜像文件,在zImage前增加一个长度为0x40的标签。以便可以启动内核。

5.VMLinuz:bzImage/zImage文件的副本或指向bzi mage/zi mage的链接。

6.initrd,是“初始ramdisk”的缩写。它通常用于将硬件临时引导到实际内核vmlinuz可以接管并继续引导的状态。

一般生成vmlinux,然后把内核压缩到zImage,压缩目录是kernel/arch/arm/boot。

下载到flash的是压缩后的zImage文件,由压缩后的vmlinux和解压器组成。

开发板U-Boot启动linux内核看2440的数据表,发现内存映射的基址是0x3000 0000,那么0x30008000是怎么来的呢?

在内核/文档/arm/引导文件中,有:

调用内核映像

现有引导加载程序:强制新引导加载程序:强制调用内核zImage有两个选项。如果zImage存储在闪存中,并且正确链接以从闪存中运行,那么引导加载程序直接调用闪存中的zImage是合法的。zImage也可以放在系统RAM中(任何位置)并在那里被调用。注意,内核在映像下面使用16K的RAM来存储页表。推荐的位置是32千字节内存。

好像是用32K(0x8000)空间来存放映像下的内核页表,0x30008000是RAM中2440的内核的启动地址,这个地址就是这么来的。

引导内核:

1.将uImage.bin下载到SDRAM的0x30008000。tftp是一种类似ftp的下载软件。在uboot shell下,输入:

tftp 0x30008000 uImage

2.从0x30008000启动内核。

bootm 0x30008000

内核Kconfig语法如何使用1.make menuconfig查找Kconfig?当在make menuconfig界面中选择了一个配置项(*表示选中)时,将显示。config配置列表也将更改为“Y”(相应的文件将被编译到内核中)。

make menu config --> kconfig-> makefilexxx . c的流程是如何组织的?

在make menuconfig中找到串口驱动的宏CONFIG_SERIAL_SAMSUNG配置项:

宏CONFIG_SERIAL_SAMSUNG在对应的Kconfig中应该有这样的语法:CONFIG SERIAL _ SAMSUNG # make menuconfig运行时,CONFIG_SERIAL_SAMSUNG配置项会在中自动生成。配置。

3.找到关键字Samsung SoC serial support以获取Kconfig文件:

4.检查Kconfig文件以获取与CONFIG_SERIAL_SAMSUNG对应的“config SERIAL_SAMSUNG”语法:

5.查看Kconfig同目录下Makefile中的“CONFIG_SERIAL_SAMSUNG”配置项:

samsung.c文件编译于此。

2.安怎么样。o由2编译的文件。在Kconfig中配置的Makefile?即:makefile.o-> kconfig,可以反向搜索。

向内核添加驱动程序概念与裸机驱动程序相比,内核驱动程序需要大量冗余信息:

裸机硬件变了,驱动也会变;内核驱动将不需要因为硬件的改变而改变,因为它涉及到一个复杂的驱动框架。

如果有一个驱动程序myleddev.c和一个应用程序myledtest.c

添加步骤1。把我们开发的驱动myleddev.c放到一个可以自我描述的目录下,比如/drive/char/myled目录。2.在myled目录下添加并编辑Makefile文件。将myleddev.c与Makefile关联:obj -$(CONFIG_ myled test)+= myled dev . o//必须以“CONFIG _”为前缀。如果$(CONFIG_MYLEDTEST)为y,即“obj-y”,则指示编译器将myleddev.c编译到myled中的内核目录中。

Obj-y += myled/ # kernel将以myled目录作为下一个目标进入或者obj -$(CONFIG_MYLEDTEST)+= myled/#需要将CONFIG _ myled test配置项设置为“y”3 .使用make menuconfig 1。在myled目录下添加和编辑Kconfig文件:

菜单“我的充电设备”配置myled测试Bool“支持My led设备驱动程序”帮助支持S5 PV 210的Led设备驱动程序结束菜单2。父目录的Kconfig文件包含子目录My LED的Kconfig文件:

source " drivers/char/myled/kconfig " 3。使用make menuconfig在。配置配置列表为y:

编译使用make uImage将驱动程序编译到内核中,而。目录中对应驱动程序的o文件表示驱动程序成功编译到内核中:

执行应用程序。1.将编译好的内核下载到开发板。2.确定内核是否运行了指示灯驱动程序。$ cat /proc/devices # devices文件记录了内核支持的设备信息。

3.创建一个设备节点# mknode /dev/led1 c 253 1 #,其中led驱动程序与应用程序直接相连。创建一个名为/dev/led1的设备节点。

4.测试1。要在开发板上运行应用程序,您可以首先将PC的目录挂载到开发板的/mnt:

1.PC启动ntf服务,netstat -tua | grep nfs:检查ntf服务是否启动。2.exportfs查看PC当前NFS共享的文件系统列表。3.挂载开发板/mnt下的共享目录(注意要设置开发板的IP地址):mount -t NFS -o no lock 192 . 168 . 10 . 10:/work。

2.将应用程序复制到共享目录。

3.在3.PC上交叉编译应用程序。

arm -Linux -gcc -o led test myled test . c

4.在开发板上执行应用程序

。/ledtest

图1 .向内核添加驱动程序的过程:

参考https://www.youtube.com/watch? v = qnelmpck 7 xe & list = plljkxpjnpgdy 8 fnihhqg 0 erudldocqxh & index = 12

未经允许不得转载:主机频道 » linux内核移植介绍(Linux内核安装教程)

评论 抢沙发

评论前必须登录!