相关疑难解决方法(0)

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么?

int 0x80在Linux上总是调用32位ABI,不管是什么模式,这就是所谓的:在args ebx,ecx...和系统调用号的/usr/include/asm/unistd_32.h.(或者在没有编译的64位内核上崩溃CONFIG_IA32_EMULATION).

64位代码应该使用syscall,从呼叫号码/usr/include/asm/unistd_64.h,并在args rdi,rsi等见什么调用约定UNIX和Linux系统上的i386和x86-64调用.如果您的问题被打上这样一个重复的,看你怎么说链接,细节应当使32位或64位代码的系统调用. 如果你想了解到底发生了什么,请继续阅读.


sys_write系统调用比syscall系统调用快,所以使用本机64位,int 0x80除非你正在编写多格式机器代码,当执行32或64位时运行相同的机器代码.(syscall始终以32位模式返回,因此它在64位用户空间中没有用,尽管它是有效的x86-64指令.)

相关:Linux系统的权威指南(在x86上)调用如何进行sysenterint 0x8032位系统调用,或sysenter64位系统调用,或调用vDSO进行"虚拟"系统调用syscall.加上有关系统调用的背景知识.


使用gettimeofday可以编写将以32位或64位模式组合的内容,因此它可以int 0x80在微基准测试结束时使用.

标准化函数和系统调用约定的官方i386和x86-64 System V psABI文档的当前PDF文件链接自https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI.

有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅标记wiki.


但是,由于人们不断发布与使用代码的问题exit_group()在64位代码,或不小心建立64位二进制文件从源代码对于32位写的,我不知道是什么确切不会对当前的Linux怎样呢?

是否int 0x80保存/恢复所有的64位寄存器?它会将任何寄存器截断为32位吗?如果传递上半部分非零的指针args会发生什么?

如果你传递32位指针它是否有效?

linux assembly x86-64 system-calls abi

36
推荐指数
1
解决办法
4783
查看次数

基本程序集在Mac上不起作用(x86_64 + Lion)?

这是代码(exit.s):

.section .data,
.section .text,
.globl _start
_start:
    movl $1, %eax
    movl $32, %ebx
    syscall
Run Code Online (Sandbox Code Playgroud)

当我执行 " as exit.s -o exit.o && ld exit.o -o exit -e _start && ./exit"

返回是"总线错误:10",输出" echo $?"是138

我也在这个问题中尝试了正确答案的例子:Linux 64位中的进程命令行

stil得到"总线错误"......

macos assembly x86-64 system-calls

5
推荐指数
1
解决办法
1411
查看次数

Linux内核systemcall调用"int 0x80"

我正在研究Linux内核,目前我尝试实现自己的系统调用.

在内核代码中,它看起来如下:

asmlinkage long sys_my_syscall()
{
     printk("My system call\n");
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我用systemcall()函数调用它可以正常工作,但我找到了另一种方法:

int my_syscall(void)
{
    long __res;
    __asm__ volatile (
    "movl $312, %%eax;"
    "int $0x80;"
    "movl %%eax, %0;"
    : "=m" (__res)
    :
    : "%eax"
    );
    if ((unsigned long) (__res) >= (unsigned long) (-125)) {
       errno = -(__res);
       __res = -1;
    }
    return (int)(__res);
}
Run Code Online (Sandbox Code Playgroud)

但它返回了价值-14 EFAULT.

我究竟做错了什么?

设置: Linux内核3.4,ARCH x86_64

c linux assembly system-calls linux-kernel

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

标签 统计

assembly ×3

system-calls ×3

linux ×2

x86-64 ×2

abi ×1

c ×1

linux-kernel ×1

macos ×1