该篇笔记,主要是来自刘超老师的《趣谈Linux操作系统》,主要用于学习记录,便于以后查找之用,在此感谢老师的辛苦付出,如有侵权,立马删除
##1.Linux内核体系结构图
##2.Linux命令行图
##3.Linux系统调用
##4.计算机工作模式
##5.控制单元
##6.X86架构
##7.Linux启动 过程
##8.内核启动
##9.x86的分层权限机制
##10. 64位系统调用过程
##11.进程从代码到二进制的运行过程
##12.多线程
需要记住的是,创建线程的套路、mutex 使用的套路、条件变量使用的套路,如果需要对每一个函数进行详细了解,可看
ProgranmmingwithPOSIXThreads这本书,系统详细了解
##13.进场管理task_struct结构图
两重点:
1.进程亲缘关系维护的数据结构,是一种很有参考价值的实现方式,在内核中会多个地方出现类似的结构。
2.进程权限中setuid的原理,这一点比较难理解,但是很重要。
真的要理解:进程树是如何组织的,以及如何控制进程的权限
##14. 32位和64位的工作模式
1.在用户态,应用程序进行了至少一次函数调用。32位和64的传递参数的方式稍有不同,32位的就是用函数栈,64位的前6个参数用寄存器,其他的用函数栈。
2.在内核态,32位和64位都使用内核栈,格式也稍有不同,主要集中在pt_regs结构上
3.在内核态,32位和64位的内核栈和task_struct的关联关系不同。32位主要靠thread_info,64位主要靠Per-CPU变量
##15. 调度相关的数据结构
一个CPU上有一个队列,CFS的队列是一棵红黑树,树的每一个节点都是一个sched_entity,每个sched_entity都属于一个task_struct,task_struct里面有指针指向这个进程属于哪个调度类,在调度的时候,依次调用调度类的函数,从CPU的队列中取出下一个进程。上面图中的调度器、上下文切换。
##16.主动调度的过程
即一个运行中的进程主动调用__schedule让出CPU。在__schedule里面会做两件事情,第一是选取下一个进程,第二是进行上下文切换。而上下文切换又分用户态进程空间的切换和内核态的切换。
##17.调度体系
##18.进程创建的过程
这个图的上半部分是复制task_struct结构,你可以对照着右面的task_struct结构图,看这里面的成员是如何一部分一部分的被复制的。图的下半部分是唤醒新创建的子进程,如果条件满足,就会将当前进程设置应该被调度的标识位,就等着当前进程执行__schedule了。
##19.创建进程和创建线程在用户态和内核态的不同
创建进程的话,调用的系统调用是fork,在copy_process函数里面,会将五大结构files_struct、fs_struct、sighand_struct、signal_struct、mm_struct都复制一遍,从此父进程和子进程各用各的数据结构。
创建线程的话,调用的是系统调用clone,在copy_process函数里面, 五大结构仅仅是引用计数加一,也即线程共享进程的数据结构。
##20.内存管理系统精细化的三件事
##21.进程运行状态在32位下对应关系
##22.进程运行状态在64位下对应关系
##23.物理内存的组织形式
##24.物理内存的管理
对于物理内存来讲,从下层到上层的关系及分配模式
##25.用户态的内存映射机制
##26.内核态的内存映射机制和内存管理体系的串连
物理内存根据NUMA架构分节点。每个节点里面再分区域。每个区域里面再分页。
物理页面通过伙伴系统进行分配。分配的物理页面要变成虚拟地址让上层可以访问,kswapd可以根据物理
页面的使用情况对页面进行换入换出。
对于内存的分配需求,可能来自内核态,也可能来自用户态。
对于内核态,kmalloc在分配大内存的时候,以及vmalloc分配不连续物理页的时候,直接使用伙伴系统,分配后转换为虚拟地址,访问的时候需要通过内核页表进行映射。
对于kmem_cache以及kmalloc分配小内存,则使用slub分配器,将伙伴系统分配出来的大块内存切成一小块一小块进行分配。
kmem_cache和kmalloc的部分不会被换出,因为用这两个函数分配的内存多用于保持内核关键的数据结构。内核态中vmalloc分配的部分会被换出,因而当访问的时候,发现不在,就会调用do_page_fault。
对于用户态的内存分配,或者直接调用mmap系统调用分配,或者调用malloc。调用malloc的时候,如果分配小的内存,就用sys_brk系统调用;如果分配大的内存,还是用sys_mmap系统调用。正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用do_page_fault。
##27.文件系统
##28.硬盘
##29.文件系统格式
##30.元块组
##31.硬链接(Hard Link)和软链接(Symbolic Link)
##32.inode和数据块在文件系统上的关联关系
##33.虚拟文件系统
##34.文件读取和写入
----------------------------待完善