Linux 0.11 源码阅读笔记-内核代码

总览

内核代码

kernel-function

硬件中断程序

处理系统硬件中断. 多为故障处理, 直接打印出堆栈信息帮助排错.

系统调用程序

本质是调用中断 int 0x80. 由于是用户发起的, 也称之为软中断.

  • system_call.s 会根据 sys_call_table[] (在sys.h内) 去调用相应的C函数. sys_xxx函数则很分散.
  • signal.c 用于处理内核的信号. (signal()可能丢失信号, sigaction()更可靠)

信号处理程序的调用方式
signal

调度程序

linux 0.11的调度思路结合时间片优先权调度.

调用fork创建新进程
fork-function

  • 调度过程: count大, 就优先调度! 计算公式为: count = counter/2 + priotiry.
    对于以及运行完成的任务, count 直接为 priotiry
    对于被阻塞的任务, 由于公式内包含有 count/2 的权重, 即使优先级再低, 也会被照顾到.
  • switch_to() 一段汇编宏定义, 用于切换到指定任务(加载TSS).
  • schedule() 调度函数, 每10ms判断各任务的信号位图以及比较counter值. 需要切换任务时, 调用 switch_to(next)
  • do_timer() 在 system_call.s 中 _timer_interrupt 被调用, 每10ms调用一次 schedule()
  • sleep_on() 当进程所请求的资源暂时不可用时, 等待一段时间. 等切换回来后再继续运行. 调用 schedule()
  • wake_up() 把正在等待可用资源的指定任务值为就绪状态, 就如字面意义, 是一个唤醒函数. 但实现比较搞脑子!

参考


原创于 DRA&PHO