在 64 位系统上向 Linux Kernel 3.13 添加新的系统调用

2024-02-22

我正在尝试添加一个简单的helloworld系统调用kernel 3.13.0-37-generic在 64 位系统上。

我将尝试逐步展示到目前为止我所做的事情:

1-我已经通过以下方式下载了内核源代码:

sudo apt-get source linux-image-3.13.0-37-generic

之后,内核源文件解压到/usr/src/

2-定义一个新的系统调用sys_hello() :

我创建了一个目录hello名称在内核源码目录中/usr/src/linux-3.13/

我创建了一个hello.c文件输入hello包含以下内容的目录:

#include <linux/kernel.h>

asmlinkage long sys_hello(void)
{
        printk(“Hello world\n”);
        return 0;
}

然后我创建了一个Makefile在 hello 目录中包含以下内容:

obj-y := hello.o

3- 将 hello 目录添加到内核的 Makefile 中

我改变了以下行/usr/src/linux-3.13/Makefile:

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

to :

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/

4-添加新的系统调用sys_hello()进入系统调用表(syscall_64.tbl 文件)

因为我使用的是64位系统,所以需要修改syscall_64.tbl文件在:

/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl

在文件末尾添加以下行:

-最后一行号是313

314     common    hello    sys_hello

5-添加新的系统调用sys_hello()在系统调用头文件中

vim /usr/src/linux-3.13/include/linux/syscalls.h

我将以下行添加到文件末尾,位于最底部的 #endif 语句之前:

asmlinkage long sys_hello(void);

6-在我的系统上编译这个内核

为了配置内核,我尝试了以下命令:

sudo make menuconfig

在上面的命令之后,出现了一个弹出窗口,我确定ext4被选中,然后save.

Then :

# cd /usr/src/linux-3.13/
# make

需要2~3小时。

在那之后 :

# make modules_install install

之后,我重新启动了系统。

7-测试系统调用(问题就在这里)

