原理:
系统调用就是用户程序调用操作系统提供的函数,那么就需要从3特权级变化到0特权级。
仿照Linux中的系统调用,用中断的方式来实现特权级的变化,进而实现系统调用。
并不是一个系统调用就占用一个中断号,而是所有的系统调用都使用一个中断号,就是0x80 。通过eax的值来确定具体是哪个系统调用。
实现的步骤:
- 修改中断描述符表IDT,添加0x80号中断的描述符。
- 建立一个系统调用的子功能表syscall_table,根据eax中的子功能号去子功能表中索引具体的系统调用的处理函数。
增加文件syacall.c
#include "syscall.h"
/* 无参数的系统调用 */
#define _syscall0(NUMBER) ({ \
int retval; \
asm volatile ( \
"int $0x80" \
: "=a" (retval) \
: "a" (NUMBER) \
: "memory" \
); \
retval; \
})
/* 一个参数的系统调用 */
#define _syscall1(NUMBER, ARG1) ({ \
int retval; \
asm volatile ( \
"int $0x80" \
: "=a" (retval) \
: "a" (NUMBER), "b" (ARG1) \
: "memory"