Mr Dk.'s BlogMr Dk.'s Blog
  • 🦆 About Me
  • ⛏️ Technology Stack
  • 🔗 Links
  • 🗒️ About Blog
  • Algorithm
  • C++
  • Compiler
  • Cryptography
  • DevOps
  • Docker
  • Git
  • Java
  • Linux
  • MS Office
  • MySQL
  • Network
  • Operating System
  • Performance
  • PostgreSQL
  • Productivity
  • Solidity
  • Vue.js
  • Web
  • Wireless
  • 🐧 How Linux Works (notes)
  • 🐧 Linux Kernel Comments (notes)
  • 🐧 Linux Kernel Development (notes)
  • 🐤 μc/OS-II Source Code (notes)
  • ☕ Understanding the JVM (notes)
  • ⛸️ Redis Implementation (notes)
  • 🗜️ Understanding Nginx (notes)
  • ⚙️ Netty in Action (notes)
  • ☁️ Spring Microservices (notes)
  • ⚒️ The Annotated STL Sources (notes)
  • ☕ Java Development Kit 8
GitHub
  • 🦆 About Me
  • ⛏️ Technology Stack
  • 🔗 Links
  • 🗒️ About Blog
  • Algorithm
  • C++
  • Compiler
  • Cryptography
  • DevOps
  • Docker
  • Git
  • Java
  • Linux
  • MS Office
  • MySQL
  • Network
  • Operating System
  • Performance
  • PostgreSQL
  • Productivity
  • Solidity
  • Vue.js
  • Web
  • Wireless
  • 🐧 How Linux Works (notes)
  • 🐧 Linux Kernel Comments (notes)
  • 🐧 Linux Kernel Development (notes)
  • 🐤 μc/OS-II Source Code (notes)
  • ☕ Understanding the JVM (notes)
  • ⛸️ Redis Implementation (notes)
  • 🗜️ Understanding Nginx (notes)
  • ⚙️ Netty in Action (notes)
  • ☁️ Spring Microservices (notes)
  • ⚒️ The Annotated STL Sources (notes)
  • ☕ Java Development Kit 8
GitHub
  • 🐧 Linux Kernel Comments
    • Chapter 2 - 微型计算机组成结构

      • Chapter 2 - 微型计算机组成结构
    • Chapter 3 - 内核编程语言和环境

      • Chapter 3 - 内核编程语言和环境
    • Chapter 4 - 80X86 保护模式及其编程

      • Chapter 4.1-4.2 - 80X86 系统寄存器和系统指令 & 保护模式内存管理
      • Chapter 4.3 - 分段机制
      • Chapter 4.4 - 分页机制
      • Chapter 4.5 - 保护
      • Chapter 4.6 - 中断和异常处理
      • Chapter 4.7 - 任务管理
      • Chapter 4.8 - 保护模式编程初始化
      • Chapter 4.9 - 一个简单的多任务内核实例
    • Chapter 5 - Linux 内核体系结构

      • Chapter 5.1-5.2 - Linux 内核模式 & 体系结构
      • Chapter 5.3 - Linux 内核对内存的管理和使用
      • Chapter 5.4-5.6 - 中断机制 & 系统调用 & 系统时间和定时
      • Chapter 5.7-5.9 - Linux 进程控制 & 堆栈使用 & 文件系统
    • Chapter 6 - 引导启动程序 (boot)

      • Chapter 6 - 引导启动程序 (boot)
    • Chapter 7 - 初始化程序 (init)

      • Chapter 7 - 初始化程序 (init)
    • Chapter 8 - 内核代码

      • Chapter 8.1 - 内核代码总体功能
      • Chapter 8.2 - asm.s 程序
      • Chapter 8.3 - traps.c 程序
      • Chapter 8.4 - sys_call.s 程序
      • Chapter 8.5 - mktime.c 程序
      • Chapter 8.6 - sched.c 程序
      • Chapter 8.7 - signal.c 程序
      • Chapter 8.8 - exit.c 程序
      • Chapter 8.9 - fork.c 程序
      • Chapter 8.10 - sys.c 程序
    • Chapter 9 - 块设备驱动程序

      • Chapter 9.1 - 块设备驱动程序 总体功能
      • Chapter 9.2 - blk.h 文件
      • Chapter 9.3 - hd.c 程序
      • Chapter 9.4 - ll_rw_blk.c 程序
      • Chapter 9.5 - ramdisk.c 程序
    • Chapter 10 - 字符设备驱动程序

      • Chapter 10.1 - 字符设备驱动程序 总体功能
      • Chapter 10.2 - keyboard.S 程序
      • Chapter 10.3 - console.c 程序
      • Chapter 10.4 - serial.c 程序
      • Chapter 10.5 - rs_io.s 程序
      • Chapter 10.6 - tty_io.c 程序
      • Chapter 10.7 - tty_ioctl.c 程序
    • Chapter 12 - 文件系统

      • Chapter 12.1 - 文件系统 总体功能
      • Chapter 12.2 - buffer.c 程序
      • Chapter 12.3 - bitmap.c 程序
      • Chapter 12.4 - truncate.c 程序
      • Chapter 12.5 - inode.c 程序
      • Chapter 12.6 - super.c 程序
      • Chapter 12.7 - namei.c 程序
      • Chapter 12.9 - block_dev.c 程序
      • Chapter 12.10 - file_dev.c 程序
      • Chapter 12.11 - pipe.c 程序
      • Chapter 12.12 - char_dev.c 程序
      • Chapter 12.13 - read_write.c 程序
      • Chapter 12.14 - open.c 程序
      • Chapter 12.15 - exec.c 程序
      • Chapter 12.16 - stat.c 程序
      • Chapter 12.17 - fcntl.c 程序
      • Chapter 12.18 - ioctl.c 程序
      • Chapter 12.19 - select.c 程序

