linux内核编译及添加系统调用(详细版)

article/2025/10/25 0:07:44

linux内核编译及添加系统调用

注:文章共四部分,分别是

1、编译更换内核

2、添加一个简单系统系统调用

3、添加读取/修改nice值的系统调用

4、自己设计简单(真的简单)系统调用

注:四个部分结构相似,请根据自身需求自行选择观看。(ps有点唠叨的,但也比较完整),不同内核环境会有差别,使用不同版本可能会产生非预期的错误,如有错误欢迎评论区指出。

相关实验资源:
1、kernel内核源码
https://elixir.bootlin.com/linux/latest/source/include
2、Linux系统版本:Ubuntu16.04
清华源镜像:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04/
3、预安装内核linux-4.16.1
清华源镜像:https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.16.1.tar.xz

(一)、下载新内核并编译、更换:

第一步:下载解压,进入文件夹
#wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.16.1.tar.xz
(或者手动下载压缩包解压) 
#xz –d linux-4.16.1.tar.xz
#tar –xvf linux-4.16.1.tar 
#cd linux-4.16.1
第二步 :清楚残留的 .config和 .o文件(每次编译出错或者重新编译最好都清理,不清理很占内存)
#make mrproper

报错提醒安装ncurses,重新执行make mrproper

#apt-get install libncurses5-dev   
第三步:配置内核
#make menuconfig 

根据报错提示安装组件,缺啥装啥

#sudo apt install build-essential //安装make和gcc等
#apt-get install libncurses5-dev	 //安装ncurses-devel
#sudo apt-get install flex		 //安装flex
#sudo apt-get install bison 		 //安装bison

没有报错后再执行

#make menuconfig 

出现配置的对话框,直接保存(save),文件名也默认.config, 退出。

第四步:编译内核,生成启动映像文件
#make -j4 //-j4是用于加快编译速度。这里我用4线程

报错提示要openssl,安装完再次执行命令即可

#apt-get install libssl-dev 
第五步:编译模块

这一步要好久(2-3小时,可能虚拟机配置太低吧)。。。。睡一觉回来就好了

#make modules
第六步:安装内核、模块
安装模块:# make modules_install 
安装内核:#make install
第七步:配置 grub 引导程序

只需要执行如下命令:该命令会自动修改 grub

#update-grub2
最后一步重启:
#reboot -n

查看内核版本

#uname -a

成功更换内核!

(二)、添加简单系统调用

系统调用表

  • 用于关联系统调用号及其相对应的服务历程入口地址。例如系统调用read在系统调用表中结构如下
系统调用号32/64/common系统调用名称服务例程入口
0commonreadsys_read(这里不同内核版本格式有所不同)

path: /arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)

第一步:修改源程序
#cd linux-4.16.1 //进入linux解压包(我下的版本是4.16.1)
#vim arch/x86/entry/syscalls/syscall_64.tbl //进入该文件分配系统调用号 (注意别写在最后面,x64的系统调用共300多行,注意别写到后半部分的x32那一块里面)

在这里插入图片描述

#vim include/linux/syscalls.h 进入该文件,添加服务例程的原型声明(shift+g快速跳到最后一行)

vim kernel/sys.c 实现系统调用服务例程

SYSCALL_DEFINE后的数字代表参数个数,这里0个参数(void)

在这里插入图片描述

第二步:编译安装内核
1. #make menuconfig 配置内核
2. #make –j2 编译内核
3. #make modules 编译模块
4. #make modules_install 和 make install 安装模块和安装内核
5. #update-grub2(好像虚拟机不需要这一步)
6. #reboot –n 立即重启
第三步:新系统调用测试

这里编写一个test.c文件来测试(文件存放位置可以任意)

#vim test.c

在这里插入图片描述

编译

gcc test.c -o test //-o test指定编译输出文件名为test

在这里插入图片描述
执行文件

./test

查看信息

dmesg

在这里插入图片描述

可见系统调用成功执行

(三)、添加API对指定进程的 nice 值的读取功能

注:nice值表示进程可被执行的优先级的修正数值,加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
修改源程序

添加系统调用
在这里插入图片描述
添加系统调用函数声明
在这里插入图片描述
系统调用函数具体代码实现
在这里插入图片描述
代码相关介绍
pid:进程ID
flag:等于1表示修改,等于0表示读取
nicevalue:为指定进程设置新的nice值
prio,nice:指向进程当前优先级prio及nice值

copy_to_user函数则是从内核空间拷贝内容到用户空间,用户空间的进程无法直接访问内核空间的内容。

