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

线性地址空间的特征:

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

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

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

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

中断和异常的区别:

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

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

阅读全文 →

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

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

[翻译]GNU C malloc实现原理

原文:https://sourceware.org/glibc/wiki/MallocInternals

Malloc概述

GNU C语言库(glibc)的malloc库包含一些管理应用程序地址空间中分配的内存的函数。glibc的malloc源于ptmalloc(pthreads malloc),而ptmalloc又源于dlmalloc(Doug Lea malloc)。这个malloc是一个 “堆 (heap)“式的malloc,这意味着不同尺寸的chunk(chunks)存在于一个更大的内存区域(“堆”)中,而不是像其他的实现那样,例如使用位图(bitmaps)和数组(arrays),或者相同尺寸的chunk(blocks),等等。在以前,每个应用程序只有一个堆,但glibc的malloc允许多个堆,每个堆都在它自己的地址空间内增长。

阅读全文 →

Linux性能分析

  • sar
  • top
  • uptime
  • dmesg
  • vmstat
  • mpstat
  • pidstat
  • iostat
  • free
阅读全文 →

《Linux内核设计与实现》笔记4 - 进程调度

《Linux内核设计与实现》笔记4 - 进程调度

多任务系统分为2类:

  • 非抢占式多任务系统,需要进程主动让出(yield)系统资源
  • 抢占式多任务系统,如Linux,调度程序决定何时停止运行某个进程
阅读全文 →

编译Linux内核

目前最新内核版本为v5.16,可以从Github下载
阅读全文 →

《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;
// ...
}
阅读全文 →

《Linux内核设计与实现》笔记2 - 从内核出发

内核开发的特点

  • 不能访问C函数库,不能访问标准C头文件
  • 必须使用GNU C
  • 没有用户空间的内存保护机制
  • 难以执行浮点运算
  • 内核给每个进程只有很小的栈,通常是8KB
  • 内核支持异步中断、抢占、SMP,必须注意同步和并发
  • 需要考虑可移植性
阅读全文 →

《Linux内核设计与实现》笔记1 - 介绍

原书:Linux Kernel Development 3rd. Edition,书名也可以翻译为《Linux内核开发》,书中描述的是2.6.34版内核。
阅读全文 →

Linux内核架构

Linux内核架构
Interactive Linux kernel map
阅读全文 →