《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
设备模型