zenglOX v1.3.0 动态链接库, 固定位置的内核栈, double fault(双误异常检测内核栈溢出)

该版本的动态链接库技术是使用ELF格式实现的, 所有的用户态程式, 如：shell, ps, ls等命令在执行前都会加载所需的动态链接库。
目前主要有两个动态链接库：ld.so 与 libcommon.so , ld.so专门负责可执行文件里的函数符号的解析工作, 可执行文件里调用的动态库的函数并非一开始就解析出了地址的, 因为动态库可以加载到任意的地方,
所以需要由ld.so在运行时解析出函数的实际虚拟地址, libcommon.so里包含了用户态程式所需的系统调用的定义, 以及一些字符串拷贝之类的通用函数。

在zenglOX命令行下可以使用 ps -d 命令来查看每个任务所加载的动态链接库的情况

另外, 任务的内核栈被移到了固定的0xf0000000位置, 之前的版本里内核栈位于堆里, 不方便维护和管理, 尤其是不能检测内核栈溢出
将内核栈移至0xf0000000后, 当前每个任务有8k的内核栈空间, 当内核栈超出0xefffe000后, 会触发double fault,
double fault是因为刚开始内核栈溢出时, 会先触发page fault, 然后page fault使用的也是相同内核栈, 由于内核栈已经溢出了, 所以page fault(分页错误)会失败,
page fault失败, 会触发double fault(双错误, 对应中断号为8), 在8号中断里, 设置了一个task gate, 让其指向一个与当前任务不同的TSS(Task State Segement),
在该TSS里指定了一个没被破坏的栈(当前版本直接用的是初始任务的内核栈), 这样, task gate会触发intel从硬件层面进行切换任务, 让double fault能有一个可用的栈继续运行,
double fault会将出错的任务里的详细错误信息显示出来, 然后system halt(停机).

为了能够测试内核栈溢出, 增加了一个syscall_overflow_test的系统调用, 新增的testoverflow程式在没有任何参数的情况下, 会通过syscall_overflow_test系统调用来触发内核栈溢出
此外, testoverflow程式还有一个-u参数, 可以使用 testoverflow -u 命令来测试用户栈溢出, 用户栈溢出时只会终止当前任务, 不会停机。

官方网站：www.zengl.com
作者：zenglong
时间：2014年6月23日 00:00:00 (o(∩_∩)o~~)