Linux系统的Makefile和Kconfig及模块简介
Linux设备驱动程序原理及框架-内核模块入门篇
Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。
为此,的内核一般不能动态的增加新的功能。
为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。
利用这个机制“模块”(module)。
利用这个机制,可以)。
利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。
正是这种机制,走已经安装的模块。
正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。
和可扩充性。
内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。
严格来说,卸载的内核软件。
严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。
但是,另一方面,可安装模块的形式实现的。
但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。
密切相关的部分(如文件系统等)。
课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。
且创建好该系统中的硬件设备的列表树:/sys 文件系统。
(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。
)。
教你如何学习linux内核
教你如何学习linux内核毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。
基本上,Linux 内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。
对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不过分。
我们去香港,通过海关的时候,总会有免费的地图和各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的街道上。
即使在内地出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要去买了,拿是拿不到的,不同的地方有不同的特色,只不过有的特色是服务,有的特色是索取。
Kconfig和Makefile就是Linux Kernel迷宫里的地图。
地图引导我们去认识一个城市,而Kconfig 和Makefile则可以让我们了解一个Kernel目录下面的结构。
我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。
利用Kconfig和Makefile寻找目标代码就像利用地图寻找目的地一样,我们需要利用Kconfig和Makefile来寻找所要研究的目标代码。
比如我们打算研究U盘驱动的实现,因为U盘是一种storage设备,所以我们应该先进入到drivers/usb/storage/目录。
但是该目录下的文件很多,那么究竟哪些文件才是我们需要关注的?这时就有必要先去阅读Kconfig和Makefile文件。
对于Kconfig文件,我们可以看到下面的选项。
config USB_STORAGE_DATAFABbool "Datafab Compact Flash Reader support (EXPERIMENTAL)"depends on USB_STORAGE && EXPERIMENTALhelpSupport for certain Datafab CompactFlash readers.Datafab has a web page at </>.显然,这个选项和我们的目的没有关系。
linux make的命令行参数
linux make的命令行参数Linux make是一个非常重要的工具,用来自动构建项目和生成软件。
make命令行参数可以用来指定构建目标、编译器选项、目标平台等参数。
以下是常见的Linux make命令行参数:1. -f:指定目标文件名。
例如make -f makefile表示使用makefile文件构建项目。
2. -j:指定并行构建的进程数。
例如make -j4表示使用4个进程并行构建。
3. -C:指定目标目录。
例如make -C /usr/src/kernel表示在/usr/src/kernel目录下构建项目。
4. -k:表示忽略错误,继续构建。
例如make -k表示继续构建即使出现错误。
5. -n:表示模拟构建,不实际执行构建。
例如make -n表示打印出构建过程但不实际构建。
6. -B或--always-make:表示强制重新构建。
例如make -B表示强制重新构建所有目标文件。
7. -r或--no-builtin-rules:表示禁用内置规则。
例如make -r表示禁用内置规则,只使用自定义规则。
8. -s或--silent或--quiet:表示禁止输出构建详细信息。
例如make -s表示禁止输出构建详细信息。
9. -v或--version:表示显示make版本信息。
例如make -v表示显示make版本信息。
10. -h或--help:表示显示make命令的帮助信息。
例如make -h表示显示make命令的帮助信息。
以上命令是常见的make命令行参数,可以根据实际需求选择使用。
Linux内核中的Kconfig用法与说明
Linux内核中的Kconfig文件本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读<Documentation/kbuild/kconfig-language.txt>和<Documentation/kbuild/kconfig.txt>。
内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。
通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。
1.1.1 Kconfig基本语法如程序清单0.1所示代码摘自<drivers/char/Kconfig>文件,是一个比较典型的Kconfig文件片段,包含了Kconfig的基本语法。
程序清单0.1drivers/char/Kconfig片段menu "Character devices"source "drivers/tty/Kconfig"config DEVKMEMbool "/dev/kmem virtual device support"default yhelpSay Y here if you want to support the /dev/kmem device. The/dev/kmem device is rarely used, but can be used for certainkind of kernel debugging operations.When in doubt, say "N".……endmenu1.子菜单通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。
Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
printk(KERN_WARNING fmt, ##arg) printk(KERN_DEBUG fmt, ##arg)
/* Module Init & Exit function */ static int __init myModule_init(void) {
/* Module init code */ PRINTK("myModule_init\n"); return 0;
图形
工具
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍 了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成
那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢? 我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下 界面:
首页 业界 移动 云计算 研发 论坛 博客 下载 更多
process的专栏
您还未登录!| 登录 | 注册 | 帮助
个人资料
dianhuiren
访问:71424次 积分:1219分 排名:第8764名 原创:37篇 转载:127篇 译文:0篇 评论:3条
目录视图
摘要视图
订阅
《这些年,我们读过的技术经典图书》主题有奖征文 经理
这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文
/dianhuiren/article/details/6917132
1/5
2012年04月 (6) 2012年03月 (15) 2012年02月 (16)
并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般 的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。
linux 顶层makefile分析
Linux顶层Makefile文件分析分类:Linux 系列2013-05-06 17:05 585人阅读评论(0) 收藏举报1、make menuconfigVERSION = 2PATCHLEVEL = 6SUBLEVEL = 26EXTRAVERSION =NAME = Rotary Wombat# *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file.# Do not:# o use make's built-in rules and variables# (this increases performance and avoids hard-to-debug behaviour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory#-r禁止使用build-in规则#--no-print-directory是:不要再屏幕上打印"Entering directory.."#记住变量SHELL,MAKEFLAGS在整个make的执行过程中#始终被自动的传递给所有的子make# We are using a recursive build, so we need to do a little thinking# to get the ordering right.## Most importantly: sub-Makefiles should only ever modify files in# their own directory. If in some directory we have a dependency on# a file in another dir (which doesn't happen often, but it's often# unavoidable when linking the built-in.o targets which finy# turn into vmlinux), we will call a sub make in that other dir, and# after that we are sure that everything which is in that other dir# is now up to date.## The only cases where we need to modify files which have global# effects are thus separated out and done before the recursive# descending is started. They are now explicitly listed as the# prepare rule.# To put more focus on warnings, be less verbose as default# Use 'make V=1' to see the full commandsifdef V #v=1ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V) #把V的值作为KBUILD_VERBOSE的值 endifendififndef KBUILD_VERBOSE #即默认我们是不回显的#回显即在命令执行前显示要执行的命令KBUILD_VERBOSE = 0endif# 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
Kconfig原理,makefile原理
Makefile文件面对树状结构的内核源码目录,内核编译采用了各个子目录拥有自己目录相关的Makefile(被称为sub-Makefile或kbuild Makefile),内核编译依赖于各个子目录下的子makefile(sub-Makefile)文件,这些sub-Makefile定义了根据该子目录下的源码文件构建目标文件的规则,并且仅对该目录下的文件作适当的修改。
顶层Makefile采用递归的方式调用位于init/, drivers/, sound/, net/, lib/ ,usr/等目录下的各个子目录中的Makefile文件。
在递归调用之前,kbuild首先要确定是否已经满足一些必要的条件,包括在必要时更新include/Linux /version.h文件,并设置符号链接include/asm,使之指向与目标体系结构相关的文件。
例如,如果为PPC编译代码,则include /asm指向include/asm-ppc。
kbuild还要对文件include/Linux/autoconf.h和include/Linux /config进行编译。
之后,从根目录开始进行递归。
各个子Makefile文件比较简单,指出了该如何编译目标文件,例如/mm目录下的Makefile 片段:16 obj-$(CONFIG_PROC_PAGE_MONITOR) += pagewalk.o17 obj-$(CONFIG_BOUNCE) += bounce.o18 obj-$(CONFIG_SW AP) += page_io.o swap_state.o swapfile.o thrash.o19 obj-$(CONFIG_HAS_DMA) += dmapool.o20 obj-$(CONFIG_HUGETLBFS) += hugetlb.oKconfig文件Kconfig的作用就是为了让用户配置内核,在Kconfig中定义了一些变量,用户通过设置变量的值来选择如何个性化自己的系统内核。
linux内核模块及内核编译过程
Linux内核模块及内核编译过程一、引言Linux内核是Linux操作系统的核心组件,负责管理系统的硬件和软件资源。
内核模块是一种动态加载到内核中的代码,用于扩展和添加新的功能。
本文将介绍Linux内核模块的概念、编写方法以及内核编译过程。
二、Linux内核模块内核模块是一种动态加载到内核中的代码,用于扩展和添加新的功能。
它是一种轻量级的解决方案,可以在不重新编译整个内核的情况下添加或删除功能。
内核模块可以使用内核提供的API,以实现与内核其他部分的交互。
编写内核模块需要了解内核的内部结构和API。
通常,内核模块是用C语言编写的,因为C语言与汇编语言有良好的交互性,并且内核本身也是用C语言编写的。
编写内核模块的基本步骤如下:1.编写模块的源代码:使用C语言编写模块的源代码,并确保遵循内核的编码风格和约定。
2.编译模块:使用内核提供的工具和方法将源代码编译成模块。
3.加载和卸载模块:使用insmod命令将模块加载到内核中,使用rmmod命令卸载模块。
三、内核编译过程内核编译是将源代码转换成可在计算机上运行的二进制代码的过程。
Linux内核的编译过程可以分为以下几个步骤:1.配置内核:使用make menuconfig或make xconfig等工具,根据需要选择要包含在内核中的功能和选项。
2.生成Makefile:根据配置结果生成Makefile文件,该文件用于指导make命令如何编译内核。
3.编译内核:使用make命令根据Makefile编译内核。
这个过程包括编译源代码、生成目标文件、链接目标文件等步骤。
4.安装内核:将编译好的内核映像安装到系统中,以便在启动时加载。
5.配置引导加载程序:将引导加载程序配置为加载新编译的内核映像。
四、总结本文介绍了Linux内核模块的概念、编写方法以及内核编译过程。
通过了解这些知识,我们可以更好地理解Linux操作系统的内部原理,并根据需要定制和优化系统的功能。
linux make命令的工作原理
linux make命令的工作原理make命令是一个用于自动化编译和构建程序的工具,它通过读取Makefile 文件中的规则来确定如何构建目标文件。
Makefile文件包含了目标文件和依赖关系的描述,以及构建目标文件的命令。
Make命令的工作原理如下:1.读取Makefile文件:make命令首先会读取当前目录下的Makefile文件,该文件包含了目标文件和依赖关系的描述,以及构建目标文件的命令。
2.解析规则:make命令会解析Makefile文件中的规则,包括目标文件、依赖关系和命令。
3.检查依赖关系:make命令会检查目标文件的依赖关系,并判断是否需要重新构建目标文件。
如果目标文件不存在或者依赖的文件被修改过,则需要重新构建目标文件。
4.构建目标文件:如果需要重新构建目标文件,make命令会执行Makefile文件中对应目标文件的构建命令。
构建命令可以是编译源代码、链接目标文件等操作。
5.更新目标文件:构建完成后,make命令会更新目标文件的时间戳,以反映最新的修改时间。
6.递归构建:如果目标文件的依赖关系中还包含其他目标文件,make命令会递归地执行构建过程,以确保所有的依赖关系都得到满足。
7.完成构建:当所有的目标文件都构建完成后,make命令会输出构建成功的消息,并退出。
Make命令的优势在于它只会构建需要更新的目标文件,而不会重新构建所有的文件。
这样可以提高编译和构建的效率,尤其是在大型项目中。
另外,Make命令还支持并行构建,可以同时构建多个目标文件,进一步提高构建的效率。
总结起来,Make命令的工作原理是通过读取Makefile文件中的规则来确定如何构建目标文件,检查目标文件的依赖关系并判断是否需要重新构建,执行构建命令来生成目标文件,递归构建所有的依赖关系,最后输出构建成功的消息。
Make命令的优势在于只构建需要更新的文件,提高构建效率。
加载模块
第一种方法:1、Makefile 编写#ifneq ($(KERNELRELEASE),)obj-m := hello1.omodule-objs := hello2.o#else#KERNELDIR ?= /lib/modules/$(shell uname -r)/build#找到与你开发板上的内核版本一致的目录,内核版本不一致,容易导致加载不了模块KERNELDIR ?= ~/axp228_7_10/linux/kernel/kernel-3.4.39PWD := $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsrm -rf Module.* modules.*.PHONY: default clean#endif2、make生成.ko文件3、使用adb工具或通过USB把.ko文件复制进开发板4、Insmod xxx.ko 加载模块5、Lsmod 查看模块6、/system/bin/remod xxx 卸载模块注意:重启系统后模块会不见第二种方法:1、在源码(ut_hello.c)相同目录下,Kconfig配置修改为如下,尤其注意类型定义为三态:2、在/home2/trainer_007/ut4418/axp228_7_10/linux/kernel/kernel-3.4.39路径中输入make menuconfig将前面的选项配置为M(编译成模块)保存退出。
3、在相同路径下输入make modules在源码目录中查看市否生成了ut_hello.ko文件4、打开adb工具将ut_hello.ko push到文件系统中,可写入的文件为data、sd、system adb device 查看当前是否有可以push的设备(注意:需要打开USB调试)取得root权限adb pushadb pull(只是演示指令,非必需步骤)5、在串口控制台下输入Lsmod 查看当前加载设备加载模块,注意添加模块所在的路径查看已经加载好的模块卸载模块(带上rmmod的路径)小结:为什么带上rmmod的路径?Busybox 是文件系统,不能创建文件和目录。
c++ linux编译命令
c++ linux编译命令
C++Linux编译命令是指在Linux系统下,使用C++语言进行程序开发时所需的编译命令。
下面是一些常用的C++ Linux编译命令: 1. g++命令:用于编译C++程序。
语法:g++ [options] file1.cpp file2.cpp ... -o output 选项说明:
- -o output:指定输出文件的文件名。
- -c:仅编译源文件,生成目标文件(.o文件)。
- -g:生成调试信息。
- -O:优化编译过程。
- -Wall:显示全部警告。
2. make命令:用于自动化编译。
语法:make [target]
选项说明:
- target:指定要编译的目标(默认为Makefile中的第一个目标)。
3. cmake命令:用于生成Makefile文件。
语法:cmake [options] source_directory
选项说明:
- -G:指定生成的Makefile文件类型。
- -D:设置变量的值。
4. gdb命令:用于调试程序。
语法:gdb [options] [executable-file [core-file or process-id]]
选项说明:
- -tui:启动GDB的文本模式界面。
- -q:禁止显示版权和欢迎信息。
- -x:执行指定的GDB脚本。
以上就是一些常用的C++ Linux编译命令,开发者们可以根据需要使用相应的命令,提高编译效率和程序质量。
linux驱动编程初级+makefile
驱动编程1 模块的概述 (2)2 source insight 加载内核源码方法 (2)3 模块makefile的编写 (3)4 模块makefile编写方法 (4)5 在X86上运行模块: (5)6 编写模块 (5)7 模块的加载进内核命令 (5)8 最简单的上层调用+ 调用驱动方法 (6)9 复杂框架上层应用+驱动调用方法 (7)10 复杂框架字符设备创建并注册过程 (7)11 file_operations常用函数 (9)12 同步互斥操作 (10)13 同步互斥函数总结 (10)14 阻塞IO编程流程 (11)15 轮询操作上层select 下层poll (12)16 信号处理 (12)17 中断 (13)18 中断新模型--上半部中断和下半部中断的实现 (14)19 内核定时器编程 (15)20 内核延时函数 (15)21 内核源代码中头文件分配方式 (15)22 linux内核管理和内核的内存管理 (16)23 设备io端口和io内存访问–如何控制led的亮灭 (16)24 * 驱动-设备分离思想编程————内核进阶 (18)25 驱动-设备分离-核心最小架构 (18)26 驱动设备分离思想- 上层架构(基于封装) (20)27 头文件总结 (24)28 设置系统自启动命令u-boot (24)第一天需要理清的东西1)模块的概念,模块与应用的区别2)模块主要的组成头文件、module_init() modoule_exit() module_lisence()3)模块的如何编辑,如何编译,如何加载到内核中运行使用makefile4)模块驱动编写,必须通过上层应用程序调用。
1模块的概述模块是内核的一部分,为了防止内核太大,把它放在文件系统里面。
也可以在编译内核的直接编译进内核。
1,存储位置可以在开始时编译进内核,也可以编译进模块,最后加载2、运行时环境在哪个内核树下编译,就对应这个运行环境3、模块的编译问题:前提条件是需要对应的内核源码树,或者必须有对应的内核版本匹配4、模块编译使用makefile 注意makefile的编写2source insight 加载内核源码方法在windows下创建工程,使用source insight查看内核代码:2.1 先将内核源码拷到对应的文件夹2.2 在source insight 里添加工程,筛选需要添加的文件注意选择按照树来添加,然后按照remove来踢出不需要的文件夹2.3 最后同步3模块makefile的编写模块的编译:1)、模块编译的核心语句:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules-C :进入内核源码树M= : 返回到当前目录,再次执行该目录下的makefileeg: /tnt/abc.c -----> abc.ko1、在/tnt目录下敲make,只有/tnt目录下的Makefile被调用2、目的是要进入到内核源码树中,一进一回,-C来进,M=带着内核源码树中的makefile的功能回来了-------内核源码树中Makefile的目标:obj-y:汇集了所有编译进内核的目标文件obj-m:汇集了所有编译成模块的目标文件3、回来过后,我们只有确定obj-m变量的集合4、make modules告诉内核的makefile,只做编译模块的功能4模块makefile编写方法ifeq ($(KERNELRELEASE),)KERNELDIR := /work/linux-2.6.35-farsightPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesinstall:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:rm -rf .tmp_versions *.ko *.o .*.cmd *.mod.c *.order *.symvers.PHONY: modules cleanelseobj-m := ex1.oendif以上是makefile的内容,●注意原来的内核目录树不要进行make clean 或者make distclean●KERNELDIR 表示模块加载在哪个内核的文件夹(又叫内核源码树),●$(MAKE) -C $(KERNELDIR) M=$(PWD) modules 表示进入该内核文件夹,将顶层makefile 中的内容带回,再重新执行一次该makefile 将obj-m := ex1.o 编译,并执行make modules (并只编译ex1.c ,不编译其它模块)●$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 表示执行顶层makefile的modules install 标签下的命令●安装的位置原来默认在/lib 下面,所以需要修改其到我们制作的根文件系统下/work/rootfs/在顶层Makefile位置搜索:MODLIB修改为:●obj-m := ex1.o 你需要编译的.c的文件名****************************此时简单的编译环境已经搭建完毕******************* ****************************执行make ***********************************************执行make install *******************在/work/rootfs/lib/modules/2.6.35/extra即可找到该模块.ko*****************************************************************************搭建好环境,保证虚拟机与板子与计算机网络连通,并设置板子u-boot 从nfs挂载,启动内核,并成功通过nfs 加载rootfs,此时环境完毕,进入/work/rootfs/lib/modules/2.6.35/extra ,找到模块,加载卸装模块操纵5在X86上运行模块:修改Makefile中的内核源码树的目录X86下的内核源码树:/lib/modules/2.6.35-22-generic/build如果没有在控制台上交互,默认是看不到信息的,需要dmesg这个命令去查看6编写模块模块最小组成如下:●注意:module_init module_exit 必须放在末尾●注意:函数的原型返回值●头文件7模块的加载进内核命令insmodrmmodlsmod8最简单的上层调用+ 调用驱动方法8.1 首先在module_init(abc) abc函数中注册设备register_chrdev(注册设备号,上层可见的设备名,操作封装)该函数完成设备注册,在板子上用cat /proc/devices 便可以看见该设备8.2 完成fops 操作的封装●注意格式●必须在函数后面声明该结构体●头文件#include <linux/fs.h>8.3 查看到该字符设备后,创建设备节点,则上层通过设备字符名与该设备号绑定mknod /dev/hf_char c 245 0ls /dev/ 可以查看注册的所有设备节点8.4 此时上层应用的open(”hf_char”,O_RDWR),即可完成该设备的打开,即可以完成上层应用于下层驱动相关fops 的操作。
linux makefile include用法
在 Linux 中,Makefile 是一种文本文件,用于定义项目的构建规则和依赖关系。
include是 Makefile 中的一个关键字,用于引入其他 Makefile 文件。
这对于将构建规则拆分为多个文件以提高可维护性非常有用。
以下是关于include在 Linux Makefile 中的用法的详细解释:include的基本语法:•include后面可以跟一个或多个文件名,用空格分隔。
•这些文件名可以包含通配符,例如*.mk。
示例:假设有两个 Makefile 文件,分别是main.mk和extra.mk。
main.mkextra.mk在上述例子中,main.mk包含了extra.mk。
这样,main.mk中的规则就可以使用extra.mk中定义的规则和变量。
使用场景和注意事项:1.模块化项目:–include用于将项目的不同部分拆分为独立的 Makefile,使得项目结构更加清晰和易于维护。
2.变量和规则共享:–通过include,可以在不同的 Makefile 文件中共享变量和规则,避免代码重复。
3.条件包含:–可以根据条件来选择是否包含某个 Makefile,例如基于不同的操作系统或构建类型。
1.文件名通配符:–include后面可以使用通配符,方便引入符合某个模式的多个文件。
注意事项:•文件名可以是相对路径或绝对路径。
•文件名中可以包含变量,这样可以动态地选择引入的文件。
•在引入文件时,Makefile 会在当前目录和系统的默认搜索路径中查找文件。
通过合理使用include,可以更好地组织和管理项目的构建规则,提高 Makefile 的可读性和可维护性。
Linux 2.6内核Makefile浅析
1 概述Makefile由五个部分组成:∙Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件)。
∙.config:内核配置文件(一般由make menuconfig生成)。
∙arch/$(ARCH)/Makefile:目标处理器的Makefile。
∙scripts/Makefile.*:所有kbuild Makefile的规则,它们包含了定义/规则等。
∙kbuild Makefiles:每个子目录都有kbuild Makefile,它们负责生成built-in或模块化目标。
(注意:kbuild Makefile是指使用kbuild结构的Makefile,内核中的大多数Makefile 都是kbuild Makefile。
)2 kbuild文件2.1 obj-y和obj-m最简单的kbuild Makefile可以仅包含:$(EXTRA_LDFLAGS)和$(EXTRA_ARFLAGS)用于每个目录de$(LD)和$(AR)选项。
例如:#arch/m68k/fpsp040/MakefileEXTRA_LDFLAGS := -xCFLAGS_$@, AFLAGS_$@CFLAGS_$@和AFLAGS_$@只使用到当前makefile文件de命令中。
$(CFLAGS_$@)定义了使用$(CC)de每个文件de选项。
$@部分代表该文件。
例如:# drivers/scsi/MakefileCFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONFCFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \-DGDTH_STATISTICS CFLAGS_seagate.o = -DARBITRATE -DPARITY-DSEAGATE_USE_ASM这三行定义了aha152x.o、gdth.o和seagate.o文件de编译选项。
Makefile&&Kconfig
有了gcc 编译器下面我们就可以来编译我们的内核了,内核的下载地址是从这里来下载我们所想要的内核,我们现在用的是linux-2.6.18 内核。
Linux2.6内核新特性Linux内核吸收了一些新技术,在性能、可量测性、支持和可用性方面不断提高。
这些改进多数是添加支持更多的体系结构、处理器、总线、接口和设备;也有一些标准化内部接口,简化扩展添加新设备和子系统的支持。
与Linux2.4版本相比,Linux 2.6 版本具有许多新特性,内核也有很大修改。
其中一些修改只跟内核或者驱动开者有关,另外一些修改则会影响到系统启动系统管理和应用程序开发。
Linux 2.6 内核重要的新特性如下:(1) 新的调度器: O(1)(2) 内核抢占(3) 新的线程模型(4) 文件系统:access controls , ext2/ext3(5) 声音:ALSA(6) 总线:IDE,SCSI(7) 电源管理(8) 网络(9) 用户界面层(10) 统一的设备模型在 Linux 上我们可以用以下命令来下载内核。
[root@binnary ~]#wget –c/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 [root@binnary ~]#wget –c/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2.sign 新版本的内核分分两种:一种是完整源码版本(我们直接解压就可以使用)另一种是patch文件[root@binnary ~]#cd linux-2.6.18[root@binnary linux-2.6.18]#bzcat ../patch-2.6.14.bz2 | patch –p1patch命令可以根据补丁文件内容修订文件内容修改指定目录下的文件。
patch –p<n> < diff_filecat diff_file | patch –p<n>bzcat diff_file.bz2 | patch –p<n>zcat diff_file.gz | patch –p<n>其中,<n> 代表按照patch文件的路径忽略的目录级数,每个 ” / ” 代表一级。
linux系统中make的用法
linux系统中make的用法make是一个常用的Linux命令,用于自动化编译程序。
当有多个源文件需要编译成可执行文件时,手动一个个编译比较麻烦。
这时候,我们就可以使用make命令实现自动化编译。
make命令的基本用法为:在Makefile文件中定义编译规则和依赖关系,然后运行make命令即可自动编译程序。
Makefile是一个文本文件,可以使用vi、nano等编辑器创建和编辑。
make命令的常用参数如下:* -f 指定Makefile文件,默认为当前目录下的Makefile或makefile文件。
* -n 或 --just-print 只打印命令,而不实际执行。
* -j 指定同时执行的任务数,加快编译速度。
* clean 清除中间文件和可执行文件等生成的文件。
Makefile文件中的基本语法为:```target: prerequisitescommand```其中,target为编译目标,prerequisites为编译目标所依赖的文件,command为执行编译的命令。
例如:```hello: hello.cgcc -o hello hello.c```这个Makefile文件中定义了一个名为“hello”的编译目标,它依赖于名为“hello.c”的源文件,执行命令为“gcc -o hellohello.c”,即将hello.c编译成可执行文件hello。
使用make命令进行编译时,可以直接运行“make”(默认编译第一个目标),也可以指定要编译的目标,例如“make hello”。
当定义的目标有多个依赖时,可以使用“$^”表示所有依赖文件,“$@”表示目标文件。
例如:```main.exe: main.c module1.o module2.ogcc -o $@ $^```这个Makefile文件中定义了一个名为“main.exe”的编译目标,它依赖于名为“main.c”、“module1.o”、“module2.o”的文件,执行命令为“gcc -o $@ $^”,即将这三个文件编译成可执行文件main.exe。
kconfig string 默认值范围-概述说明以及解释
kconfig string 默认值范围-概述说明以及解释1.引言1.1 概述概述部分:Kconfig是Linux内核配置系统中使用的配置语言,用于定义内核的配置选项和配置依赖关系。
在Kconfig中,有一个string类型的配置选项,用于存储字符串类型的配置信息。
在配置Kconfig string类型时,可以设置默认值来方便用户选择或使用。
本文将围绕Kconfig string类型的默认值进行讨论,主要关注默认值的设置范围。
通过深入探讨Kconfig string类型的默认值范围,可以帮助读者更好地理解如何在实际应用中进行配置选项的设置,从而提高内核配置的灵活性和便利性。
1.2 文章结构本文主要分为三个部分,分别是引言、正文和结论。
在引言部分,将对Kconfig string类型及其默认值进行简要介绍,以及文章的结构和目的进行阐述。
在正文部分,将详细讨论Kconfig string类型的特点和使用方法,重点关注Kconfig中string默认值的设置及其范围。
在结论部分,将对本文进行总结,探讨Kconfig string默认值范围的应用意义,并展望相关领域可能出现的发展趋势。
1.3 目的目的部分旨在指出本文的研究目的和意义。
通过对Kconfig中string 类型的默认值范围进行分析和讨论,旨在帮助读者更好地理解和使用Kconfig配置系统。
同时,本文还旨在探讨如何合理设置和利用Kconfig 中string类型的默认值,以提高软件开发效率和功能性。
通过本文的研究,读者可以更深入地了解Kconfig配置系统的使用和特性,为软件开发提供一定的参考和指导。
2.正文2.1 Kconfig string类型简介在嵌入式系统开发中,Kconfig是Linux内核的配置系统,用于管理内核配置项的选择和设置。
在Kconfig中,有多种类型的配置项,其中包括string类型。
String类型的配置项用于表示字符串值,可以用于配置文件路径、设备名称、配置参数等。
Kconfig指令详解
mentcomment相当于插入语句,不起实际作用,只是起显示一句话如:comment "****Boot options******"bool 后面+字符串(tristate与bool一样,只是多了一个M选项,意思是编译成动态模块,不是直接加载到内核的,而是单独编译成模块,需要时再加载,适合于外设驱动程序)如:config S3C_BOOT_WATCHDOGbool "S3C Initialisation watchdog"depends on S3C2410_W ATCHDOGhelpSay y to enable the watchdog during the kernel decompression其中关键字config ,bool ,depends on当S3C2410_W ATCHDOG被定义时,显示[ ] S3C Initialisation watchdog 选项用空格来选择Y or N . bool 是用来定义Y或者N 的,当选择Y 时,则配置CONFIG_S3C_BOOT_W ATCHDOG在Makefile 中obj-$( CONFIG_S3C_BOOT_W ATCHDOG) += watchdog.o 则该语句有效,编译watchdog.c 文件3. int 的用法config S3C2410_PM_CHECK_CHUNKSIZEint "S3C UART to use for low-level messages"default 0 //若要写成默认值100 则括号里面就是100helpChoice of which UART port to use for the low-level messages,箭头的使用如下:蓝色部分//****************以下设置菜单前有选项[ ]**************************menuconfig NETbool "Networking support"select NLATTR---help---Unless you really know what you are doing, you should say Y here.。
linuxkconfig详解及语法
linuxkconfig详解及语法Linux 入门基础 Linux系统安装GNOME图形界面基...默认值显示给用户,并可以让用户进行修改。
默认值的依赖关系可以用 "if" 添加。
(可选项)依赖关系:"depends on"/"requires" <expr> 为一菜单选项定义依赖关系。
如果定义了多个依赖关系,它们之间用 '&&' 间隔。
依赖关系也可以应用到该菜单中所有的其它选项(同样接受if表达式),所以下面的两个例子是等价的:bool "foo" if BAR default y if BARdepends on BAR bool "foo" default y- 反向依赖关系:"select" <symbol> ["if" <expr>]尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。
当前菜单选项的值是symbol的最小值。
如果symbol被选择了多次,上限就是其中的最大值。
反向依赖只能用在boolean或tristate选项上。
- 数据范围:"range" <symbol><symbol> ["if" <expr>]为int和hex类型的选项设置可以接受输入值范围。
用户只能输入大于等于第一个symbol,小于等于第二个 symbol的值。
- 帮助信息: "help" or "---help---" 定义一帮助信息。
帮助信息的结束就由缩进的水平决定的,这也就意味着信息是在第一个比帮助信息开始行的缩进小的行结束。
"---help---" 和"help" 在实现的作用上没有区别,"---help---" 有助于将文件中的配置逻辑与给开发人员的提示分开。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux系统的Makefile、Kconfig和模块1Makefile1.1Makefile组织层次Linux的Make体系由如下几部分组成:Ø顶层Makefile顶层Makefile通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux和模块。
Ø内核相关Makefile位于arch/$(ARCH) 目录下,为顶层Makefile提供与具体硬件体系结构相关的信息。
Ø公共编译规则定义文件。
包括Makefile.build 、Makefile.clean、Makefile.lib、Makefile.host等文件组成。
这些文件位于scripts目录中,定义了编译需要的公共的规则和定义。
Ø内核配置文件 .config通过调用make menuconfig或者make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。
Ø其他Makefile主要为整个Makefile体系提供各自模块的目标文件定义,上层Makefile根据它所定义的目标来完成各自模块的编译。
1.2Makefile的使用在编译内核之前,用户必须首先完成必要的配置。
Linux内核提供了数不胜数的功能,支持众多的硬件体系结构,这就需要用户对将要生成的内核进行裁减。
内核提供了多种不同的工具来简化内核的配置。
make config,字符界面下命令行工具,这个工具会依次遍历内核所有的配置项,要求用户进行逐项的选择配置。
这个工具会耗费用户太多时间,除非万不得以(你的编译主机不支持其他配置工具)一般不建议使用。
make menuconfig,基于ncurse库编制的图形界面工具,一般台式机使用该工具。
make xconfig,基于X11的图形配置工具,一般用于工作站环境。
当用户完成配置后,配置工具会自动生成.config文件,它被保存在内核代码树的根目录下。
当一切工作完成以后,用户只需要简单键入make或make zImage,剩下所有的工作makefile就会自动替你完成了。
1.3Makefile编译流程当用户使用Linux的Makefile编译内核版本时,Makefile的编译流程如下:Ø使用命令行或者图形界面配置工具,对内核进行裁减,生成.config配置文件Ø保存内核版本信息到include/linux/version.hØ产生符号链接include/asm,指向实际目录include/asm-$(ARCH)Ø为最终目标文件的生成进行必要的准备工作Ø递归进入/init 、/kernel、/drivers、/net、/lib等目录和其中的子目录来编译生成所有的目标文件Ø链接上述过程产生的目标文件生成vmlinux,vmlinux存放在内核代码树的根目录下Ø最后根据arch/$(ARCH)/Makefile文件定义的后期编译的处理规则建立最终的映象bootimage,包括创建引导记录、准备initrd映象和相关处理1.4Makefile关键规则和定义描述1.4.1目标定义目标定义是Makefile文件的核心部分,目标定义通知Makefile需要生成哪些目标文件、如何根据特殊的编译选项链接目标文件,同时控制哪些子目录要递归进入进行编译。
这个例子Makefile文件位于/fs/ext2目录:## Makefile for the linux ext2-filesystem routines.#obj-$(CONFIG_EXT2_FS) += ext2.oext2-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ioctl.o namei.o super.o symlink.oext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.oext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.oext2-$(CONFIG_EXT2_FS_SECURITY) += xattr_security.oext2-$(CONFIG_EXT2_FS_XIP) += xip.o这表示与ext2相关的目标文件由ext2-y定义的文件列表组成,其中ext2-$(*)是由内核配置文件.config中的配置项决定,最终Makefile会在这个目录下统一生成一个目标文件ext2.o(由obj-$(CONFIG_EXT2_FS)决定)。
其中obj-y表示为生成vmlinux文件所需要的目标文件集合,具体的文件依赖于内核配置。
Makefile会编译所有的$(obj-y)中定义的文件,然后调用链接器将这些文件链接到built-in.o文件中。
最终built-in.o文件通过顶层Makefile链接到vmlinux中。
值得注意的是$(obj-y)的文件顺序很重要。
列表文件可以重复,文件第一次出现时将会链接到built-in.o中,后来出现的同名文件将会被忽略。
文件顺序直接决定了他们被调用的顺序,这一点读者需要特别注意。
读者可能会在某些Makefile中发现lib-y定义,所有包含在lib-y定义中的目标文件都将会被编译到该目录下一个统一的库文件中。
值得注意的是lib-y定义一般被限制在lib 和arch/$(ARCH)/lib 目录中。
体系makefile文件和顶层makefile文件共同定义了如何建立vmlinux文件的规则。
$(head-y) 列举首先链接到vmlinux的对象文件。
$(libs-y) 列举了能够找到lib.a文件的目录。
其余的变量列举了能够找到内嵌对象文件的目录。
$(init-y) 列举的对象位于$(head-y)对象之后。
然后是如下位置顺序:$(core-y), $(libs-y), $(drivers-y) 和$(net-y)。
顶层makefile定义了所有通用目录,arch/$(ARCH)/Makefile文件只需增加体系相关的目录。
例如: #arch/i386/Makefilelibs-y += arch/i386/lib/core-y += arch/i386/kernel/ \arch/i386/mm/ \arch/i386/$(mcore-y)/ \arch/i386/crypto/drivers-$(CONFIG_MATH_EMULATION) += arch/i386/math-emu/drivers-$(CONFIG_PCI) += arch/i386/pci/…………………………………………1.4.2目录递归Makefile文件只负责当前目录下的目标文件,子目录中的文件由子目录中的makefile 负责编译,编译系统使用obj-y 和obj-m来自动递归编译各个子目录中的文件。
对于fs/Makefile:obj-$(CONFIG_EXT2_FS) += ext2/如果在内核配置文件.config中,CONFIG_EXT2_FS被设置为y或者m,则内核makefile会自动进入ext2目录来进行编译。
内核Makefile只使用这些信息来决定是否需要编译这个目录,子目录中的makefile规定哪些文件编译为模块,哪些文件编译进内核。
2Kconfig内核源码树的目录下都有两个文档Kconfig和Makefile,分布到各级子目录的Kconfig 构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录下相关的内核配置菜单选项。
在内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到.config 的内核配置文档中。
在内核编译时,顶层Makefile调用这个.config,就知道了用户的选择。
假如要想添加新的驱动到内核的源码中,需要修改Kconfig,这样就能够从配置菜单中选择这个驱动。
假如想使这个驱动被编译,需要修改Makefile。
一个典型的内核配置菜单如下:menu "Network device support"config NETDEVICESbool "Enable Net Devices"depends on NETdefault yhelpThis is help desciption。
...endmenu包含在menu/endmenu中的内容会成为Network device support的子菜单。
每一个子菜单项都是由config来定义的。
congfig下方的那些bool、depends on、default、help等为config 的属性,用于定义该菜单项的类型、依赖项、默认值、帮助信息等。
每个config菜单项都要有类型定义:bool布尔类型、tristate三态(内建、模块、移除)、string字符串、hex十六进制、integer整型。
例如:config HELLO_MODULEbool "hello test module"bool 类型的只能选中或不选中,显示为[ ],tristate类型的菜单项多了编译成内核模块的选项,显示为< >。
假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置;假如选择静态编译,就是直接编译成内核映像,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置。
hex十六进制类型显示为()。
在Kconfig中有类似语句:source "drivers/usb/Kconfig",用来包含(或嵌套)新的Kconfig 文件,这样便可以使各个目录管理各自的配置内容,不必把那些配置都写在同一个文件里,方便修改和管理。
3模块(module)模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。
模块最主要的用处就是用来实现设备驱动程序。
使用模块的优点:l将来修改内核时,不必全部重新编译整个内核,可节省不少时间l系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可通常,一个Linux内核模块主要由以下几部分组成:(1)module_init()---模块加载函数(必须)当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作。