FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

入門モダンLinux読書メモ (1. 2章:Linuxカーネル)

読みながら、良く知らなかった項目をメモ。知らないことばっかりだ...

2. Linuxカーネル

2.1 Linuxアーキテクチャ

大きく、ハードウェア・カーネル・ユーザ空間に分類される。本書ではカーネル・ユーザ空間に焦点を当てる。カーネルとユーザ空間の間は、システムコールによって定義されている。

2.2 CPUアーキテクチャ

BIOSUEFIは、Linuxの起動時に使用するもの。モダンな環境では、BIOSUEFIに置き換わっている。

2.3 カーネルコンポーネント

  • プロセス管理:実行ファイルに基づくプロセスの起動

    • セッション:複数のプロセスグループを含む
    • プロセスグループ:複数のプロセスを含む
    • プロセス:プログラムの実行に必要なリソースをグループ化したもの
    • スレッド:カーネル内ではプロセスとして実装されている。カーネルから見ると、プロセスは他のプロセスと特定のリソース(メモリやシグナルハンドラなど)を共有するプロセスとなる。
    • タスク:task_struct(sched.h)というデータ構造により実現されている。
      $ ps -j
    
      プロセスID プロセスグループID セッションID
      PID    PGID     SID TTY          TIME CMD
      2656418 2656418 2656418 pts/18   00:00:00 bash
      2692868 2692868 2656418 pts/18   00:00:01 emacs
      2693310 2693310 2656418 pts/18   00:00:01 emacs
      2695194 2695194 2656418 pts/18   00:00:04 emacs
      2701144 2701144 2656418 pts/18   00:00:01 emacs
      2702971 2702971 2656418 pts/18   00:00:03 emacs
      2847412 2847412 2656418 pts/18   00:00:00 ps
    
  • メモリ管理:プロセスのメモリ割り当て、ファイルをメモリにマップすることなど

    • Hugepage:4KB以上のページテーブルをサポートする
      $ grep MemTotal /proc/meminfo
      MemTotal:       32595172 kB
      $ grep VmallocTotal /proc/meminfo
      VmallocTotal:   34359738367 kB
      $ grep Huge /proc/meminfo
      AnonHugePages:         0 kB
      ShmemHugePages:        0 kB
      FileHugePages:         0 kB
      HugePages_Total:       0
      HugePages_Free:        0
      HugePages_Rsvd:        0
      HugePages_Surp:        0
      Hugepagesize:       2048 kB
      Hugetlb:               0 kB
    
  • ネットワーク:ネットワークインタフェースの管理、ネットワークスタックの提供など

  • ファイルシステム:ファイル管理、ファイルの作成と削除など
  • デバイスドライバ:デバイスの管理
    • ハードウェアであったり、/dev/pts/以下に存在する疑似端末のようなデバイスを扱う
  • システムコール
    • glibc / muslなどの標準ライブラリによって提供されている
      • システムコールテーブル(syscall.h: sys_call_table)を使用する
      • system_call()関数により、コンテキストをスタックに保存し、システムコール番号が示す関数にジャンプする
      • sysexitによってシステムコールが終了すると、コンテキストを元に戻す
      $ strace ls
      execve("/usr/bin/ls", ["ls"], 0x7ffee3497670 /* 33 vars */) = 0
      brk(NULL)                               = 0x559d35cee000
      arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe3e02a440) = -1 EINVAL (Invalid argument)
      mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6b94462000
      access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
      openat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v3/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
      newfstatat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v3", 0x7ffe3e029660, 0) = -1 ENOENT (No such file or directory)
      openat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v2/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
      newfstatat(AT_FDCWD, "/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/lib/glibc-hwcaps/x86-64-v2", 0x7ffe3e029660, 0) = -1 ENOENT (No such file or directory)
      ...
    

2.4 カーネルの拡張

2.5 まとめ