相关疑难解决方法(0)

如何从用户空间访问系统调用?

我读了LKD 1中的一些段落, 我无法理解下面的内容:

从用户空间访问系统调用

通常,C库提供对系统调用的支持.用户应用程序可以从标准头中提取函数原型并与C库链接以使用您的系统调用(或者库例程,而该库例程又使用您的系统调用).但是,如果您刚刚编写了系统调用,那么glibc已经支持它是值得怀疑的!

值得庆幸的是,Linux提供了一组用于包装系统调用访问的宏.它设置寄存器内容并发出陷阱指令.这些宏被命名,其中介于0和6之间.该数字对应于传递给系统调用的参数数量,因为宏需要知道预期的参数数量,从而推入寄存器.例如,考虑系统调用,定义为_syscalln()nopen()

long open(const char *filename, int flags, int mode)
Run Code Online (Sandbox Code Playgroud)

在没有显式库支持的情况下使用此系统调用的syscall宏将是

#define __NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode)
Run Code Online (Sandbox Code Playgroud)

然后,应用程序可以简单地调用open().

对于每个宏,有2 + 2×n个参数.第一个参数对应于系统调用的返回类型.第二个是系统调用的名称.接下来是系统调用顺序的每个参数的类型和名称.的__NR_open定义是在<asm/unistd.h>; 它是系统呼叫号码.的_syscall3宏扩展到与联汇编C函数; 程序集执行上一节中讨论的步骤,将系统调用号和参数推送到正确的寄存器中,并发出软件中断以陷入内核.将此宏放在应用程序中是使用open()系统调用所需的全部内容.

让我们编写宏来使用我们精彩的新foo()系统调用,然后编写一些测试代码来展示我们的努力.

#define __NR_foo 283
__syscall0(long, foo)

int main ()
{
        long stack_size;

        stack_size = foo ();
        printf ("The kernel stack size is %ld\n", stack_size);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

是什么 …

linux system-calls

17
推荐指数
2
解决办法
2万
查看次数

如何在debian/ubuntu上编写系统调用

我正在尝试编写自己的系统调用.它只会返回当前时间.我知道应该做什么的概念,我确实经历过以下几个链接:

但我仍然感到困惑,并没有得到预期的结果.内核没有编译,并且由于问题导致崩溃.我在debian最新稳定版3.XX上尝试过它

有人能指出我hello world开发一个干净的程序来开发系统调用吗?

编辑

到了下面的答案,这里是我的问题:

  1. File 3: linux-x.x.x/arch/x86/kernel/syscall_table_32.S在我的linux文件夹中找不到.我不得不即兴创作并修改了以下文件:linux-x.x.x/arch/x86/syscalls/syscall_64.tbl

  2. 上面提到的(1)新文件有不同的模式,<number> <64/x32/common> <name> <entry point>我的条目是`313常见

  3. 内核映像已成功编译,但我无法调用该函数.它给undefined reference" error我一个用gcc编译的时候.为什么?

c ubuntu debian recovery linux-kernel

3
推荐指数
1
解决办法
8250
查看次数

非C语言如何与操作系统交互?

在linux上,例如,我们可以使用OS提供的api(打开/关闭/读/写)直接进行系统调用,也可以使用C语言中的libc提供的功能(fopen等)。

用其他语言如何实现?

operating-system programming-languages system-calls

2
推荐指数
2
解决办法
727
查看次数