0Pricing
Assembly Language & x86 Low-Level Systems Programming · レッスン

Linuxシステムコール(syscalls)

Linuxのシステムコールを使用して、ファイルI/O、プロセス管理、メモリ割り当てなど、一般的なオペレーティングシステムの操作を実行する方法を学びます。

「Linuxシステムコール(syscalls)」はCoddyKit上の無料Assembly Language & x86 Low-Level Systems Programmingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAssembly Language & x86 Low-Level Systems Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Assembly Language & x86 Low-Level Systems Programmingコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

What are System Calls?

Welcome! In this lesson, we'll dive into Linux System Calls (syscalls). These are the fundamental way user-space programs request services from the operating system's kernel.

Think of them as a special set of functions that your program can call to do powerful things, like interacting with files, managing processes, or allocating memory.

User vs. Kernel Mode

Modern operating systems operate in different privilege levels. Typically, there's user mode (where your applications run) and kernel mode (where the OS core runs).

  • User Mode: Limited access to hardware and critical memory.
  • Kernel Mode: Full access, handles system resources securely.

System calls are the controlled gateway for user-mode programs to temporarily switch to kernel mode and ask the OS to perform privileged operations on their behalf.

Invoking Syscalls in x86-64

On x86-64 Linux, system calls are primarily invoked using the syscall instruction. Before calling syscall, you load specific registers with values:

  • RAX: Holds the system call number.
  • RDI, RSI, RDX, R10, R8, R9: Hold the system call arguments (up to 6).
  • The return value is placed back in RAX.

Finding Syscall Numbers

How do you know which number corresponds to which system call? You can look them up!

  • Use the man syscalls command in your terminal.
  • Consult header files like /usr/include/asm/unistd_64.h.

For example, sys_write is system call number 1, and sys_exit is number 60.

Basic File I/O: sys_write

One of the most common syscalls is sys_write, used to write data to a file descriptor. Its parameters are:

  • RDI: File descriptor (e.g., 1 for stdout).
  • RSI: Pointer to the buffer containing data.
  • RDX: Number of bytes to write.

Standard file descriptors are 0 (stdin), 1 (stdout), and 2 (stderr).

Hello, Syscall! Example

Let's write a simple program that prints "Hello, Syscall!" to the console using sys_write and then exits using sys_exit.

Try running this example:

section .data
    msg db "Hello, Syscall!", 0xa ; Our string + newline
    len equ $ - msg             ; Length of our string

section .text
    global _start

_start:
    ; sys_write(fd=1, buf=msg, count=len)
    mov rax, 1      ; syscall number for sys_write
    mov rdi, 1      ; fd=1 (stdout)
    mov rsi, msg    ; buffer (our string)
    mov rdx, len    ; count (length of string)
    syscall         ; Invoke kernel

    ; sys_exit(status=0)
    mov rax, 60     ; syscall number for sys_exit
    mov rdi, 0      ; exit status 0
    syscall         ; Invoke kernel

Basic File I/O: sys_read

The counterpart to sys_write is sys_read, which reads data from a file descriptor into a buffer. Its parameters are:

  • RDI: File descriptor (e.g., 0 for stdin).
  • RSI: Pointer to the buffer to store data.
  • RDX: Maximum number of bytes to read.

sys_read returns the number of bytes actually read, or an error code.

Echoing Input Example

Here's a program that reads up to 256 bytes from standard input (stdin) and then writes whatever it read back to standard output (stdout).

Try running this example:

section .bss
    buffer resb 256 ; A buffer to store input

section .text
    global _start

_start:
    ; sys_read(fd=0, buf=buffer, count=256)
    mov rax, 0      ; syscall number for sys_read
    mov rdi, 0      ; fd=0 (stdin)
    mov rsi, buffer ; buffer to store input
    mov rdx, 256    ; max bytes to read
    syscall         ; Invoke kernel
    mov rbp, rax    ; Store bytes read in rbp

    ; sys_write(fd=1, buf=buffer, count=rbp)
    mov rax, 1      ; syscall number for sys_write
    mov rdi, 1      ; fd=1 (stdout)
    mov rsi, buffer ; buffer (our read input)
    mov rdx, rbp    ; count (actual bytes read)
    syscall         ; Invoke kernel

    ; sys_exit(status=0)
    mov rax, 60     ; syscall number for sys_exit
    mov rdi, 0      ; exit status 0
    syscall         ; Invoke kernel

Syscall Arguments Check

Let's quickly check your understanding of how arguments are passed for x86-64 Linux system calls.

Recap: Linux System Calls

You've learned the basics of Linux system calls!

  • Syscalls are how user programs request kernel services.
  • The syscall instruction (x86-64) initiates the call.
  • RAX holds the syscall number, and RDI-R9 hold arguments.
  • We explored sys_write (to stdout), sys_read (from stdin), and sys_exit.

Mastering syscalls is key to understanding low-level Linux programming and operating system interaction.

よくある質問

「Linuxシステムコール(syscalls)」レッスンは無料ですか?

はい。「Linuxシステムコール(syscalls)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Assembly Language & x86 Low-Level Systems Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Assembly Language & x86 Low-Level Systems Programmingコースには全4レッスンが含まれています。

「Linuxシステムコール(syscalls)」で何を学びますか?

Linuxのシステムコールを使用して、ファイルI/O、プロセス管理、メモリ割り当てなど、一般的なオペレーティングシステムの操作を実行する方法を学びます。 ブラウザで直接実行するハンズオンコードでAssembly Language & x86 Low-Level Systems Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Assembly Language & x86 Low-Level Systems Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAssembly Language & x86 Low-Level Systems Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Linuxシステムコール(syscalls)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAssembly Language & x86 Low-Level Systems Programmingレッスンでコードを書いて実行できますか?

はい。すべてのAssembly Language & x86 Low-Level Systems Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 仮想メモリの概念
  2. Linuxシステムコール(syscalls)
  3. Windows APIとの連携
  4. 動的メモリ:アセンブリでのヒープ確保
← Assembly Language & x86 Low-Level Systems Programmingに戻る