Chapter 8.1 - 内核代码总体功能

Created by : Mr Dk.

2019 / 08 / 14 19:46

Ningbo, Zhejiang, China


linux/kernel/

  • blk_drv/
  • chr_drv/
  • math/
  • Makefile
  • asm.s
  • exit.c
  • fork.c
  • mktime.c
  • panic.c
  • printk.c
  • sched.c
  • signal.c
  • sys.c
  • sys_call.c
  • traps.c
  • vsprintf.c

8.1 总体功能

总体上分为三类:

  • 硬件 (异常) 中断处理程序
  • 系统调用服务处理程序
  • 进程调度等通用功能

最喜欢的是这张调用关系图,太 tm 合我的口味了 😆

8-1

8.1.1 中断处理程序

  • asm.s,实现大部分硬件异常所引起的中断服务过程的汇编部分
  • traps.c,实现 asm.s 中断处理过程中的 C 函数部分

另外有几个硬件中断处理程序在别的地方实现。

在 Linux 系统中,中断服务功能由内核提供。中断处理过程使用进程的 内核态堆栈。涉及到优先级变化时,CPU 会将被中断代码段的 堆栈段值 SS 和 堆栈指针 ESP 压入中断处理程序的堆栈中,之后还需要在内核态堆栈上压入 EFLAGS 和返回地址 CS、EIP。

  • 被中断代码段的堆栈,即进程的用户态堆栈
  • 中断处理程序的堆栈,即进程的内核态堆栈

asm.s 代码主要对 Intel 的保留中断 INT 0 - INT 16 做处理,INT 17 - INT 31 由 Intel 公司留作今后使用。8259A 上发出的 INT 32 - INT 47 分别在各种硬件的初始化程序中设置和处理。Linux 系统调用中断 INT 128 的服务程序则在 kernel/sys_call.s 中。某些异常引起中断时,CPU 内部会产生一个出错码,压入堆栈,因此 asm.s 根据是否携带出错码分为两类分别进行处理,但处理过程相同,如下图:

8-3

8.1.2 系统调用处理相关程序

Linux 应用程序使用系统资源时需要利用中断 INT 0x80 进行,并需要在寄存器 EAX 中放入调用号。如果需要传递参数,则可以通过 EBX、ECX、EDX。sys_call.s 程序的作用类似于 asm.s 的作用,提供系统调用处理过程的入口汇编程序。其它几个 C 文件则提供了中断调用的 C 处理函数。

8.1.3 其它通用类程序

  • schedule.c - 内核的核心调度程序
  • mktime.c - 仅包含一个内核使用的时间函数
  • panic.c - 包含一个 panic() 函数,用于在内核运行出现错误时显示错误并停机
  • printk.c 和 vsprintf.c - 内核显示信息的支持程序
Edit this page on GitHub
Next
Chapter 8.2 - asm.s 程序