请问这个函数为什么没有编译到正确的指令?
测试异常用的函数:void CTrap::test_trap(UNUSED int n)
{
int a = 3, b = -1;
*(int *)0x2 = 3; 页表中只初始化了3G~4G的项,用bochs模拟32M内存,
*(int *)0x40000020 = 3; 但是这两个地址赋值都没有引起异常,为什么?
b += 1;
a /= b; 除零异常在下面的反汇编中没有看到,被ignore了?
__asm__ __volatile__("ud2a"); 无效指令:正常,可以陷入到异常
}
objdump得到输出:
c0104d8c <_ZN5CTrap9test_trapEi>:
c0104d8c: c7 05 02 00 00 00 03 movl $0x3,0x2
c0104d93: 00 00 00
c0104d96: c7 05 20 00 00 40 03 movl $0x3,0x40000020
c0104d9d: 00 00 00
c0104da0: 0f 0b ud2a
c0104da2: c3 ret
c0104da3: 90 nop
编译选项如下:
GENERAL_FLAGS = -nostdlib -nostdinc -nostartfiles -nodefaultlibs \
-fno-rtti -fno-exceptions -fomit-frame-pointer \
-Wall -Wextra -O2 -D__KERNEL__ -g -ggdb
[ 本帖最后由 jinglexy 于 2007-11-12 09:53 编辑 ] 没有缺页异常可以dump出页表内容看,后面那个被优化掉了,因为a,b的内容不再被用到,不需要计算。把a弄成static的应该就可以了。 3x bluster兄,dump看到的结果的确有0页表,0x40000020没有可以引起异常,上午的调试可能是搞错了。
以前用c编译过这段代码,a = a/0是不会被优化掉的,不知g++怎么就优没了。
再次3x。 写内核并使用GCC编译的话,可以使用volatile关键字. 原帖由 jinglexy 于 2007-11-12 09:51 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
测试异常用的函数:
void CTrap::test_trap(UNUSED int n)
{
int a = 3, b = -1;
*(int *)0x2 = 3; 页表中只初始化了3G~4G的项,用bochs模拟32M内存, ...
明摆着就是编译正确了吗? 何以得出“没有编译到正确的指令”这种结论?
页:
[1]