- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要为 Raspbian Linux 内核添加一个自己的系统调用。现在我在搜索了大约 2 天以找到解决方案后陷入困境。
要加一个系统调用,我基本上是按照大纲来的( http://elinux.org/RPi_Kernel_Compilation ) 使用来自以下 git repo 的内核源代码:
git://github.com/raspberrypi/tools.git
我已经使用 crosstool-ng ( http://www.kitware.com/blog/home/post/426 ) 安装了交叉编译环境。
以上所有这些都有效。我能够编译和部署新内核。此外,我还能够为 Raspbian 进行交叉编译。
我正在尝试添加“hello world”系统调用。该函数驻留在它自己的实现文件 (kernel/helloworld.?) 中并实现为:
helloworld.c:
#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/random.h>
#include "helloworld.h"
asmlinkage long sys_helloworld(){
printk (KERN_EMERG "hello world!");
return get_random_int()*4;
}
helloworld.h:
#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H
asmlinkage long sys_helloworld(void);
#endif
相应地扩展了 Makefile。
我现在卡在错误信息中了
AS arch/arm/kernel/entry-common.o
arch/arm/kernel/entry-common.S: Assembler messages:
arch/arm/kernel/entry-common.S:104: Error: __NR_syscalls is not equal to the size of the syscall table
make[1]: *** [arch/arm/kernel/entry-common.o] Error 1
遵循 Writing a new system call 中的建议,我添加了以下内容:
arch/arm/kernel/calls.S
CALL(sys_helloworld)
arch/arm/include/uapi/asm/unistd.h
#define __NR_helloworld (__NR_SYSCALL_BASE+380)
include/uapi/asm-generic/unistd.h
#define __NR_helloworld 274
__SYSCALL(__NR_helloworld, sys_helloworld)
#define __NR_syscalls 275
arch/x86/syscalls/syscall_32.tbl
351 i386 helloworld sys_helloworld
我现在陷入了解决错误的困境。
当删除 calls.S 中的行时,内核编译正常;虽然我不能调用系统调用。添加上述行时,出现上述错误。
供引用:用于测试系统调用的客户端代码是:
#include <linux/unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
int main (int argc, char* argv[])
{
int i=atoi(argv[1]);
int j=-1;
printf("invocing kernel function %i\n", i);
j=syscall(i); /* 350 is our system calls offset number */
printf("invoked. Return is %i. Bye.\n", j);
return 0;
}
所有其他系统调用(例如,1 == sys_exit)工作正常。
知道我遗漏了什么吗?例如,我不完全了解如何实现 rasens 答案。
最佳答案
_NR_syscalls
在 arch/arm/include/asm/unistd.h
文件中定义,此值将始终为 __NR_last_syscall+1
。因此,在您的情况下,_NR_syscalls
应修改为 381,但由于系统调用表中的填充,此更改也会产生相同的错误。因此将其定义为 384。这样可以解决编译错误。以下更改不是必需的:
include/uapi/asm-generic/unistd.h
#define __NR_helloworld 274
__SYSCALL(__NR_helloworld, sys_helloworld)
#define __NR_syscalls 275
arch/x86/syscalls/syscall_32.tbl
351 i386 helloworld sys_helloworld
关于linux - 为 Arm/Raspberry PI 扩展 Rasbian 内核(Linux 内核 3.10.28)——如何正确添加自己的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554267/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在使用带有Grove Pi +(1.2.2固件)的Raspberry Pi 3 B模型和用于Robots Image的Raspbian。 我在I2C-1端口中插入了多 channel 气体传感器,
这看起来非常简单,但我似乎无法弄清楚如何将 -Pi 和 Pi 之间的角度映射到 0 到 2Pi 的范围内。我尝试使用 np.select 但由于某种原因它卡住了我的程序。我需要这个范围内的角度,因为它
在使用 SciPy 和 NumPy 的项目中,我应该使用 scipy.pi , numpy.pi , 或 math.pi ? 最佳答案 >>> import math >>> import numpy
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我有一个运行 Raspbian 的 Raspberry Pi 1。我尝试在 Raspberry Pi 3 上运行 SD 卡,但它没有启动。 我已经阅读了有关升级 Raspberry Pi 2 安装以在
#include using namespace std; #define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #d
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我目前正在尝试RadiusNetworks发布的Raspberry Pi iBeacon教程,网址为 http://developer.radiusnetworks.com/2013/10/09/ho
我无法在运行Raspbian的Raspberry Pi 3上安装我创建的 Electron 应用程序。我已经使用了electronic-packager来创建软件包,然后创建了一个debian安装程序
我想在Linux上为Raspberry Pi 1设置交叉编译环境。 特别是我想尝试最新版本,即Raspbian测试+ Qt5开发分支。 这个问题: How can I create a modern
我想要从我的 Raspberry Pi Zero 到手机的低延迟流式传输。据我了解,移动浏览器不支持 RTMP 流式传输,HLS 流式传输具有高延迟,而 webRTC 是我最好的选择。 有谁知道从零开
我的公司使用 Raspberry Pi 3 作为产品中的嵌入式 Controller 。用户不会优雅地关闭它,他们只是扳动一个开关。为避免损坏,/boot 和/root 文件系统是只读的。这似乎是防弹
如何使用 Raspberry Pi 作为 b/w USB Tethered 手机和路由器的桥接器,使用“以太网电缆 b/w Raspberry Pi 和路由器”和“USB 电缆 b/w 手机和 Ras
我正在尝试在Raspberry Pi 3上安装Rakudo Star 2018.04。 我做: sudo perl Configure.pl --gen-moar --gen-nqp --prefix
我正在寻找一些可以有效完成的不错的 C 代码: while (deltaPhase >= M_PI) deltaPhase -= M_TWOPI; while (deltaPhase T Mod(T
我正在尝试为 raspberry Pi 构建跨环境以在 Eclipse CDT for windows 上构建二进制文件。 我得到了用于访问 GPIO 的 Wiring Pi,我需要使用“Window
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我正在寻找一些可以有效完成的不错的 C 代码: while (deltaPhase >= M_PI) deltaPhase -= M_TWOPI; while (deltaPhase T Mod(T
这个问题在这里已经有了答案: C: How to wrap a float to the interval [-pi, pi) (15 个答案) 关闭 9 年前。 我想知道是否可以定义一个只能取 -
我是一名优秀的程序员,十分优秀!