Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

System call

From Wikipedia, the free encyclopedia
(Redirected fromSystem calls)
Way for programs to access kernel services
Not to be confused withSystem command.

A high-level overview of the Linux kernel's system call interface, which handles communication between its various components and theuserspace

In computing, asystem call (commonly abbreviated tosyscall) is the programmatic way in which acomputer program requests a service from theoperating system[a] on which it is executed. This may include hardware-related services (for example, accessing ahard disk drive or accessing the device's camera), creation and execution of newprocesses, and communication with integralkernel services such asprocess scheduling. System calls provide an essential interface between a process and the operating system.

In most systems, system calls can only be made fromuserspace processes, while in some systems,OS/360 and successors for example, privileged system code also issues system calls.[1]

Forembedded systems, system calls typically do not change theprivilege mode of the CPU.

Privileges

[edit]

Thearchitecture of most modern processors, with the exception of some embedded systems, involves asecurity model. For example, therings model specifies multiple privilege levels under which software may be executed: a program is usually limited to its ownaddress space so that it cannot access or modify other running programs or the operating system itself, and is usually prevented from directly manipulating hardware devices (e.g. theframe buffer ornetwork devices).

However, many applications need access to these components, so system calls are made available by the operating system to provide well-defined, safe implementations for such operations. The operating system executes at the highest level of privilege, and allows applications to request services via system calls, which are often initiated viainterrupts. An interrupt automatically puts the CPU into some elevated privilege level and then passes control to the kernel, which determines whether the calling program should be granted the requested service. If the service is granted, the kernel executes a specific set of instructions over which the calling program has no direct control, returns the privilege level to that of the calling program, and then returns control to the calling program.

The library as an intermediary

[edit]

Generally, systems provide alibrary orAPI that sits between normal programs and the operating system. OnUnix-like systems, that API is usually part of an implementation of theC library (libc), such asglibc, that provideswrapper functions for the system calls, often named the same as the system calls they invoke. OnWindows NT, that API is part of theNative API, in thentdll.dll library; this is an undocumented API used by implementations of the regularWindows API and directly used by some system programs on Windows. The library's wrapper functions expose an ordinary functioncalling convention (asubroutine call on theassembly level) for using the system call, as well as making the system call moremodular. Here, the primary function of the wrapper is to place all the arguments to be passed to the system call in the appropriateprocessor registers (and maybe on thecall stack as well), and also setting a unique system call number for the kernel to call. In this way the library, which exists between the OS and the application, increasesportability.

The call to the library function itself does not cause a switch tokernel mode and is usually a normalsubroutine call (using, for example, a "CALL" assembly instruction in someInstruction set architectures (ISAs)). The actual system call does transfer control to the kernel (and is more implementation-dependent and platform-dependent than the library call abstracting it). For example, inUnix-like systems,fork andexecve are C library functions that in turn execute instructions that invoke thefork andexec system calls. Making the system call directly in theapplication code is more complicated and may require embedded assembly code to be used (inC andC++), as well as requiring knowledge of the low-level binary interface for the system call operation, which may be subject to change over time and thus not be part of theapplication binary interface; the library functions are meant to abstract this away.

Onexokernel based systems, the library is especially important as an intermediary. On exokernels, libraries shield user applications from the very low level kernelAPI, and provideabstractions andresource management.

IBM'sOS/360,DOS/360 andTSS/360 implement most system calls through a library of assembly languagemacros,[b] although there are a few services with a call linkage. This reflects their origin at a time when programming in assembly language was more common thanhigh-level language usage. IBM system calls were therefore not directly executable by high-level language programs, but required a callable assembly language wrapper subroutine. Since then, IBM has added many services that can be called from high level languages in, e.g.,z/OS andz/VSE. In more recent release ofMVS/SP and in all later MVS versions, some system call macros generate Program Call (PC).

Examples and tools

[edit]

OnUnix,Unix-like and otherPOSIX-compliant operating systems, popular system calls areopen,read,write,close,wait,exec,fork,exit, andkill. Many modern operating systems have hundreds of system calls. For example,Linux andOpenBSD each have over 300 different calls,[2][3]NetBSD has close to 500,[4]FreeBSD has over 500,[5] Windows has close to 2000, divided between win32k (graphical) and ntdll (core) system calls[6] whilePlan 9 has 54.[7]

Tools such asstrace,ftrace andtruss allow a process to execute from start and report all system calls the process invokes, or can attach to an already running process and intercept any system call made by the said process if the operation does not violate the permissions of the user. This special ability of the program is usually also implemented with system calls such asptrace or system calls on files inprocfs.

Typical implementations

[edit]

Implementing system calls requires a transfer of control from user space to kernel space, which involves some sort of architecture-specific feature. A typical way to implement this is to use asoftware interrupt ortrap. Interrupts transfer control to the operating systemkernel, so software simply needs to set up some register with the system call number needed, and execute the software interrupt.

This is the only technique provided for manyRISC processors, butCISC architectures such asx86 support additional techniques. For example, the x86instruction set contains the instructionsSYSCALL/SYSRET andSYSENTER/SYSEXIT (these two mechanisms were independently created byAMD andIntel, respectively, but in essence they do the same thing). These are "fast" control transfer instructions that are designed to quickly transfer control to the kernel for a system call without the overhead of an interrupt.[8]Linux 2.5 began using this on thex86, where available; formerly it used theINT instruction, where the system call number was placed in theEAXregister beforeinterrupt 0x80 was executed.[9][10]

An older mechanism is thecall gate; originally used inMultics and later, for example, seecall gate on the Intelx86. It allows a program to call a kernel function directly using a safe control transfer mechanism, which the operating system sets up in advance. This approach has been unpopular on x86, presumably due to the requirement of a far call (a call to a procedure located in a different segment than the current code segment[11]) which usesx86 memory segmentation and the resulting lack ofportability it causes, and the existence of the faster instructions mentioned above.

ForIA-64 architecture,EPC (Enter Privileged Code) instruction is used. The first eight system call arguments are passed in registers, and the rest are passed on the stack.

In theIBM System/360 mainframe family, and its successors, aSupervisor Call instruction (SVC), with the number in the instruction rather than in a register, implements a system call for legacy facilities in most of[c] IBM's own operating systems, and for all system calls in Linux. In later versions of MVS, IBM uses the Program Call (PC) instruction for many newer facilities. In particular, PC is used when the caller might be inService Request Block (SRB) mode.

ThePDP-11minicomputer used theEMT,TRAP andIOT instructions, which, similar to the IBM System/360SVC and x86INT, put the code in the instruction; they generate interrupts to specific addresses, transferring control to the operating system. TheVAX 32-bit successor to the PDP-11 series used theCHMK,CHME, andCHMS instructions to make system calls to privileged code at various levels; the code is an argument to the instruction.

Categories of system calls

[edit]

System calls can be grouped roughly into six major categories:[12]

  1. Process control
  2. File management
    • create file, delete file
    • open, close
    • read, write, reposition
    • get/set file attributes
  3. Device management
    • request device, release device
    • read, write, reposition
    • get/set device attributes
    • logically attach or detach devices
  4. Information maintenance
    • get/set total system information (including time, date, computer name, enterprise etc.)
    • get/set process, file, or device metadata (including author, opener, creation time and date, etc.)
  5. Communication
    • create, delete communication connection
    • send, receive messages
    • transfer status information
    • attach or detach remote devices
  6. Protection
    • get/set file permissions

Processor mode and context switching

[edit]

System calls in mostUnix-like systems are processed inkernel mode, which is accomplished by changing the processor execution mode to a more privileged one, but noprocesscontext switch is necessary – although aprivilege context switch does occur. The hardware sees the world in terms of the execution mode according to the processorstatus register, and processes are an abstraction provided by the operating system. A system call does not generally require a context switch to another process; instead, it is processed in the context of whichever process invoked it.[13][14]

In amultithreaded process, system calls can be made from multiplethreads. The handling of such calls is dependent on the design of the specific operating system kernel and the application runtime environment. The following list shows typical models followed by operating systems:[15][16]

  • Many-to-one model: All system calls from any user thread in a process are handled by a single kernel-level thread. This model has a serious drawback – any blocking system call (like awaiting input from the user) can freeze all the other threads. Also, since only one thread can access the kernel at a time, this model cannot utilize multiple cores of processors.
  • One-to-one model: Every user thread gets attached to a distinct kernel-level thread during a system call. This model solves the above problem of blocking system calls. It is found in all majorLinux distributions,macOS,iOS, recentWindows andSolaris versions.
  • Many-to-many model: In this model, a pool of user threads is mapped to a pool of kernel threads. All system calls from a user thread pool are handled by the threads in their corresponding kernelthread pool.
  • Hybrid model: This model implements both many to many and one to one models depending upon the choice made by the kernel. This is found in old versions ofIRIX,HP-UX andSolaris.

See also

[edit]

Notes

[edit]
  1. ^InUNIX-like operating systems, system calls are used only for thekernel
  2. ^In many but not all cases, IBM documented, e.g., the SVC number, the parameter registers.
  3. ^The CP components ofCP-67 andVM use the Diagnose (DIAG) instruction as a Hypervisor CALL (HVC) from a virtual machine to CP.

References

[edit]
  1. ^IBM (March 1967). "Writing SVC Routines".IBM System/360 Operating System System Programmer's Guide(PDF). Third Edition. pp. 32–36. C28-6550-2.
  2. ^"syscalls(2) - Linux manual page".
  3. ^OpenBSD (14 September 2013)."System call names (kern/syscalls.c)".BSD Cross Reference.
  4. ^NetBSD (17 October 2013)."System call names (kern/syscalls.c)".BSD Cross Reference.
  5. ^"FreeBSD syscalls.c, the list of syscall names and IDs".
  6. ^Mateusz "j00ru" Jurczyk (5 November 2017)."Windows WIN32K.SYS System Call Table (NT/2000/XP/2003/Vista/2008/7/8/10)".{{cite web}}: CS1 maint: numeric names: authors list (link)
  7. ^"sys.h".Plan 9 from Bell Labs.Archived from the original on 8 September 2023, the list of syscall names and IDs.
  8. ^"SYSENTER".OSDev wiki.Archived from the original on 8 November 2023.
  9. ^Anonymous (19 December 2002)."Linux 2.5 gets vsyscalls, sysenter support".KernelTrap. Retrieved1 January 2008.
  10. ^Manu Garg (2006)."Sysenter Based System Call Mechanism in Linux 2.6".
  11. ^"Liberation: x86 Instruction Set Reference".renejeschke.de. Retrieved4 July 2015.
  12. ^Silberschatz, Abraham (2018).Operating System Concepts. Peter B Galvin; Greg Gagne (10th ed.). Hoboken, NJ: Wiley. p. 67.ISBN 9781119320913.OCLC 1004849022.
  13. ^Bach, Maurice J. (1986),The Design of the UNIX Operating System, Prentice Hall, pp. 15–16.
  14. ^Elliot, John (2011)."Discussion of system call implementation at ProgClub including quote from Bach 1986". Archived fromthe original on 24 July 2012. Retrieved1 October 2011.
  15. ^"Threads".
  16. ^"Threading Models"(PDF).

External links

[edit]
Parts,
conventions
Related topics
Retrieved from "https://en.wikipedia.org/w/index.php?title=System_call&oldid=1281642487"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp