使用的教程:
https://blog.csdn.net/qq_38454977/article/details/71367655
https://blog.csdn.net/qq_36172505/article/details/80372029
https://blog.csdn.net/weixin_44224230/article/details/89945899
https://blog.csdn.net/qq_41175905/article/details/80529245
第一步 下载内核模块压缩包
https://www.kernel.org/
下载了4.19.86
linux命令行中文乱码
https://blog.csdn.net/qq_37253988/article/details/89389676
1.将内核压缩包linux-4.10.14.tar.xz放入Ubuntu系统
2.把压缩包解压缩,使用命令 tar -xvf linux-4.19.86.tar.xz
3.将解压后的文件夹放到usr/src目录,这时候我们需要管理员权限,使用sudo su命令,之后输入密码就能获取权限,接下来使用mv linux-4.19.86 /usr/src
将文件夹放入 /usr/src
第二步 修改文件
使用命令vim /usr/src/linux-4.10.14/kernel/sys.c
,在sys.c的末尾加入以下函数
asmlinkage int sys_helloworld(int number){
printk(“hello world”);
return number;
}
使用命令vim /usr/src/linux-4.10.14/include/uapi/asm-generic/unistd.h
在223条声明处,改成这个,把原来的声明注释掉
#define __NR_helloworld 223
__SYSCALL(__NR_helloworld, sys_helloworld)
第三步 编译安装内核
第一步:make mrproper
清除内核中不稳定的目标文件夹,附属文件及内核配置文件
第二步:make clean
清除以前生成的目标文件和其他文件
第三步:make menuconfig
配置内核,采用默认配置即可,选择exit
这个地方报错了
include/config/auto.conf are missing
sudo apt install bison
sudo apt install flex
apt install libncurses-dev
make menuconfig
第五步:使用lscpu命令看看你的cpu支持几个线程。如果在虚拟机中,可以在配置中调整cpu的个数,然后重启虚拟机(不过改过后虚拟机大概会自动重启),进入到当前的/usr/src/linux-4.10.14文件夹下,如果lscpu显示有8个就使用make –j8命令,加快编译速度(不然要等好久的!!)
报错:
没有openssl/opensslv.h
使用命令:
apt install libssl-dev
apt install libelf-dev
尝试写写目标函数
随机数发生器
https://blog.csdn.net/w_y_x_y/article/details/80199694
睡眠函数
https://blog.csdn.net/github_35124642/article/details/51902089
https://blog.csdn.net/chaseraod/article/details/75331806
https://blog.csdn.net/he_shuai20/article/details/72904545
内核定时器
https://blog.csdn.net/gbmaotai/article/details/82344883
void timer_func(unsigned long data) //2.定义定时器处理函数
{
printk("time out [%d]\n", (int)data);
}
void diag(long number)//通过传不同的参数更改种子值,一般传time(NULL)
{
next=number;
next = next * 1103515245 + 12345;
long timeout = (next/65536) % 32768
/*定义一个名为my_timer的timer_list数据结构*/
struct timer_list my_timer;
/*初始化my_timer的部分内部成员*/
init_timer(&my_timer);
my_timer.expires = jiffies + timeout*HZ; //2.设定定时器处理函数触发时间为5秒
my_timer.function = timer_func; //2.给结构体指定定时器处理函数
my_timer.data = (unsigned long)99; //2.设定定时器处理函数的传参
add_timer(&my_timer); //3.激活定时器
/*signal(SIGALRM,wakeUp);
alarm(timeout);
pause();
int ret = alarm(0);
sigaction(SIGALRM,&oact,NULL);
return ret;*/
/*struct semaphore *sem=-1;
i=down_timeout(-1,timeout);/*
/*m=5000;
a=2501;
b=1343;
r = number;
r=(2501*number-1+1343)% 5000;
if(r<1000)
r=r+1000;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m*/
/*if(i<0)
{
sem=1;
up(sem);
}*/
}
void sys_timefunc(unsigned long data)
{
printk("time out [%d]\n", (int)data);
}
long sys_diag(long number)
{
number = number * 1103515245 + 12345;
long timeout;
timeout = (number/65536) % 5000;
if(timeout<1000)
timeout=timeout+1000;
struct timer_list my_timer;
init_timer(&my_timer);
my_timer.expires = jiffies + timeout*HZ;
my_timer.function = sys_timefunc;
my_timer.data = (unsigned long)timeout;
add_timer(&my_timer);
return number;
}
11.26这回按照https://blog.csdn.net/weixin_44224230/article/details/89945899做的添加自定义系统调用
报错说cc1的时候就用https://blog.csdn.net/ctthuangcheng/article/details/50356649来增加交换内存
然后我现在好像因为空间都占满了所以打不开虚拟机了。。。
使用ccache加速make效果拔群!
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int a = syscall(336,8);
printf("return %ld\n",a);
return 0;
}
~
asmlinkage void sys_timefunc(unsigned long data)
{
printk("time out [%d]\n", (int)data);
}
asmlinkage long sys_diag(long number)
{
number = number * 1103515245 + 12345;
long timeout;
timeout = (number/65536) % 5000;
if(timeout<1000)
timeout=timeout+1000;
printk("ready to sleep for %d ms\n",timeout);
struct timer_list my_timer;
init_timer(&my_timer);
my_timer.expires = jiffies + timeout*HZ;
my_timer.function = sys_timefunc;
add_timer(&my_timer);
return number;
}
mdelay()用方法二直接实现
https://blog.csdn.net/Egqawkq/article/details/88970390
https://blog.csdn.net/ThugKd/article/details/50117125
要用一个#include<linux/jiffies.h>才能实现内核定时器