【问题标题】:Writing a System Calls for linux为 linux 编写系统调用
【发布时间】:2010-12-15 12:43:48
【问题描述】:

我尝试编写一个系统调用。我按照以下步骤操作:

linux/arch/x86/kernel/syscall_table_32.S ----> 。 long sys mycall

linux/include/linux/syscalls.h --------> asmlinkage int sys mycall (int i , int j );

linux/arch/x86/include/asm/unistd_32.h ----> #define NR mycall 333

我把linux/Makefile改成core-y += kernel/mm/fs/ipc/security/crypto/block/mycall/

我创建了一个名为 mycall 的目录。 ---->linux/mycall

在该文件中,我放置了 mycall.c :

#include <linux/kernel.h>
asmlinkageintsysmcall(int i,int j )
{
return i + j ;
}

6)我创建 Makefile。 ---> linux/mycall/Makefile.

obj−y := mycall.o

然后当我尝试这个系统调用时,它总是返回-1。这些行是我在 Desktop 中的测试代码。 testmycall.c

#include <stdio.h>
#include <sys/syscall.h>
#define __NR_mycall 333

int main(void)
{
int x1=10, x2=20, y ;
y = syscall (__NR_mycall, x1, x2 );
printf (”%d\n”,y );
return 0 ;
}

然后我重新编译内核。如果我编译代码,没有任何问题。当我运行这个程序时,它不会将两个值相加。它总是返回-1。我的系统调用有什么问题? (当我重新编译内核时,系统没有浪费超过3秒的时间。我认为这里可能有问题)

【问题讨论】:

    标签: linux kernel system-calls


    【解决方案1】:

    重新编译内核并重启。还是内核模块?

    【讨论】:

    • IMO,内核模块不应该 /really/ 用于添加系统调用功能;可能会发生太多糟糕的巫术。 (另外,如果出现问题,他们是一个调试者!)
    • 我只是在写一个系统调用。我需要重新编译内核吗?
    • 重新编译系统后,还要安装吗? (sudo dpkg -i linux-image-2.6.28.10-custom ....deb)
    • 您通常将编译好的内核复制到一个目录,然后使用引导管理器让您选择新构建的内核。一旦内核启动并记录下来,您就可以运行您的测试程序。无需重新安装。
    • 我按照你的评论试过了。但它不起作用。我只是在完成 2 秒后写了“make -kpkg clean”。然后“fakeroot make-kpkg -initrd -append-to-version=-custom kernel_image kernel_headers”这条线可能工作了 10 秒。我想,我必须等待超过 10 分钟。好像有问题。你能给我一些建议吗?
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2012-05-06
    • 2013-07-19
    • 2012-09-15
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多