读书笔记Linux内核设计与实现part 4

Chapter 15 进程地址空间

是否共享地址空间几乎是进程和Linux中的线程间本质上的唯一区别。同一进程的几个线程的tassk_struct中mm域指向同一个struct mm_struct。

 

内核线程的mm域为NULL(没有用户上下文)。

 

VMA

struct vm_area_struct;

 

VMA操作函数:

struct vm_area_struct* find_vma(struct vm_area_struct* mm, unsigned long addr);//search in RBTree

struct vm_area_struct* find_vma_prev(struct mm_struct* mm, unsigned long start, unsigned long end);

struct vm_area_struct* find_vma_intersection(struct mm_struct* mm, unsigned long start, unsigned long end);

 

创建地址空间:

mmap()和do_mmap()创建地址空间

unsigned long do_mmap(struct file* file, unsigned long addr,

struct long len,    unsinged long prot,

unsgined long flag, unsigned long offset);

 

int do_munmap(struct mm_struct* mm, unsigned long start, size_t len);

 

页表:

顶级页表是页全局目录(PGD),其下是PMT,再其下是PTE。

 

 

多数体系结构都实现了一个TLB(Translate Lookaside Buffer),硬件加速映射解析。

 

Chapter 16 页高速缓存和页回写

写缓存:不缓存(nowrite)、写透缓存(write-through cache)、回写(write-back)。

Linux采用回写策略。

Linux使用struct address_space来管理缓存项和IO操作,struct address_space与vm_area_struct是对等体,一个文件可以被映射到5进程的10个VMA中,但只有一个address_space。

 

flusher线程。

 

Chapter 17 设备与模块》

模块导出符号表:EXPORT_SYMBOL

设备模型

 

 

原文地址:https://www.cnblogs.com/apprentice89/p/2798741.html