摘要:
转自——http://five.rdaili.com/sohu.com.php?u=Mq3EniVnae0axim7jkGhH0IhA9uho6CQso7R1aYomXWJ9UemfwUQYmKRc82H5yiImrEY&b=3Linux Kernel 的穩定,有一部份可以歸功於它優良的記憶體管理機... 阅读全文
摘要:
本文由Jacky原创,来自http://blog.chinaunix.net/u1/58780/showart.php?id=462971对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。虽然现在我还没怎么用它,但感觉还是挺重要的,有必要了解一下。先看一下GNU官方网站上对.lds文件形式的完整描述:SECTIONS{...secnamestartBLOCK(align)(NOLOAD):AT(ldadr){contents}>region:phdr=fill...}secname和contents是必须的,其他的都是可选的。下面挑几个常用的看 阅读全文
摘要:
———转自 http://blog.csdn.net/rockhard/article/details/4166642——————/*参考了别人的一些笔记,看完了启动代码。本文档记录在看代码时碰到的困难,将这些曾经困扰的问题记录下来,以备今后之用。分析时不重要的代码被删除了。*/.globl _start_start:bresetldrpc, _undefined_instructionldrpc, _software_interruptldrpc, _prefetch_abortldrpc, _data_abortldrpc, _not_usedldrpc, _irqldrpc, _fiq_ 阅读全文
摘要:
上一节中,我们浏览了一次因越界访问而造成映射失败从而引起进程流产的过程,不过有时候,越界访问时正常的。现在我们就来看看当用户堆栈过小,但是因越界访问而“因祸得福”得以伸展的情景. 假设在进程运行的过程中,已经用尽了为本进程分配的堆栈空间,此时CPU 中的堆栈指针%esp已经指向堆栈区间的起始地址,如下图 假设现在需要调用某个子程序,因此CPU 需将返回地址压入堆栈,也就是要将返回地址写入虚存空间中地址为(%esp-4)的地方,可以在我们这个情景中地址(%esp-4)落入了空洞中,这是尚未映射的地址,必然会引起一次页面异常,让我们顺着上一节情景中已经走过的路线到达文件arch/i386... 阅读全文
摘要:
页式存储管理机制通过页面目录和页面表将每个线性地址转换成物理地址,当遇到下面几种情况就会使CPU产生一次缺页中断,从而执行预定的页面异常处理程序: ① 相应的页面目录或页表项为空,也就是该线性地址与物理地址的关系还没建立或者已经撤销 ② 相应的物理页面不在内存中 ③ 指令规定的访问方式与页面的权限不符 我们假设一个情景,当我们的用户程序将一个打开的文件通过mmap()映射到内存,然后又通过munmap()撤销映射。在撤销一个映射区间时,常常会在虚存地址空间中留下一个空洞,而相应的地址则不应继续使用了,但是,程序中可能会有错误继续访问这个已经撤销的区域,这时候,一次因越界访问一个无效... 阅读全文