static inline int task_nice(const struct task_struct *p)用于获取当前task的nice值,并返回nice值,nice值的范围是[ -20 ... 0 ... 19 ]
其使用的例程如下:void set_user_nice(struct task_struct *p, long nice)
{
bool queued, running;
int old_prio, delta;
struct rq_flags rf;
struct rq *rq;if (task_nice(p) == nice || nice < MIN_NICE || nice > MAX_NICE)
return;
}

return -EFAULT代表返回一个错误代码;

pid_t 其实就是__pid_t类型。(不必在意,找到最原始的定义可能就是个int类型)

#ifndef __pid_t_defined
typedef __pid_t pid_t;define __pid_t_defined#endif
编译安装内核
1. #make menuconfig 配置内核
2. #make –j2 编译内核
3. #make modules 编译模块
4. #make modules_install 和 make install 安装模块和安装内核
5. #update-grub2(好像虚拟机不需要这一步)
6. #reboot –n 立即重启

编写测试程序:

#vim test-nice.c  //在哪创建没有特别要求

在这里插入图片描述

#gcc nice-test.c -o nice-test   //编译,格式gcc <c代码文件> -o <输出文件的文件名>
#./nice-test 					//执行所生成的文件

在这里插入图片描述

#dmesg			//查看信息

在这里插入图片描述

(四)、自己设计系统调用

CONFIG_NR_CPUS是内核被配置支持的CPU个数,而实际设备的CPU个数是在系统启动过程当中去动态监测的。也就是说你配置系统支持32个CPU那么CONFIG_NR_CPUS就等于32,而num_online_cpus()则是当前设备激活可调度的CPU个数。

利用内核函数:

在这里插入图片描述

由于大致流程与前面相似,这里便不再详述

分配系统调用号(335)
在这里插入图片描述

添加服务例程原型声明

在这里插入图片描述

实现系统调用服务例程

在这里插入图片描述

编译安装

  • #make mrproper
  • #make -j4
  • #make modules
  • #make modules_install
  • #make install
  • #reboot -n

编写测试程序

在这里插入图片描述

编译执行后, dmesg查看信息,如图
在这里插入图片描述
end


http://chatgpt.dhexx.cn/article/ohUmDx80.shtml

相关文章

打造自己的专属linux(四):Linux内核编译过程简介

linux在前不久刚发布了最新的3.0内核&#xff0c;在linux的学习中&#xff0c;了解内核的编译是一个必不可少的功课。前几天&#xff0c;学习了linux内核的编译流程&#xff0c;在此总结下&#xff0c;大家来一起学习。 以最新的3.0内核为例&#xff0c;我下载的是linux3.0.1 …

Linux内核开发_1_编译LInux内核

目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. make menuconfig 3. make gconfig 3 开始配置 1. 配置解释 General setup 通用选项 Enable loadable module support…

ubuntu上编译Linux内核步骤

一、虚拟机的准备 1.下载Ubuntu镜像 Enterprise Open Source and Linux | Ubuntu 在最左边Ubuntu Desktop处点22.04LTS下载iso文件 2.在VMware上创建新的虚拟机 Ubuntu 20.04 虚拟机安装教程_柯基的博客-CSDN博客_虚拟机安装ubuntu20.04 特别注意: 在"指定磁盘容量&…

Microsoft Outlook 2019 for mac(电子邮件和日历工具) v16.45Beta中文激活版

Microsoft Outlook 2019 for Mac版是一款非常好用的电子邮件和日历工具&#xff0c;Outlook是office办公软件套装的组件之一&#xff0c;可以帮助您收发电子邮件、管理联系人信息、记日记、安排日程与分配任务&#xff0c;文件视图&#xff0c;保持连接并提升生产效率等.

取消Outlook脱机工作

在运维过程中&#xff0c;有时候会收到用户这样的抱怨&#xff1a;为什么别人发给我的邮件我都收不到&#xff0c;我的邮件也发不出去了&#xff1f; 这种情况有时候是因为Outlook正在脱机工作&#xff0c;在Outlook右下角可以看到这样的信息&#xff1b; 针对这种情况&#x…

Outlook 365 添加企业Exchange邮箱(亲测)

关注公众号及时获取文章更新 前言&#xff1a;Outlook 是微软免费的电子邮件和日历管理工具&#xff0c;在日常工作中&#xff0c;经常需要以邮件的形式来传递信息和文件&#xff0c;是一种必不可少的沟通方式。 问题&#xff1a;在使用Outlook 365 直接配置企业Exchange邮箱时…

安装Windows Outlook邮箱客户端

本文以安装Outlook2010为例。下载iso文件 ed2k://|file|SW_DVD5_Office_Professional_Plus_2010w_SP1_64Bit_ChnSimp_CORE_MLF_X17-76742.iso|1612515328|032320121E0EE36D8F0C32EC89CA0AB9|/ 打开下载好的iso文件点击“steup”进入安装界面。 然后在新的界面里勾上“我接受此…

