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操作系统的内部原理,并根据需要定制和优化系统的功能。
- 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命令加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作。