重新启动后,我创建了一个名为hello.c在主文件夹中包含以下内容:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
         long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl`
         printf(“System call sys_hello returned %ld\n”, amma);
         return 0;
}

Then :

# gcc hello.c
# ./a.out

输出是:

System call sys_hello returned -1

问题到底是-1。它必须返回0 not -1.

似乎sys_hello不添加到内核系统调用。

我究竟做错了什么?


问题出在第 6 步到最后一步(编译内核)。

第5步之后,我们必须执行以下步骤:

6-在我的系统上编译这个内核

为了配置内核,我尝试了以下命令:

# make menuconfig

在上面的命令之后,出现了一个弹出窗口,我确保选择了 ext4,然后保存。

然后创建DEB来自新内核的文件我们必须:

# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg

它会创造一些deb文件在/usr/src/.

之后我们需要安装它们:

# dpkg -i linux*.deb

它将在您的系统上安装新内核。

现在,重新启动您的系统。系统重启后可以查看是否安装了新内核:

$ uname -r

如果您想知道是否添加到内核的新系统调用,只需键入:

$ cat /proc/kallsyms | grep <system call name>

就我而言:

$ cat /proc/kallsyms | grep hello

以下输出表明您的系统调用已成功添加到内核:

0000000000000000 T sys_hello
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 64 位系统上向 Linux Kernel 3.13 添加新的系统调用 的相关文章

  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • 期待、互动,然后再次期待

    有几篇关于相同内容的帖子 但我仍然无法使我的期望脚本正常工作 我的目的是自动化一切 但保留用户输入的密码 所以脚本有 3 个部分 自动登录 给予用户交互以输入密码 将控制权交还给 Expect 脚本以继续工作 所以我有一个将生成的脚本 其中
  • C# - OPC-UA 服务器应用程序尚未在 Linux 计算机中创建 PKI 证书

    当我跑步时OPC UA serverWindows 机器中的 C 应用程序 然后 OPC UA 服务器已创建证书路径C ProgramData OPC Foundation pki own 并在此路径中生成一些证书 但是当我在中安装 OPC
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 尝试编译 git 但在 linux 中找不到 libcurl

    我想编译支持 http https 的 git 我有 ls usr include curl curlbuild h curl h curlrules h curlver h easy h mprintf h multi h stdchea
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • 如何从 Linux 命令行打开 Sublime Text 2 文件到选项卡,而不是新窗口

    我有 ST2 设置 这样我就可以执行 sublime file txt 它将在 ST2 窗口中打开 但是我怎样才能让它在当前打开的窗口的新选项卡中打开呢 尝试 Sublime 命令行帮助 subl 帮助 Sublime Text 2 内部版
  • 在 shell 脚本中将脚本目录更改为用户的 homedir

    在我的 bash 脚本中 我需要将当前目录更改为用户的主目录 如果我想更改为用户的foo主目录 从命令行我可以执行以下操作 cd foo 效果很好 但是当我从script它告诉我 bar sh line 4 cd foo No such f
  • 无法使用 tar -cvpzf 解压完整目录

    把我的头敲在这上面 I used tar cvpzf file tar gz压缩一个完整的目录 我将文件移动到另一台服务器 并尝试解压缩复制存档的目录 无法使其发挥作用 bash 3 2 tar xvpzf news tar gz tar
  • 警告构建使用导出符号的内核模块

    我有两个内核模块 例如 modA 和 modB modA 导出一个符号EXPORT SYMBOL symA modB 使用它 我有标题modA h对于modA extern void symA int param and in modB c
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用

随机推荐

  • 与接口同名的 TypeScript 类

    我想声明一个名为Date它有一个 Date 类型的属性 如 JavaScript 的 TypeScript 接口 日期对象 https developer mozilla org en US docs Web JavaScript Refe
  • 错误 LNK1104:无法打开文件“mfc90.lib”

    我正在使用 Visual Studio 2012 Professional 我的项目参考使用 VS2008 v90 构建的静态库 当我使用 VS2012 v110 构建时 error LNK1104 cannot open file mfc
  • 构造函数不接受我的信息

    所以构造函数是说 是预期的 错误不是声明 并且 预期的 Person num1 num2 num3 num1 new Person Allison 6600 Crescent Ave 32 9024231421 num2 new Perso
  • 最大夏普比率投资组合因 PortfolioAnalytics 中的错误而失败

    在计算简单的最大夏普比率投资组合权重时 我在 PortfolioAnalytics 中遇到了一个问题 Error in max sr opt R R constraints constraints moments moments Objec
  • Python:在曲线和轴之间填充颜色并区域化区域

    我在 Excel 工作表上有两条曲线的一组 x y 值 使用xlrd模块 我已经能够将它们绘制如下 问题 如何使用不同的填充颜色对三个区域进行着色 曾尝试过fill between但由于不知道如何与x轴和y轴关联而没有成功 心中的结局如下图
  • PHP:如何删除索引后的所有数组元素[重复]

    这个问题在这里已经有答案了 是否可以删除索引后的所有数组元素 myArrayInit array 1 gt red 30 gt orange 25 gt velvet 45 gt pink 现在一些 魔法 myArray delIndex
  • PySide:如何在 QPushButton 单击槽中获取单击的 QPushButton 对象?

    我是 PySide 的新手 我想在其单击的插槽中获取 QPushButton 对象 例如使用它来获取其文本 button QtGui QPushButton start go button clicked connect self butt
  • 如何向引用添加事件监听器?

    如何添加事件监听器ref使用 ReactJS Hooks 版本 16 8 这是一个示例 我尝试使用 Overflow auto 获取某些 div 的滚动位置 updateScrollPosition永远不会被叫到 function Exam
  • MongoDB minidump文件路径错误

    我最近卸载了 MongoDB 3 2 以安装 MongoDB 3 6 从那时起 每次我尝试启动 mongod 时 都会收到以下错误 failed to open minidump file C Program Files MongoDB S
  • 如何正确重用 Jackson ObjectMapper?

    我对 ObjectMapper 的工作方式以及在我的应用程序中的一般使用感到满意 我想了解的是实现 ObjectMapper 以确保它被重用并且我不会在应用程序中创建不必要的实例的最佳方法 我的想法是 我可以在 Utils 类中声明 Obj
  • RxJS SkipWhile 与过滤器

    SkipWhile 和过滤器运算符有什么区别 const source interval 1000 const example source pipe skipWhile val gt val lt 5 const subscribe ex
  • 这是一个什么样的对象,反应式的?

    我的 Server R 中有这段代码 selection1 lt reactive filter filter DF1 PC in input dynamic AGE gt input age 1 AGE lt input age 2 DF
  • akka-camel 2.2.1 使用 Spring XML 定义路由

    我使用的是 akka camel 2 2 1 需要分别配置往返于 Consumer 和 Producer Actor 的路由 我目前正在定义路由并以编程方式将它们添加到 CamelExtension 内的内部 Camel 上下文中 如下所示
  • Android:无法使用 CustomAdapter 刷新 Listview

    我需要用新数据刷新列表视图 下面这段代码用于获取数据OnCreateView那是在FragmentActivity在第一时间 override fun onCreateView inflater LayoutInflater contain
  • 多处理管道 send() 块

    根据Python文档 只有recv 阻止但不阻止send 我编写了以下代码尝试制作 GUI 数独游戏 我这样做的方式是即使我可以更新游戏板tkinter正在执行其mainloop 然而 在测试运行过程中 我发现如果我在游戏更新时关闭窗口 p
  • 跨域 AJAX/Javascript - 人为地使用 sessionid

    我目前有一个 RESTful Web 服务 它通过会话识别客户端 我有一个客户端 它使用 ajax javascript 来访问 RESTful Web 服务的内容 我通过使用标头响应请求来允许这种情况发生 Access Control A
  • Python套接字:无效的起始字节

    我正在使用 Python 套接字来接收文件 但是 有时我会收到以下错误 Traceback most recent call last File C Users Sharkoon Nextcloud Elektronik pythonPro
  • 在渲染期间设置 glTexParameteri() 是否不好?

    我面临纹理包裹问题 这会导致伪影 由于我的代码库已经变得巨大 我能想到的唯一方法是执行某些检查 看看某些纹理是否属于导致伪影的类别 并在绘制到渲染缓冲区之前更改参数 那么一般情况下是可以的吗 设置参数 例如 glTexParameteri
  • 找不到任何要加载的固定装置服务

    我知道这个问题已经被问过多次 Symfony 3 4 和 Fixtures Bundle 捆绑版本 3 0 存在问题 https stackoverflow com questions 50252845 symfony 3 4 and fi
  • 在 64 位系统上向 Linux Kernel 3.13 添加新的系统调用

    我正在尝试添加一个简单的helloworld系统调用kernel 3 13 0 37 generic在 64 位系统上 我将尝试逐步展示到目前为止我所做的事情 1 我已经通过以下方式下载了内核源代码 sudo apt get source