Linux内核的编译方法及如何往内核中增加程序

ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc)。

内核空间和用户空间这两个名词用来区分程序执行的两种不同状态, 它们使用不同的地址空间。
Linux只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。

Linux驱动开发者需要牢固地掌握Linux内核的编译方法以为嵌入式系统构建可运行的Linux操作系统
映像。在编译内核时,需要配置内核,可以使用下面命令中的一个:

#make config( 基于文本的最为传统的配置界面, 不推荐使用)
#make menuconfig( 基于文本菜单的配置界面)
#make xconfig( 要求QT被安装)
#make gconfig( 要求GTK+被安装)
在配置Linux内核所使用的make config、make menuconfig、make xconfig和make gconfig这4种方式中,最值得推荐的是make menuconfig,它不依赖于QT或GTK+,且非常直观,对/home/baohua/develop/linux中的Linux 4.0-rc1内核运行make ARCH=arm menuconfig后的界面如图3.9所示。
153756_hLa5_2888084.png

内核配置包含的条目相当多, arch/arm/configs/xxx_defconfig文件包含了许多电路板的默认配置。只需
要运行make ARCH=arm xxx_defconfig就可以为xxx开发板配置内核。
编译内核和模块的方法是:
make ARCH=arm zImage
make ARCH=arm modules
上述命令中,如果ARCH=arm已经作为环境变量导出,则不再需要在make命令后书写该选项。执行完
上述命令后,在源代码的根目录下会得到未压缩的内核映像vmlinux和内核符号表文件System.map, 在
arch/arm/boot/目录下会得到压缩的内核映像zImage,在内核各对应目录内得到选中的内核模块。
Linux内核的配置系统由以下3个部分组成:

·Makefile: 分布在Linux内核源代码中, 定义Linux内核的编译规则。
.配置文件( Kconfig) : 给用户提供配置选择的功能。
.配置工具: 包括配置命令解释器( 对配置脚本中使用的配置命令进行解释) 和配置用户界面( 提供
字符界面和图形界面) 。 这些配置工具使用的都是脚本语言, 如用Tcl/TK、 Perl等。

使用make config、 make menuconfig等命令后, 会生成一个.config配置文件, 记录哪些部分被编译入内核、 哪些部分被编译为内核模块。
运行make menuconfig等时, 配置工具首先分析与体系结构对应的/arch/xxx/Kconfig文件( xxx即为传入
的ARCH参数) , /arch/xxx/Kconfig文件中除本身包含一些与体系结构相关的配置项和配置菜单以外, 还通过source语句引入了一系列Kconfig文件, 而这些Kconfig又可能再次通过source引入下一层的Kconfig。

在Linux内核中增加程序需要完成以下3项工作。
·将编写的源代码复制到Linux内核源代码的相应目录中。
·在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项。
·在目录的Makefile文件中增加对新源代码的编译条目。
1.实例引导: TTY_PRINTK字符设备
在讲解Kconfig和Makefile的语法之前, 我们先利用两个简单的实例引导读者对其建立对具初步的认
识。
首先, 在drivers/char目录中包含了TTY_PRINTK设备驱动的源代码drivers/char/ttyprintk.c。 而在该目录
的Kconfig文件中包含关于TTY_PRINTK的配置项:
162015_4tOp_2888084.png

上述Kconfig文件的这段脚本意味着只有在EXPERT和TTY被配置的情况下, 才会出现TTY_PRINTK配
置项, 这个配置项为三态(可编译入内核,可不编译,也可编译为内核模块,选项分别为“Y”、 “N”和“M”) , 菜单上显示的字符串为“TTY driver to output user messages via printk”, “help”后面的内容为帮助信息。 图3.10显示了TTY_PRINTK菜单以及help在运行make menuconfig时的情况。

除了布尔( bool) 配置项外, 还存在一种布尔配置选项, 它意味着要么编译入内核, 要么不编译, 选
项为“Y”或“N”。
162235_sphh_2888084.png

在目录的Makefile中关于TTY_PRINTK的编译项为:

obj-$(CONfiG_TTY_PRINTK) += ttyprintk.o

上述脚本意味着如果TTY_PRINTK配置选项被选择为“Y”或“M”, 即obj-$(CONFIG_TTY_PRINTK)
等同于obj-y或obj-m,则编译ttyprintk.c,选“Y”时会直接将生成的目标代码连接到内核, 选“M”时则会生成模块ttyprintk.ko;如果TTY_PRINTK配置选项被选择为“N”,即obj-$(CONFIG_TTY_PRINTK) 等同于obj-n, 则不编译ttyprintk.c。
一般而言, 驱动开发者会在内核源代码的drivers目录内的相应子目录中增加新设备驱动的源代码或者
在arch/arm/mach-xxx下新增加板级支持的代码, 同时增加或修改Kconfig配置脚本和Makefile脚本, 具体执
行完全仿照上述过程即可。

以上内容摘自《Linux设备驱动开发详解:基于最新的Linux4.0内核》

转载于:https://my.oschina.net/cht2000/blog/983549

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值