1.对于大型的项目,Makefile文件的编写是一件比较繁琐的事情,所以现在Linux上的软件开发一般都用autotools来制作Makefiles。
2.autotools的使用流程
(1)autoscan
它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型。这个工具会生成一个“configure.in”的原型文件“configure.scan”。
(2)将“configure.scan”改名为“configure.in”,并对其中的内容作如下的修改:
以“#”号为开始的行为注释。
AC_PREREQ宏声明本文件要求的autoconf版本。
AC_INIR宏用来定义软件的名称和版本等信息。
AM_INIT_AUTOMAKE是需要添加的内容,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,在此来确定源码目录的有效性。
AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
AC_CONFIG_FILES宏用于生成相应的Makefile文件。
(3)运行aclocal,生成一个“aclocal.m4”文件,该文件主要是处理本地的宏定义。
(4)使用autoheader命令,它负责生成config.h.in文件。该工具通常会从acconfig.h文件中复制用户附加的符号定义。
(5)automake
这是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。然后,automake工具转换成Makefile.in。Makefile.am文件的内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
下面对该脚本文件的对应项进行解释:
A.其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,默认等级为gnu。
B.bin_PROGRAMS定义要产生的执行文件名。如果要产生多个可执行文件,每个文件名用空格隔开。
C.hello_SOURCES定义了“hello”这个执行程序锁需要的原始文件。如果“hello”这个程序是由多个原始文件所产生的,则必须把它们所用到的所有原始文件都列出来,并用空格隔开。如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
添加完Makefile.am之后,执行命令
# automake --add-missing
这个命令来生成Makefile.in文件,这里使用“--add-missing”是为了让automake自动添加一些必需的脚本文件。
(6)运行configure
这一步中,通过运行自动配置设置文件configure,把Makefile.in变成最终的Makefile。
3.使用automake生成的Makefile
(1)在命令行输入命令
# make
则默认执行“make all”命令,即目标体为all。
(2)在命令行输入命令
# make install
此时,会把该程序安装到系统目录中去
(3)在命令行输入命令
# make clean
此时,make会清除之前所编译的可执行文件及目标文件。
(4)在命令行输入命令
# make dist
此时,make将程序和相关的文档打包为一个压缩文档以供发布。
4.内存区域Zone
ZONE_DMA包含可以用来执行DMA操作的内存。
ZONE_NORMAL包含可以正常映射到虚拟地址的内存区域。
ZONE_HIGHMEM包含不能永久映射到内核地址空间的内存区域。
5.高端内存和虚拟内存
Linux在初始化时总是尽可能地将所有的物理内存映射到内核地址空间中去。如果内核地址空间起始于(0xC0000000),为vmalloc保留的虚拟地址空间是128M,那么最多只能有(1GB–128M)的物理内存直接映射到内核空间,内核可以直接访问。如果还有更多的物理内存,就称为高端内存,内核不能直接访问,只能通过修改页表映射后才能进行访问。
申请和释放较小且连续的内存空间时,使用kmalloc()和kfree()函数在物理内存中进行分配;申请较大的内存空间时,可以使用vmalloc()函数。由vmalloc()函数申请的内存空间在虚拟内存中是连续的,它们映射到物理内存时,可以使用不连续的物理页面,而且仅把当前访问的部分放在物理页面中。
使用vmalloc时应将包含进来。与其他内存分配函数不同的是,vmalloc返回很“高”的地址值——这些地址要高于物理内存的顶部。vmalloc分配的内核虚拟内存与kmalloc/__get_free_pages分配的内核逻辑内存位于不同的区间,不会重叠。因为内核空间被分区管理,各司其职。用户空间被分配在0~3GB之间,3GB之后紧随着的是物理内存映射区间,然后才是vmalloc_start开始的用于vmalloc分配内存的地址空间。用vmalloc分配的内存空间使用vfree释放。对vmalloc和ioremap函数可分配的内存空间大小并没有什么限制,但是为了能够检测到程序员犯的一些错误,vmalloc不允许分配超过物理内存大小的内存空间。