硬件方面
- 有关芯片、CPU、多核
- 芯片 && CPU:CPU是芯片的一种。二者的区别是芯片集成了上外围器件,CPU不带外围器件(例如存储器阵列),是高度集成的通用结构的处理器,CPU是一种数字芯片,只是众多芯片中的一类。芯片是指将电子逻辑门电路用激光刻录到硅片上,从而构成各种各样的芯片,当今集成度最高、功能最强大的应该CPU芯片了。
- CPU && 多核:一个Chip里面,把计算的电路做了多份,每份叫一个Core,而仍把封装起来的整个CPU叫多核
- ❓有关GPU && CPU
- ❓南桥 && 北桥
操作系统底层
- 地址翻译机制:有关实模式 && 保护模式
- 实模式(比较老):分段机制,segment register直接指向segment
- 保护模式(比较新):segment register 存放 segment selector,通过这个selector查找GDT表获得segment descriptor,segment descriptor存的才是segment的起始地址
- 参考:x86从实模式到保护模式
- 🌟有关虚拟内存内核空间🌟
- 关于内核页表:开启页表之后,内核也必须是使用虚拟地址,因此需要映射所有物理地址来管理物理内存。64位的机器是这样,32位因为虚拟地址空间不够大,有high memory和low memory之分。
- 关于系统调用&进程切换:对于x86,一个进程的页表包含了用户的虚存和内核的虚存,系统调用的时候不需要切换CR3,只是从用户态变成了内核态,而进程切换的时候虽然切换了页表但是内核空间对应的实际物理地址依然不变(可以理解为全局只有一个内核);对于arm,有两个ttbr,一个对应用户页表一个对应内核页表,因此系统调用的时候也不需要切换CR3,而进程切换的时候只需要切换用户页表不需要切换内核页表。
- 关于内核访问用户空间权限:硬件有一些机制(x86上是SMAP,ARM上是PAN),可以阻止在内核态直接解引用(可以直接解引用,因为用的是同一张页表)用户模式可访问的指针(即使页表有映射),但是内核确实有访问用户内存的需求,所以内核可以在需要时临时关闭这些保护。比如在调用copy_from_user和copy_to_user两个函数的时候就会关闭这种保护。
- 关于内核栈:每个进程有对应的内核栈,内核栈的作用是存放一些系统调用/进程切换的时候用户进程的状态信息(比如寄存器状态)。一个用户态进程/线程在内核中都是用一个task_struct的实例描述的:用户空间的堆栈,在task_struct->mm->vm_area里面描述,都是属于进程虚拟地址空间的一个区域;而内核态的栈在task_struct->stack里面描述,其底部是thread_info对象,thread_info可以用来快速获取task_struct对象,整个stack区域一般只有一个内存页(可配置),32位机器也就是4KB。(这就类似于不同的线程栈不一样,不同的进程的内核栈虽然共享一份页表,地址也有所不同)
- ❓lcore/vcore:一个物理核可以被分为2/4个逻辑核
- ❓Chroot非常适合做沙盒隔离
- 一片看起来很有意思的文章:条件竞争学习 之 DirtyCow分析
madvise()
: 它允许一个 application 来告诉内核如何它需要使用某些映射或共享内存区域,使内核可以选择适当的预读和缓存技术(参考博客: madvise)
网络
- VPN/代理 原理