实验十一 Linux内核的配置和编译【实验目的】掌握Linux内核的配置和编译的方法。说明:在实验中命令行提示符为“$”表示在主机上运行,“#”表示在目标板上运行。【实验环境】Ubuntu 16.04 64位发行版FS6818平台【实验步骤】将“系统移植\案例源码\第二天\kernel-3.4.39.tar.bz2”拷贝到Ubuntu主机。使用下面的命令对源码进行解压。$ tar -xvf kernel-3.4.39.tar.bz2进入到解压的目录,清除配置。$ cd kernel-3.4.39/$ make ARCH=arm mrproper或$ make ARCH=arm distclean使用下面的命令可以对内核进行fs6818的默认配置。make ARCH=arm fs6818_defconfig也可以直接拷贝默认的配置文件,但在编译前必须要进行一次make menuconfig。$ cp arch/arm/configs/fs6818_defconfig .config使用下面的命令,对内核进行配置。$ make ARCH=arm menuconfig指定交叉编译工具链的前缀General setup --->(arm-none-linux-gnueabi-) Cross-compiler tool prefix编译内核的uImage镜像。$ make ARCH=arm uImage或$ make ARCH=arm uImage -j2或$ make ARCH=arm uImage -j2 > /dev/null其中j后面的数字通常是CPU个数的两倍。如果不想每次都在命令行中输入ARCH=arm,则可以通过修改顶层的Makefile文件来实现。将:ARCH ?= $(SUBARCH)改为:ARCH ?= arm拷贝内核到Fastboot目录准备进行烧写,烧写办法参考实验七。
or
linux内核的配置和编译1》配置交叉编译工具链顶层目录的Makefile中进行配置CROSS_COMPILE2》第一次编译内核是清除中间文件make clean make distclean3》配置内核支持fs6818硬件平台make fs6818_defconfig4》通过图形化界面对内核进行配置make menuconfig 5》编译内核生成uImage镜像make uImage
#################################################
【1】make menuconfig执行过程详解
1. 搜索menuconfig,没有搜索到;搜索%config,搜索到一下信息491 %config: scripts_basic outputmakefile FORCE 492 $(Q)mkdir -p include/linux include/config493 $(Q)$(MAKE) $(build)=scripts/kconfig $@解析:Q = @mkdir -p include/linux include/configmake -f scripts/Makefile.build obj=scripts/kconfig menuconfig进入scripts/kconfig目录下执行make menuconfig
2. 打开scripts/kconfig目录下的Makefile文件搜索menuconfig&#xff0c;得到以下信息20 menuconfig: $(obj)/mconf 21 $<$(Kconfig)解析&#xff1a;scripts/kconfig/mconf Kconfig使用file命令查看scripts/kconfig目录下mconf文件的类型file scripts/kconfig/mconf可知mconf文件是一个elf可执行文件mconf根据内核源码顶层目录的Kconfig文件生成图形化界面的菜单选项配置界面。3. 打开内核源码顶层目录的Kconfig文件5 mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"6 7 config SRCARCH8 string9 option env&#61;"SRCARCH"10 11 source "arch/$SRCARCH/Kconfig" 解析&#xff1a; mainmenu &#xff1a; 主菜单语法格式&#xff1a;mainmenu "主菜单名字"source&#xff1a;包含下一级子菜单对应的Kconfig文件路径语法格式&#xff1a; source "下一级子菜单的Kconfig路径"打开arch/arm/目录下的Kconfig文件。Kconfig文件作用&#xff1f;Kconfig用于存放菜单选项的配置信息。254 menu "System Type" 255 256 config MMU257 bool "MMU-based Paged Memory Management Support"258 default y259 help260 Select if you want MMU-based virtualised addressing space261 support by paged memory management. If unsure, say &#39;Y&#39;.......endmenu解析&#xff1a; /***********************menu&#xff1a; 子菜单选项endmenu&#xff1a; 子菜单结尾语法格式&#xff1a; menu "子菜单的名字"....endmenu ***********************//**********************bool&#xff1a; 菜单选项语法格式&#xff1a; bool "菜单选项的名字"bool类型的菜单选项只有两种状态[*] &#xff1a;被选中状态 对应的驱动被编译到uImage内核镜像中[ ] &#xff1a;未被选中状态 对应的驱动不被编译到uImage内核镜像中***********************//**********************default : 对应菜单选项的默认状态default y &#xff1a;默认被选中的状态***********************//**********************help &#xff1a; 帮助信息***********************//**********************如果config MMU下边对应的菜单选项是[*]被选中的状态&#xff0c;config MMU会被写到.config配置文件中在.config文件中的格式为 CONFIG_MMU &#61; y,如果config MMU下边对应的菜单选项是[ ]未被选中的状态&#xff0c;config MMU会被写到.config配置文件中在.config文件中的格式为 # CONFIG_MMU is not set***********************/.config文件的作用&#xff1f;答&#xff1a;Makefile文件根据.config文件中的配置信息来决定哪些代码被编译到内核uImage镜像中&#xff0c;那些代码不被编译到内核uImage镜像中。如果CONFIG_****&#61;y表示对应的驱动被编译到内核中。打开arch/arm/目录下的Makefile文件:32 ifeq ($(CONFIG_MMU),)33 MMUEXT :&#61; -nommu34 endif如果CONFIG_MMU&#61;y使用内存管理单元如果# CONFIG_MMU is not set 不使用内存管理单元【2】使用图形化界面的方式添加自己的驱动代码到内核中
1. 去除华清远见研发中心提供的led灯驱动Device Drivers ---> Character devices --->[ ] FS6818 beep driver // 去掉FS6818 board device driver support ---> [ ] adc driver for farsight FS6818 all platform // 去掉[ ] pwm timer driver for farsight FS6818 // 去掉FS6818 extension device driver support ---> [ ] This is FS6818_LED! // 去掉[ ] zlg7290 driver support input device // 去掉保存退出2. 添加自己led灯驱动对应的菜单选项1》 拷贝fs6818_led.c和fs6818_led.h文件到内核的drivers/char目录下2》 添加菜单选项修改drivers/char目录下的Kconfig文件&#xff0c;添加以下信息&#xff1a;4 menu "HQYJ FS6818 LED"5 config LED_DRIVER6 bool "FS6818 led"7 default y8 help9 hqyj fs6818 led drivers!10 endmenu 3》 修改drivers/char目录下的Makefile文件&#xff0c;添加以下信息&#xff1a; 5 obj-$(CONFIG_LED_DRIVER) &#43;&#61; fs6818_led.o4》 通过图形化界面对led灯驱动进行配置> for Search使用搜索的功能搜索CONFIG后边的内容搜索LED_DRIVER│ Symbol: LED_DRIVER [&#61;y] │ Type : boolean │ Prompt: FS6818 led │ Defined at drivers/char/Kconfig:5 │ Location: │ -> Device Drivers │ -> HQYJ FS6818 LED 5》 编译内核生成uImage的内核镜像 make -j4 uImage6》 测试led灯驱动是都可用led灯驱动已经编译到uImage内核镜像中 1> 拷贝新生成的uImage镜像到tftpboot目录下 cp arch/arm/boot/uImage ~/tftpboot2> 启动开发板 &#xff08;开发阶段系统的启动方式&#xff09;使用tftp下载uImage到内存中使用nfs服务挂载根文件系统检查自己uboot中的bootcmd和bootargs环境变量。3> 编译led灯的应用程序&#xff0c;并将可执行文件拷贝到根文件系统中。arm-none-linux-gnueabi-gcc fs6818led_test.c -o led_testcp led_test ~/nfs/rootfs4> 运行led灯的应用程序&#xff0c;观察led灯的现象 ./led_test 【3】驱动采用模块化的方式进行编译bool : [][*] : 对应的驱动被编译到uImage中 [ ] : 对应的驱动不被编译到uImage中 tristate &#xff1a; <><*> : 对应的驱动被编译到uImage中 <> : 对应的驱动不被编译到uImage中