热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

s5p6818/fs4418系统移植实验十一Linux内核的配置和编译

实验十一Linux内核的配置和编译【实验目的】掌握Linux内核的配置和编译的方法。说明:在实验中命令行提示符为“$”表示在主机上运行,“#”表示在目标

实验十一 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中 : 对应的驱动采用模块化的方式进行编译模块化的编译方式&#xff1a;***.c -编译生成->***.ko当需要使用驱动时可以使用insmod命令将***.ko文件加载到内核中。当不需要使用驱动时可以使用rmmod命令将***.ko文件从内核中卸载掉。1》 拷贝fs6818_led.c和fs6818_led.h文件到内核的drivers/char目录下2》 添加菜单选项修改drivers/char目录下的Kconfig文件&#xff0c;添加以下信息&#xff1a;4 menu "HQYJ FS6818 LED"5 config LED_DRIVER6 tristate "FS6818 led"7 default y 8 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;m] │ Type : boolean │ Prompt: FS6818 led │ Defined at drivers/char/Kconfig:5 │ Location: │ -> Device Drivers │ -> HQYJ FS6818 LED 修改&#xff1a;-> Device Drivers -> HQYJ FS6818 LED FS6818 led // <*>修改为5》 编译内核生成uImage的内核镜像 (去除led灯的驱动)$ make -j4 uImage去掉自己上午添加的led灯驱动&#xff0c;将tftpboot目录下的uImage文件进行替换$ cp arch/arm/boot/uImage ~/tftpboot6》 使用模块化的方式编译led灯的驱动 $ make modules 模块化的方式编译驱动&#xff0c;所有的模块化的驱动都被编译成.ko文件编译结果打印以下信息&#xff0c;表示模块化编译成功&#xff1a;CC drivers/char/fs6818_led.mod.oLD [M] drivers/char/fs6818_led.ko6》 测试led灯驱动是都可用led灯驱动已经编译到uImage内核镜像中 1> 拷贝driver/char目录下的fs6818_led.ko文件到根文件系统目录下$ cp drivers/char/fs6818_led.ko ~/nfs/rootfs2> 启动开发板 &#xff08;开发阶段系统的启动方式&#xff09;使用tftp下载uImage到内存中使用nfs服务挂载根文件系统检查自己uboot中的bootcmd和bootargs环境变量。3> 编译led灯的应用程序&#xff0c;并将可执行文件拷贝到根文件系统中。$ arm-none-linux-gnueabi-gcc fs6818led_test.c -o led_test$ cp led_test ~/nfs/rootfs4> 使用insmod命令加载fs6818_led.ko的驱动文件到内核中# insmod fs6818_led.ko // 系统启动成功&#xff0c;在串口工具中执行命令# ./led_test# lsmod 查看已经加载的驱动# rmmod fs6818_led // 只需要指定驱动的名称(1)出现以下错误信息&#xff1a;rmmod: can&#39;t change directory to &#39;/lib/modules&#39;: No such file or directory解决办法&#xff1a;在根文件系统的lib目录下创建modules文件夹即可。(2)出现以下错误信息&#xff1a;rmmod: can&#39;t change directory to &#39;3.4.39-farsight&#39;: No such file or directory解决办法&#xff1a;在根文件系统的lib/modules目录下创建3.4.39-farsight文件夹即可。

 


推荐阅读
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • 本文探讨了在Lumen框架中实现自定义表单验证功能的方法与挑战。Lumen的表单验证机制默认返回无状态的JSON格式API响应,这给初学者带来了一定的难度。通过深入研究Validate类,作者分享了如何有效配置和使用自定义验证规则,以提升表单数据的准确性和安全性。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • Liferay Portal 中 AutoEscape 构造函数的应用与实例代码解析 ... [详细]
  • 在使用sbt构建项目时,遇到了“对象apache不是org软件包的成员”的错误。本文详细分析了该问题的原因,并提供了有效的解决方案,包括检查依赖配置、清理缓存和更新sbt插件等步骤,帮助开发者快速解决问题。 ... [详细]
author-avatar
QingGang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有