Linux Kernel Compile

电脑配置:

下载内核代码

安装编译依赖项

等等

解压源码

编译

首先到linux内核源码目录

设置一下

config成功

开始make

安装模块

更新grub

这里我们修改/etc/default.grub中的GRUB_DEFAULT=0GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.9.238",然后运行sudo update-grub

重启

内核已更新

添加系统调用

在Linux文件夹下新建一个叫mysyscalls的文件夹,在里边新建一个叫hello.c的文件,里边编写我们的系统调用代码

#include <linux/kernel.h>

asmlinkage long sys_hello(void)
{
  printk("Hello world\n");
  return 0;
}
asmlinkage long sys_myarg(int arg0)
{
  printk("--syscall arg %d", arg0);
  return 0;
}
asmlinkage long sys_hello_lbx(void)
{
  printk("Hello, LBX\n");
  return 0;
}

修改两个makefile

第一个在mysyscall目录下

第二个是linux根目录下的makefile,搜索core-y,在第二个core-y对应的位置加入mysyscalls/(注意和前边有空格)

修改tbl

arch/x86/entry/syscalls/目录下
修改syscall_64.tbl(32位机子改syscall_32.tbl),在结束处加上你新添加的系统调用

修改callist

include/linux/syscalls.h

加在最后一个#endif之前

然后按照之前的替换内核过程来一遍就好了

验证

创建一个.c文件,输入

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
        syscall(332,10);
        syscall(333);
        syscall(334);
        return 0;
}

syscall函数第一个参数为之前tbl文件中对应的系统调用所在行,之后的参数是输入给系统调用的参数。

然后gcc编译,执行

执行后,执行命令dmesg,查看系统调用输出的信息。