system call part 1
1. 摘要
system call
章节主要内容简介System call.
What is it?- Implementation of
write system call
2. system call` 章节主要内容简介
在本章节,我们将看到与系统调用相关的许多不同方面的概念。
例如:
- what’s happening when a system call occurs from userspace
- Linux内核中几个
系统调用处理程序
的实现 VDSO
和vsyscall
等等概念
3. System call. What is it?
3.1 system call 定义
-
系统调用内核提供的可供
userspcae
程序调用的服务 -
换句话说,系统调用是userspace 程序调用内核空间 函数,用户空间程序调用该C内核空间函数来处理某些请求。
Linux内核提供了系统调用功能的集合,每种体系结构都提供了自己的集合。例如 x86_64 提供322 system calls , x86 提供358 different system calls
3,2 一个调用 system call
的 汇编小程序
3.2.1 代码 以及 如何运行该程序
//.data stores initialized data of our program (Hello world string and its length in our case).
.data
msg:
.ascii "Hello, world!\n"
len = . - msg
//.text contains the code of our program.
.text
.global _start
_start:
movq $1, %rax //first part
movq $1, %rdi
movq $msg, %rsi
movq $len, %rdx
syscall
movq $60, %rax //secont part
xorq %rdi, %rdi
syscall
我们可以使用以下命令编译以上内容:
$ gcc -c test.S
$ ld -o test test.o
使用下列命令运行该程序
./test
Hello, world!
3.2.2 代码解释
对于代码段 .text
我们可以分为以下三个部分
- 第一部分是在第一条系统调用指令
syscall
之前的代码 - 第二部分将在第一和第二个系统调用指令
syscall
之间的代码 - 第三部分为第二个系统调用指令
syscall
之后的代码
3.2.2.1 syscall
指令的含义
syscall指令跳转到存储在 MSR_LSTAR
Model specific register(Long system target address register)中的地址,即 entry_SYSCALL_64
function 处。内核负责提供一个自定义的函数来处理所有系统调用,并在系统启动时将此处理函数的地址写入MSR_LSTAR
寄存器. 该自定义函数负责判定system call
的类型,以及呼叫特定的 system call handler function
.
在Linux 中 ,该自定义函数是entry_SYSCALL_64
,它在arch / x86 / entry / entry_64.S中定义。在启动过程中,此syscall
处理函数entry_SYSCALL_64
的地址将在 arch / x86 / kernel / cpu / common.c中写入MSR_LSTAR
寄存器。
wrmsrl(MSR_LSTAR, entry_SYSCALL_64);
SYSCALL invokes an OS system-call handler at privilege level 0. It does so by
loading RIP from the IA32_LSTAR MSR (after saving the address of the instruction
following SYSCALL into RCX). (The WRMSR instruction ensures that the
IA32_LSTAR MSR always contain a canonical address.)
SYSCALL load