将struct转换为uint64会导致自定义操作系统崩溃

时间:2016-04-09 19:51:09

标签: c struct operating-system endianness uint64

我目前正在制作自己的操作系统。我已经成功创建了一个IDT,我想提高性能,所以我认为使用#define NO_STRUCT #ifndef NO_STRUCT struct idtEntry{ uint16_t baseLow; uint16_t segSel; uint8_t alwaysZero; uint8_t flags; uint16_t base_high; }__attribute__((packed)); typedef struct idtEntry idtEntry_t; #else typedef uint64_t idtEntry_t; #endif 和位移会对我有所帮助。整个文件有点太大,无法在此显示,所以我只展示必要的片段。

void idtSetEntry(int entryNo, uint32_t base, uint16_t segSel, uint8_t flags){
#ifndef NO_STRUCT
    idtEntries[entryNo].baseLow = base & ~(0xffff << 16);
    idtEntries[entryNo].segSel = segSel;
    idtEntries[entryNo].flags = flags;
    idtEntries[entryNo].base_high = base >> 16;
    idtEntries[entryNo].alwaysZero = 0;
#else
  idtEntries[entryNo] = ((uint64_t)base & 0xFFFF) | ((uint64_t)segSel << 16) | ((uint64_t)flags << 40) | (((uint64_t)base & 0xFFFF0000) << 32);
#endif

}
<FrameLayout android:id="@+id/my_flayout"    
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView  
 android:id="@+id/image"
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:src="@drawable/sketch" android:layout_alignParentTop="true"/>
<ImageView  
 android:id="@+id/image2"
 android:layout_width="fill_parent" 
 android:layout_height="fill_paren" 
 android:layout_alignTop="@id/image"
 android:layout_alignLeft="@id/image"
 android:layout_alignRight="@id/image"
 android:layout_alignBottomp="@id/image"
 android:visibility="INVISIBLE"/>
</FrameLayout>

哦,是的,顺便说一下,我正在使用linux和i386 gcc elf编译器(5.3.2)。 我不明白我在这里做错了什么,考虑到x86平台是小端的事实,我已经翻转了int中的元素,它在测试程序中工作得很好,但这段代码导致grub错过多引导头。任何解释??
编辑:

所以,用uint32_t替换uint64_t [2]修复它,有人知道为什么?是因为我在32位机器上使用64位变量吗? (我严重怀疑,因为其他版本的GCC(AVR,ARM)“组装”更大的变量..)

0 个答案:

没有答案