OS接口和系统调用

POSIX is a standard for UNIX OSes, especially its system calls

相当于是规范,人为定义的接口,跨平台编译友好性

libc: overview of standard C librries

  • POSIX APIs like getpid() + standard C functions like strcpy()
  • Apps do not directly invoke syscalls
  • glibc:GNU C library

If a software is written with only dependency to libc, it has good protability across OSes/hardware

下面是用两个例子来将系统调用

Process Management

子父进程唯一的不同点是fork()的返回值,子进程返回0,父进程返回子进程的PID

拷贝完后映射到不同的地址空间

有一个lazy_copy的技术,只有在写的时候才真正拷贝一份,通过地址翻译实现 COW(copy on write)

例题

第二题的做法

Input/Output

这个在后续fs会讲到

每个进程都有自己的进程描述符表

文件描述符的一个例子

  • Uniformity:open, close, read and write
  • Open before use
  • Byte-oriented
    • Even if blocks are transferred, addressing is in bytes
  • Kernel-buffered reads/writes
    • Streaming and block devices looks the same
    • Read blocks process, yielding process or to other task
    • Write does not block (even if it’s faster than device receiving data)
  • Explicit close
    • GC of unused kernel data structures

System Calls Design

为什么要拷贝

  • 安全性考虑,用户态的代码是可修改的,防止恶意以内核态权限执行恶意代码

会进行一些安全性检查

先拷贝再检查,而不能先检查再拷贝

信任内核代码,不能信任第三方代码

  • 从可信任的Bootloader开始boot
  • 有限的内核态接口:异常,中断,系统调用,只能从中断处理程序进入内核态
  • 内存的隔离