Skip to content

Commit

Permalink
增加“缓冲区溢出问题”
Browse files Browse the repository at this point in the history
  • Loading branch information
imageslr authored Apr 9, 2021
1 parent a62bc34 commit b25fba7
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Operating Systems.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* [分页和分段有什么区别?](#分页和分段有什么区别)
* [什么是虚拟内存?](#什么是虚拟内存)
* [有哪些页面置换算法?](#有哪些页面置换算法)
* [缓冲区溢出问题](#缓冲区溢出问题)
* [磁盘调度](#磁盘调度)
* [参考](#参考)

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

0 comments on commit b25fba7

Please sign in to comment.