美文网首页
使用汇编实现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