摘要:表示,不是用压缩的。两者的不同之处在于,解压缩内核到低端内存第一个,解压缩内核到高端内存以上。如果内核比较小,那么采用或都行,如果比较大应该用。使得内核可以启动文件的拷贝或指向的链接。
linux内核特性:
1.可移植性,支持的硬件平台广泛
2.超强的网络功能
3.多任务多用户系统
4.模块化的设计
五大子系统:
1.进程管理子系统
2.内存管理子系统
3.文件系统子系统
4.网络协议子系统
5.设备管理子系统
获取linux内核:
1.内核官方发布点
2.芯片厂商提供
由主目录 Makefile 和 子目录 Makefile 共同指定内核的编译规则
2.通过 make menuconfig 及 Kconfig 修改内核的配置单,从而自动完成内核配置
选择哪些文件被编译进内核
Makefile文件位置: linux-3.0.8/Makefile
以下为Makefile文件中的部分代码,根据arch平台,配置包含子目录的头文件目录和子目录的Makefile
根据SUBARCH配置 SRCARCH,SUBARCH默认 X86
export KBUILD_BUILDHOST := $(SUBARCH)ARCH ?= $(SUBARCH)CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) // 交叉编译器设置# Architecture as present in compile.hUTS_MACHINE := $(ARCH)SRCARCH := $(ARCH)# Additional ARCH settings for x86ifeq ($(ARCH),i386) SRCARCH := x86endififeq ($(ARCH),x86_64) SRCARCH := x86endif
包含子目录的头文件目录 arch/arm/include:
-I$(srctree)/arch/$(hdr-arch)/include
包含子目录 arch/arm/Makefile 文件:
include $(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH = arm
hdr-arch arm
obj-y : 编译进内核
obj- : 不编译进去
obj-m : 以模块形式编译
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-at91 mach-dove mach-gemini mach-iop32x mach-kirkwood mach-mmp mach-netx mach-orion5x mach-s3c2400 mach-s3c2443 mach-s5pv210 mach-spear6xx mach-versatile nwfpe plat-omap plat-samsung vfpKconfig-nommu configs mach-bcmring mach-ebsa110 mach-h720x mach-iop33x mach-ks8695 mach-msm mach-nomadik mach-pnx4008 mach-s3c2410 mach-s3c24a0 mach-sa1100 mach-tcc8k mach-vexpress oprofile plat-orion plat-spearKconfig.debug include mach-clps711x mach-ep93xx mach-imx mach-ixp2000 mach-l7200 mach-mv78xx0 mach-nuc93x mach-pxa mach-s3c2412 mach-s3c64xx mach-shark mach-tegra mach-vt8500 plat-iop plat-pxa plat-tccMakefile kernel mach-cns3xxx mach-exynos4 mach-integrator mach-ixp23xx mach-loki mach-mx5 mach-omap1 mach-realview mach-s3c2416 mach-s5p64x0 mach-shmobile mach-u300 mach-w90x900 plat-mxc plat-s3c24xx plat-versatileboot lib mach-davinci mach-footbridge mach-iop13xx mach-ixp4xx mach-lpc32xx mach-mxs mach-omap2 mach-rpc mach-s3c2440 mach-s5pc100 mach-spear3xx mach-ux500 mm plat-nomadik plat-s5p toolscs@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 # 配置单所在目录 configsacs5k_defconfig at91sam9260ek_defconfig cerfcube_defconfig cpu9g20_defconfig exynos4_defconfig h7202_defconfig ixp4xx_defconfig magician_defconfig mx3_defconfig nuc960_defconfig pxa168_defconfig s3c2410_defconfig spear3xx_defconfig usb-a9260_defconfigacs5k_tiny_defconfig at91sam9261_defconfig cm_x2xx_defconfig da8xx_omapl_defconfig ezx_defconfig hackkit_defconfig jornada720_defconfig mainstone_defconfig mx51_defconfig omap1_defconfig pxa255-idp_defconfig s3c6400_defconfig spear6xx_defconfig versatile_defconfigafeb9260_defconfig at91sam9263_defconfig cm_x300_defconfig davinci_all_defconfig footbridge_defconfig imote2_defconfig kirkwood_defconfig mini2440_defconfig mxs_defconfig omap2plus_defconfig pxa3xx_defconfig s5p64x0_defconfig spitz_defconfig vexpress_defconfigag5evm_defconfig at91sam9g20ek_defconfig cns3420vb_defconfig dove_defconfig fortunet_defconfig integrator_defconfig ks8695_defconfig mmp2_defconfig neponset_defconfig orion5x_defconfig pxa910_defconfig s5pc100_defconfig stamp9g20_defconfig viper_defconfigam200epdkit_defconfig at91sam9rlek_defconfig colibri_pxa270_defconfig ebsa110_defconfig g3evm_defconfig iop13xx_defconfig lart_defconfig msm_defconfig netwinder_defconfig palmz72_defconfig qil-a9260_defconfig s5pv210_defconfig tct_hammer_defconfig xcep_defconfigap4evb_defconfig at91x40_defconfig colibri_pxa300_defconfig edb7211_defconfig g4evm_defconfig iop32x_defconfig loki_defconfig mv78xx0_defconfig netx_defconfig pcm027_defconfig raumfeld_defconfig sam9_l9260_defconfig tegra_defconfig zeus_defconfigassabet_defconfig badge4_defconfig collie_defconfig em_x270_defconfig h3600_defconfig iop33x_defconfig lpd270_defconfig mx1_defconfig nhk8815_defconfig pcontrol_g20_defconfig realview-smp_defconfig shannon_defconfig trizeps4_defconfigat91cap9adk_defconfig bcmring_defconfig corgi_defconfig ep93xx_defconfig h5000_defconfig ixp2000_defconfig lubbock_defconfig mx21_defconfig nuc910_defconfig pleb_defconfig realview_defconfig shark_defconfig u300_defconfigat91rm9200_defconfig cam60_defconfig cpu9260_defconfig eseries_pxa_defconfig h7201_defconfig ixp23xx_defconfig mackerel_defconfig mx27_defconfig nuc950_defconfig pnx4008_defconfig rpc_defconfig simpad_defconfig u8500_defconfig
配置单文件的后缀 “_defconfig” 表示默认配置,且每个配置单对应 arm 架构下的目录,如 “ixp2000_defconfig” 对应
“mach-ixp2000”
配置单内容如下(为y则代表其对应的文件会被编译进内核):
cs@cspc:/mnt/d/linux/linux-3.0.8/arch/arm/configs$ cat s5pv210_defconfigCONFIG_EXPERIMENTAL=yCONFIG_SYSFS_DEPRECATED_V2=yCONFIG_BLK_DEV_INITRD=yCONFIG_KALLSYMS_ALL=yCONFIG_MODULES=yCONFIG_MODULE_UNLOAD=y# CONFIG_BLK_DEV_BSG is not set...
我们将将配置单导出到内核的主目录下 .config
4、修改defconfig 配置单变成适应于板子的文件
回到内核的主目录,修改Makefile
修改以下两行:
ARCH ?= $(SUBARCH) # 设置架构体系, 如直接设 arm;也可以在make中修改CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) # 设置交叉编译器
修改后的结果如:
ARCH ?= arm CROSS_COMPILE ?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
将要移植的平台的参考配置单文件拷贝到主目录下:
cs@cspc:/mnt/d/linux/linux-3.0.8$ cp arch/arm/configs/s5pv210_defconfig .configcs@cspc:/mnt/d/linux/linux-3.0.8$ ls -a. .. .config .gitignore .mailmap COPYING CREDITS Documentation Kbuild Kconfig MAINTAINERS Makefile README REPORTING-BUGS arch block crypto drivers firmware fs include init ipc kernel lib mm net samples scripts security sound tools usr virt
可以使用 make menuconfig 以桌面窗口形式对.config 文件进行修改, 这比以文本方式修改.config更方便
关系: make menuconfig —解析Kconfig后修改—> .config —作用于—> Makefile
而且 make menuconfig中出现大量字符串,其来自解析的 Kconfig 文件
4.make编译文件
内核编译(make)之后会生成两个文件,一个Image,一个zImage,
其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M
uImage又是什么的?
它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。
生成uImage文件:
1.首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制作工具
2.在内核目录下运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比zImage多64个字节
有了uImage头部的描述, u-boot就知道对应Image的信息, 如果没有头部则需要自己手动去设置那些参数
vmlinum --> Image --> zImage --> uImage:
1、vmlinux :编译出来后未压缩最原始的elf内核文件,该文件不能烧写到flash中
2、Image: vmlinux 经过 OBJCOPY 之后会产生的文件,比较大,但已经可以具备烧写到flash
2、zImage :Image经过gzip压缩后的文件。
3、bzImage:bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
4、uImage : U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的TAG。使得内核可以启动
5、vmlinuz: bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
6、initrd ,: “initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态
一般情况下都在生成vmlinux后,再对内核进行压缩成为zImage,压缩的目录是kernel/arch/arm/boot。
下载到 flash 中的是压缩后的zImage文件,zImage是由压缩后的vmlinux和解压缩程序组成的。
查看 2440 的 datasheet , 发现内存映射的基址是 0x3000 0000 , 那么0x30008000 又是如何来的呢?
在内核文档kernel/Document/arm/Booting 文件中有:
Calling the kernel image
Existingboot loaders: MANDATORY New boot loaders: MANDATORY There are two options for calling the kernel zImage. If the zImage is stored inflash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flashdirectly. The zImage may also be placed in system RAM (at any location) and called there.Note that the kernel uses 16K of RAM below the image to store page tables. The recommended placement is 32KiBinto RAM.
看来在image下面用了32K(0x8000)的空间存放内核页表,0x30008000 就是 2440 的内核在 RAM 中的启动地址,这个地址就是这么来的
启动内核:
1、下载uImage.bin到SDRAM的0x30008000处,tftp是一个类似于ftp的下载软件,在uboot的shell下,输入:
tftp 0x30008000 uImage
2、启动内核,从0x30008000
bootm 0x30008000
make menuconfig界面选中(*代表选中)配置项时,.config配置单中的配置项也会更改为 “y”(对应的文件会被编译进内核)
make menuconfig --> Kconfig —> Makefile xxx.c 的过程 是如何组织的?
config SERIAL_SAMSUNG # make menuconfig运行时会在 .config 中自动生成 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 文件编译进来了
即: Makefile .o —> Kconfig, 则可以倒着查找
相比于裸机的驱动,内核驱动需要很多冗余的信息:
裸机的硬件发生改变则驱动也会改变; 而内核驱动则不会因为硬件改变而需要改变,因为其涉及一个复杂的驱动框架
如有驱动程序 myleddev.c 和应用程序 myledtest.c
obj-$(CONFIG_MYLEDTEST) += myleddev.o // 前缀必须为 "CONFIG_",如果$(CONFIG_MYLEDTEST)为y,即"obj-y"则指示编译器将myleddev.c被编译进内核
在myled目录的上级目录的Makefile中添加:
obj-y += myled/ # 内核会以myled目录作为下一个目标进入或者obj-$(CONFIG_MYLEDTEST) += myled/ # 需要将 CONFIG_MYLEDTEST 配置项设置为 "y"
1.在myled目录下增加并编辑 Kconfig 文件:
menu "my char device"config MYLEDTEST bool "Support myled device driver" help Support led device driver for S5PV210endmenu
2.在上级目录的 Kconfig 文件中包含子目录 myled 的 Kconfig文件:
source "drivers/char/myled/Kconfig"
3.使用make menuconfig将.config配置单中的 CONFIG_MYLEDTEST 配置为 y:
使用 make uImage 将驱动编译进内核,目录下驱动对应的 .o 文件则代表驱动成功编译进内核:
$ cat /proc/devices # devices文件记录了内核支持的设备信息
# mknode /dev/led1 c 253 1 # 创建设备节点,名为 /dev/led1
1.需要将应用程序放在开发板上运行,可以先将PC的目录挂载到开发板的 /mnt 下:
1.PC开启 ntf服务, netstat -tua | grep nfs: 检查ntf服务是否开启
2.exportfs 查看PC当前 NFS 共享的文件系统列表
3.将共享目录挂载到开发板的 /mnt 下(注意开发板要设置IP地址): mount -t nfs -o nolock 192.168.10.10:/work/ /mnt
2.将应用程序复制到共享目录下
3.PC上对应用程序进行交叉编译
arm-linux-gcc -o ledtest myledtest.c
4.开发板上执行应用程序
./ledtest
添加驱动到内核的过程:
https://www.youtube.com/watch?v=qNeLmPCK7xE&list=PLljKjXpjNpgdY8fNIhHQG0ErUDldOCQxh&index=12
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124034.html
摘要:核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树网络用户与挂载文件系统,而核心的提供资源隔离,包括存储器与网络。因此更为轻量快速和易于管理。 docker 如日中天,这不是单纯的炒概念,docker 确确实实解决了开发与运维的痛点,因此在企业开发中得到了非常广泛的使用,本文对于 docker 的这些基本知识点再做一些简单回顾。 什么是 docker 根据 wikip...
摘要:的安装支持和系统,置于安装过程大家可以去查看官方的文档,也可以搜索别的教程,需要一点基础。注意我们是安装的,是用于商业模式的。 Dokcer介绍: Docker是一种容器相关的技术,简单来说你可以把它当做一个微型的独立系统,在这个系统里面运行各种软件,然后又在linux服务器上或者是电脑上运行这个系统,这个系统就被称为Docker容器,而运行Docker容器的机器就被称为宿主机。Doc...
摘要:初识是什么是一个开源的应用容器引擎,基于语言并遵从协议开源。容器是完全使用沙箱机制,相互之间不会有任何接口更重要的是容器性能开销极低。命令为,如下由此可知,我们新打包的镜像的为。登录账号再输入自己的账号密码即可。 初识Docker Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的...
摘要:如无论哪个服务器,下载的文件内容是一样的。如果需要启动,通过命令执行完后,再打开文件,可以看到的了。 docker的官网:https://www.docker.com/官方文档:https://docs.docker.com/github: https://github.com/docker/lab... Docker类似虚拟机,是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、...
阅读 1401·2021-11-22 09:34
阅读 1377·2021-09-22 14:57
阅读 3399·2021-09-10 10:50
阅读 1369·2019-08-30 15:54
阅读 3688·2019-08-29 17:02
阅读 3471·2019-08-29 12:54
阅读 2608·2019-08-27 10:57
阅读 3315·2019-08-26 12:24