diff --git a/Operating Systems.md b/Operating Systems.md index 06f3c9c..a060752 100644 --- a/Operating Systems.md +++ b/Operating Systems.md @@ -19,6 +19,7 @@ * [分页和分段有什么区别?](#分页和分段有什么区别) * [什么是虚拟内存?](#什么是虚拟内存) * [有哪些页面置换算法?](#有哪些页面置换算法) + * [缓冲区溢出问题](#缓冲区溢出问题) * [磁盘调度](#磁盘调度) * [参考](#参考) @@ -532,6 +533,25 @@ IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处 - 终止该进程或增加物理内存容量。 +### 缓冲区溢出问题 + +
+什么是缓冲区溢出? +C 语言使用运行时栈来存储过程信息。每个函数的信息存储在一个栈帧中,包括寄存器、局部变量、参数、返回地址等。C 对于数组引用不进行任何边界检查,因此**对越界的数组元素的写操作会破坏存储在栈中的状态信息**,这种现象称为缓冲区溢出。缓冲区溢出会破坏程序运行,也可以被用来进行攻击计算机,如使用一个指向攻击代码的指针覆盖返回地址。 +
+ +
+缓冲区溢出的防范方式 + +防范缓冲区溢出攻击的机制有三种:随机化、栈保护和限制可执行代码区域。 +- 随机化:包括栈随机化(程序开始时在栈上分配一段随机大小的空间)和地址空间布局随机化(Address-Space Layout Randomization,ASLR,即每次运行时程序的不同部分,包括代码段、数据段、栈、堆等都会被加载到内存空间的不同区域),但只能增加攻击一个系统的难度,不能完全保证安全。 +- 栈保护:在每个函数的栈帧的局部变量和栈状态之间存储一个**随机产生的**特殊的值,称为金丝雀值(canary)。在恢复寄存器状态和函数返回之前,程序检测这个金丝雀值是否被改变了,如果是,那么程序异常终止。 +- 限制可执行代码区域:内存页的访问形式有三种:可读、可写、可执行,只有编译器产生的那部分代码所处的内存才是可执行的,其他页限制为只允许读和写。 + +
+ +更详细的可以参考:https://imageslr.github.io/2020/07/08/tech-interview.html#stackoverflow + ### 磁盘调度 过程:磁头(找到对应的盘面);磁道(一个盘面上的同心圆环,寻道时间);扇区(旋转时间)。为减小寻道时间的调度算法: