《深入理解Linux内核》笔记9 - 进程地址空间

线性地址空间的特征:

  • 进程的地址空间由允许进程使用的全部线性地址组成
  • 每个进程的线性地址空间是独立的
  • 内核通过线性区表示线性地址区间
  • 线性区由起始地址、长度和访问权限来描述
  • 线性区的长度和起始地址必须是4096的倍数(4K对齐)

进程获得新线性区的典型情况:

  • 创建新的进程,分配全新的地址空间
  • 正在运行的进程装入一个完全不同的程序(exec系列函数)
  • 正在运行的进程对一个文件执行内存映射(mmap)
  • 进程持续像用户态栈增加数据
  • 进程创建一个IPC共享线性区和其他进程共享内存
  • 进程通过malloc()之类的函数扩展动态内存区,最终是通过系统调用brk()mmap()进行内存分配的
阅读全文 →

《深入理解Linux内核》笔记3 - 中断和异常

中断和异常的区别:

同步中断(称为异常),由CPU控制单元产生,只有在执行某一条指令后才会触发异常。 异步中断,由外部硬件产生,如硬盘、网络等。 产生异常的原因以下两种:

程序错误,这种情况下内核通常发送信号进程。 需要内核处理的异常条件,如缺页、系统调用(intsysenter指令)。

阅读全文 →

《Linux内核设计与实现》笔记5 - 系统调用

Unix接口设计的格言:提供机制(mechanism)而不是策略(policy)。Unix系统调用抽象除了用于完成某种确定的目的的函数,至于这些函数怎么用完全不需要内核去关心。
阅读全文 →

《Linux内核设计与实现》笔记3 - 进程管理

进程是处于执行期的程序,在内核中通常称为任务task。进程描述符存放在内核的任务队列(task list)双向链表中,链表的每一项是一个task_struct结构体,每个task_struct在32位机器上大约占1.7KB内存。

// linux/sched.h
struct task_struct{
unsigned long state;
int prio;
unsigned long policy;
struct task_struct *parent;
struct list_head tasks;
pid_t pid;
// ...
}
阅读全文 →