jinglexy 发表于 2007-11-12 09:51

请问这个函数为什么没有编译到正确的指令?

测试异常用的函数:
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 编辑 ]

bluster 发表于 2007-11-12 11:28

没有缺页异常可以dump出页表内容看,后面那个被优化掉了,因为a,b的内容不再被用到,不需要计算。把a弄成static的应该就可以了。

jinglexy 发表于 2007-11-12 19:00

3x bluster兄,dump看到的结果的确有0页表,0x40000020没有可以引起异常,上午的调试可能是搞错了。
以前用c编译过这段代码,a = a/0是不会被优化掉的,不知g++怎么就优没了。
再次3x。

prolj 发表于 2007-11-14 19:40

写内核并使用GCC编译的话,可以使用volatile关键字.

mik 发表于 2007-11-17 22:58

原帖由 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]
查看完整版本: 请问这个函数为什么没有编译到正确的指令?