https://github.com/DoasIsay/ToyCoroutine
如何检测协程是否需要进行栈扩充?
我们先思考一个问题,glibc的pthread_create创建的线程是如何检测到用户栈的溢出而及时终止线程的?
如下代码
g++ test.cpp -lpthread
strace ./a.out 结果如下图
由strace 结果可知pthread_create先使用mmap为线程申请了的用户空间stack,然后使用mprotect对stack的栈顶进行保护,即栈顶的4kb无读写权限,一旦被读写就说明产生了栈溢出,操作系统就会向读写此4kb的任务发送SIGSEGV信号,最后才是调用clone创建线程
如果越过这4kb访问前面的内存会怎样?如果刚好是另一个线程的stack?只要不访问这4kb或其它线程的这4kb都不会有问题,顶多就是会破坏其它线程的栈,或自已的栈被其它线程破坏,然后进程core掉,,&#