编程器猫让程序跳到起始位置。
将起始代码段设置在开头。
1,首先进入目录链接,运行make生成反汇编代码ttt.s,选项“-Ttext 0x00000000”。
然后,修改Makefile:去掉第4行和第7行的“#”,在第3行和第6行前添加“#”,运行make生成反汇编代码ttt2.s,arm-linux-ld选项为“-Ttext 0x30000000”。link.s程序中使用了两种跳转方法:B跳转指令和直接分配给pc寄存器。
然后先列出不同“-Ttext”选项下生成的可执行文件的反汇编代码,再详细分析这两种不同指令带来的差异。
然后,让第一张图片从最左边开始,滚动方向从左到右,让第一张图片和最后一张图片连在一起。现在,在一次滚动完成后,图片再次从最右边滚动到最左边。
然后,在应用程序中,堆栈和堆的起始地址是一致的。但是内核本身并没有另外一个更高级的程序来管理内核的地址空间,所以内核空间的栈的组织和应用程序的不同。如果内核堆栈溢出,它不能像应用程序一样产生页面错误,然后分配新的地址空间继续使用。如果内核堆栈溢出,没有人知道,除非溢出影响操作,使程序崩溃。
后来堆空间的扩展靠brk()系统调用,用的是内核内存,get_free_pages(虽然上层封装了kmalloc和vmalloc),基本是自我管理。因为Linux内核不支持自己的交换,所以内核没有办法找到可用的页框。