WIN10设置OUTLOOK开机自启

转载&#xff1a;https://www.cnblogs.com/catherinehu/p/14266890.html 由于开机总是忘记打卡outlook&#xff08;主要是懒&#xff09; 于是想搞个自启动&#xff0c;应该也是很简单 结果在网上搜索了很多 并在多次尝试了之后 并没有成功...... 网上能搜索到的最多的办…

outlook添加账号后,版本更新,无法连接的问题

outlook添加账号后&#xff0c;版本更新&#xff0c;无法连接的问题 必须的版本&#xff1a;16.0.4600.1000 网上关于这个问题的回复 我发现回复的答案中的链接中没有合适更新包 我找到的可以用的下载连接

1、登录——邮件发送激活链接

我们在这里输入账号、密码、邮箱后&#xff0c;后端的service层会判断账号、邮箱是否已被注册。如果没有&#xff0c;则会向邮箱中发送激活链接 在我们点击注册按钮之后&#xff0c;在service层中存入数据库&#xff0c;然后通过数据库中用户的id&#xff0c;来生成激活链接&…

Windows10-Outlook使用教程

介绍 Microsoft Office Outlook是微软办公软件套装的组件之一&#xff0c;它对Windows自带的Outlook express的功能进行了扩充。Outlook的功能很多&#xff0c;可以用它来收发电子邮件、管理联系人信息、记日记、安排日程、分配任务。最新版为Outlook 2020。 我公司自己搭建…

office(word、powerpoint、excel、outlook、onenote、publisher、access)下载安装(由于卡顿打不开重装,已激活)

一、打开以下网址 https://account.microsoft.com/services/ 二、登录账户 在已购买的产品&#xff08;买电脑时送的&#xff09;中选择安装下载 三、office下载安装 下载&#xff08;以下为使用IDM下载&#xff0c;正常情况下直接下载&#xff09; 下载后&#xff0c;双击…

win10 outlook邮件设置

首先在控制面板下–>用户账户–>选择outlook 邮箱设置 邮件设置选择配置文件 选择添加新配置文件 输入邮箱账户密码配置 点击下一步再次输出密码便可生成配置文件 可返回常规设置选择配置文件作为默认系统邮箱 再次打开outlook会显示所配置的邮箱以及所收到的邮件 注释&a…

Outlook2019版本的收发邮件设定

Outlook2019版本的收发邮件设定 邮件设置&#xff1a;1.进入Outlook2019界面&#xff0c;选择规则&#xff0c;选择管理规则及通知。选择新增规则。2.检查条件不用选择&#xff0c;直接按下一步。3.处理邮件方式勾选 “移动到特定资料夹”&#xff0c;该资料夹请选择你本机个人…

outlook插件

详细规划工作安排&#xff0c;会议提前规定 文章目录 outlook下载安装登录使用说明关于outlook日历的使用 outlook outlook插件是一款适应于腾讯会议软件使用的工具栏插件&#xff0c;该插件可以提前发起或预定一场会议&#xff0c;并且能在插件日历中显示&#xff0c;同时日历…

Outlook无法更新,提示键入Exchange密码并连接

问题表现1&#xff1a; ​ 问题表现2&#xff1a; 当尝试删除该账号&#xff0c;重新添加到outlook时&#xff0c;无法添加成功&#xff0c;提示错误代码&#xff1a;CAA20002&#xff0c;如下图&#xff1a; 解决办法&#xff1a; 如是win10或win11&#xff0c;则从系统开始…

outlook客户端 outlook.com邮箱设置方法

登录网页版的outlook.com电子邮箱&#xff0c;找到设置项进行配置&#xff0c;里面有配置POP服务器及端口信息&#xff0c;如下图&#xff1a; outlook客户端配置&#xff0c;如下图&#xff1a; 出上以上测试状态&#xff0c;表示配置成功&#xff0c;点击下一步&#xff0c;完…

Outlook邮箱注册教程 不信你看完还不懂

Outlook作为Microsoft Office家族的办公软件套装之一&#xff0c;关联着很多微软的其他产品。而且Outlook是欧美地区认可度比较高的&#xff0c;不仅可以用于一些境外联络还可以拿来注册Instagram、Twitter、Facebook等各种社交媒体平台。龙哥在这里就给大家出一份详细的Outloo…

无手机号注册Outlook邮箱方法

目前&#xff0c;拥有电子邮件地址已成为一项基本需求&#xff0c;因为有必要其他平台上注册&#xff0c;App注册等等。 创建电子邮件帐户很简单&#xff0c;但同时在安全性方面可能会变得有些微妙&#xff0c;因为我们的电子邮件通常包含与我们公开使用的银行数据、家庭数据或…