Linux内核的配置
在编译内核之前首先得先配置内核,通常是敲入make menuconfig来配置。(不过嵌入式开发的时候我好像挺少用到的)
Linux内核的配置系统由下面3个部分组成
- Makefile:分布在Linux内核的源码中,定义Linux内核编译规则
- 配置文件(Kconfig):给用户提供配置选择的功能
- 配置工具:。。。
使用make menuconfig命令后,会生成.config文件,该文件会记录哪些部分被编译入内核、哪些部分被编译为内核模块。其实工作之后发现,至少在我工作的地方是这样的。会有一个product_config,给开发人员选择是否开启某些配置项,之前我在往SD卡驱动里面添加代码的时候,需要从外部的product_config中新增项,同时在Kconfig文件新增项,这样的话我可以在代码里面新增入自己添加的宏定义。
简而言之:Kconfig中定义该config是否开启,在Makefile中依据这个config是否开启来进行相应的编译。
obj-$(config) +=foo.o config =y or n or m
对于Makefile 的简易介绍
目标定义
e.g: obj-y += foo.o
表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,obj-m表示该文件要作为模块编译,obj-n形式的目标不会被编译。
多文件模板的定义
多个文件组合编译成一个模块,需要采用模块名加-y的后缀来定义模板的组成文件
e.g:
obj-$(config1) += ext2.o #需要编译ext2模块与否
ext2-y := balloc.o dir.o file.o .......#如果需要的话,编译该模块需要的文件
ext2-$(config2) += acl.o #根据配置项config2,ext2还需要链接的文件
ext2-$(config3) += xattr.o xattr_trusted.o #根据配置项config3, ext2还需要链接的文件
目录层次的迭代
obj-$(config) += ext2/ #当config为y或者m的时候,kbuild会把ext2目录列入向下迭代的目标中。这个在编译的时候,方便将编译命令作用到整个目录(包括目录下的子目录)。
Kconfig的语法简易介绍:(之后再研究,现在感觉能读懂就行~)
配置选项
大多数的内核配置选项都对应着Kconfig中的一个配置选项(config)
e.g:
config CONFIGNAME
bool "MODULE version support"
#bool 数据的类型, 后面的是输入提示
help
.....#帮助信息
在内核中新增驱动代码目录和子目录的实例
在内核中增加目录和子目录,需要为相应的新增目录创建Makefile和Kconfig文件,而新增目录的父目录中的Kconfig和Makefile也需要修改。
e.g:新增一个test目录,test有一个子目录testUser.
1. 需要在新增的test目录下加入Kconfig文件
2. 为了使该Kconfig生效需要修改test父目录的Kconfig,增加:
source "drivers/test/Kconfig"
3. 在新增的test目录下,加入Makefile,该Makefile中需要有对于testUser的子目录的遍历,这样编译的时候才可以把子目录也编译了:obj-$(config1) += testUser/
4. 同时testUser目录中也需要加入自己的编译的Makefile
5. 为了编译的时候能编译整个的test目录,所以需要在test目录下的Makefile里面添加:
obj-$(config2) += test/
6. 以上为新增一个目录需要注意的东西
小工具
secureCRT这个软件在公司也用,两个用处:
1. 可以在windows窗口通过ssh来访问虚拟机里面的Linux系统,并进行命令的操作
(需要在Linux系统里面安装ssh的client和server)
2. 可以作为串口工具