一 学习Makefile基本使用方法
1 Makefile简介
linux环境下,当用户编译文件过多的时候,使用makefile可以帮助模块化编译文件,makefile是一个脚本文件,根据规则,来执行相应的脚本文件,实现自动化编译。
2 语法:
Makefile会去执行所有定义的命令,和直接输入命令行是一样的效果。
(1)目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。
(2)默认情况下Makefile的第一个目标为终极目标。
(3)依赖:即目标文件由哪些文件生成。
(4)命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Makefile语法错误)。
(5)all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。
3 变量:
(1)“:=” 表示直接赋值,赋予当前位置的值。
(2)使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。
(3)“?=” 表示如果该变量没有被赋值,赋值予等号后面的值。
(4)"+="表示将符号后面的值添加到前面的变量上
二 下载Linux源代码,尝试在Linux源程序中增加一个系统调用
1下载Linux源代码:
(1)查看CentOS的版本号:
cat /etc/centos-release
查看内核版本:
uname -r
(2)访问centos官网: Index of /,下kernel-3.10.0-1160.el7.src.rpm 的rpm包并安装:
rpm -ivh kernel-3.10.0-1160.el7.src.rpm
安装完rpm会在目录 /root/rpmbuild/SOURCES有一个 linux-3.10.0-1160.el7.tar.xz 的压缩包,使用归档管理器打开并解压,得到linux-3.10.0-1160.el7文件夹,目录下即为源代码。
2在Linux源程序中增加一个系统调用:
修改源程序:
进入linux解压包:cd linux-4.16.1
使用vim编辑arch/x86/entry/syscalls/syscall_64.tbl文件,添加系统调用号:
vim arch/x86/syscalls/syscall_64.tbl
添加一个没有使用的系统调用号(id):
使用vim编辑include/linux/syscalls.h文件,添加原型声明:
vim include/linux/syscalls.h
使用vim编辑kernel/sys.c文件,实现具体的系统调用:
vim kernel/sys.c
代码:
asmlinkage long sys_helloworld(void)
{
printk( "helloworld!");
return 1;
}
三 编译一次Linux内核,检查新增系统调用的效果
1编译内核
(1)配置内核
直接点击保存(save)退出即可。
(2)编译内核
编译需要elfutils-libelf-devel 和 openssl-devel 的支持,安装命令:
yum install elfutils-libelf-devel openssl-devel
使用make命令开始编译内核,可以使用多核线程提高编译速度:
make -j4
等待编译结束。
(3)安装内核
执行 make modules_install 开始安装模块,并执行make install 开始安装内核。
安装结束后重启虚拟机。
2检查新增系统调用的效果
使用vim命令创建测试文件helloworld.c:
vim helloworld.c
使用gcc编译文件:
gcc -o helloworld helloworld.c
运行可执行文件:
./helloworld
返回值为1,系统调用成功。