美文网首页
使用汇编实现Linux系统调用

使用汇编实现Linux系统调用

作者: 霡霂976447044 | 来源:发表于2019-11-03 21:54 被阅读0次

    摘自维基百科 维基百科

    典型实现(Linux)

    Linux 的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:

    1. 应用程序调用库函数(API);
    2. API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态;
    3. 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
    4. 系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数;
    5. 中断处理函数返回到 API 中;
    6. API 将 EAX 返回给应用程序。

    应用程序调用系统调用的过程是:

    1. 把系统调用的编号存入 EAX;
    2. 把函数参数存入其它通用寄存器;
    3. 触发 0x80 号中断(int 0x80)。

    NASM 汇编实现

    apt install nasm
    
    ; Hello World Program - asmtutor.com
    ; Compile with: nasm -f elf helloworld.asm
    ; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld.o -o helloworld
    ; Run with: ./helloworld
     
    SECTION .data
    msg     db      'Hello',10  ;0x10代表换行LF
     
    SECTION .text
    global  _start
     
    _start:
     
        mov     edx, 6  ;字符串长度
        mov     ecx, msg ; 赋值
        mov     bx, 1 ; STDOUT
        mov     ax, 4 ; syscall SYS_WRITE
        int     80h
     
        mov     bx, 0      ; return 0 status on exit - 'No Errors'
        mov     ax, 1      ; invoke SYS_EXIT (kernel opcode 1)
        int     80h
    

    64位的寄存器叫RAX,32位叫EAX(32位cpu),AX是EAX的低16位(8086cpu)。
    首先我们把系统调用write所需要的三个参数写得到edx,ecx,ebx
    然后把eax赋值为系统调用对应的编号,再触发0x80的系统调用中断就可以实现系统调用。
    Linux syscall reference

    相关文章

      网友评论

          本文标题:使用汇编实现Linux系统调用

          本文链接:https://www.haomeiwen.com/subject/arilbctx.html