Linux内核源码解析 | system call part 1

system call part 1

1. 摘要

  • system call 章节主要内容简介
  • System call. What is it?
  • Implementation ofwrite system call

2. system call` 章节主要内容简介

在本章节,我们将看到与系统调用相关的许多不同方面的概念。
例如:

  • what’s happening when a system call occurs from userspace
  • Linux内核中几个系统调用处理程序的实现
  • VDSOvsyscall 等等概念

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值