CentOS源码编译及系统调用

基于centos的源码编译及系统调用

(1)Linux 安装

参考文献:https://blog.csdn.net/m0_56196644/article/details/125616505

(2) 环境搭建

下载源码

sudo yum -y install wget
// 下载相应的版本源码 下载时间大约10~20分钟左右 与网速和电脑性能有关
sudo wget http://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.4.tar.xz

配置编译环境并进行相应配置

// 搭配编译环境
sudo yum -y install ncurses-devel
sudo yum -y install bc
sudo yum -y install bison
sudo yum -y install flex
sudo yum -y install gcc g++ gdb make
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-7-gcc*
// 将linux文件放至指定目录下并且解压。
// 如果 不是在root用户下 下列操作均加入sudo
cp -r ~/linux-4.20.4.tar.xz /usr/src/kernels
sudo tar xvJf linux-4.20.4.tar.xz -C /usr/src/kernels/
cd /usr/src/kernels/linux-4.20.4/kernel
vi sys.c
//在文件末尾#endif前面加入函数
SYSCALL_DEFINE1(cube,int,num){
    int result = num*num*num;
    return result;
}
// 添加声明
cd /usr/src/kernels/linux-4.20.4/arch/x86/include/asm/
vi syscalls.h
// 在文件中插入
asmlinkage long sys_cube(long n);

syscalls.h插入位置
CentOS源码编译及系统调用_第1张图片
添加系统调用

// 加一个系统调用的id
cd /usr/src/kernels/linux-4.20.4/arch/x86/entry/syscalls
vi syscall_64.tbl // 这里也有可能是32
# 在里面添加自己的系统调用号 这里的333 根据自己的情况改
335  64 cube __x64_sys_cube

开始编译源码

// 查询已有内核版本
cd /boot/
ls
// 找到config-$(name -r)
// 将已有内核复制。
cd /usr/src/kernels/linux-4.20.4/
sudo cp /boot/config-$(name -r) .config
sudo make menuconfig
//选择load -> ok -> save -> ok ->exit ->exit

menuconfig界面
CentOS源码编译及系统调用_第2张图片
选择栏后配置就完成了,在源码根目录下会生成一个.config文件,这就是这次编译的参数配置,之前copy过来的.config文件变成了.config.old。

sudo yum -y install elfutils-libelf-devel
sudo yum -y install openssl-devel
sudo yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
// 开始编译
/*
键入make -j4指令即可正式开始编译,为加快编译速度,允许4个任务同时进行,其中4是机器中CPU核的个数。编译过程通常比较慢长。性能较好约俩小时左右
*/
make -j4
// 安装模块和内核
make modules_install
make install
// 更新引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg

重启后 第一个是自行编译的 第二个是原来的。我们选择第一个即完成源码编译
CentOS源码编译及系统调用_第3张图片
重启系统后输入

(3)系统调用实现三次方功能

新建一个c语言文件

vim cubic.c

输入以下代码

// 输入以下代码
#include
#include
#include
#include
int main(){
        double n;
        long s;
        scanf("%lf",&n);
        s=n*100;
        if(s<0){
                s = -syscall(335,-s);
        }
        else{
                s = syscall(335,s);
        }
        n = s;
        n = n / syscall(335,100);
        printf("%lf",n);
        return 0;
}

退出并保存

// 保存
gcc cubic.c

测试用例分别为:4,-4,3.14,-3.14 CentOS源码编译及系统调用_第4张图片

(4)源码及其他

GitHub查看

你可能感兴趣的:(linux,centos)