摘自维基百科 维基百科
典型实现(Linux)
Linux 的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:
- 应用程序调用库函数(API);
- API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态;
- 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
- 系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数;
- 中断处理函数返回到 API 中;
- API 将 EAX 返回给应用程序。
应用程序调用系统调用的过程是:
- 把系统调用的编号存入 EAX;
- 把函数参数存入其它通用寄存器;
- 触发 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
网友评论