我目前正在制作自己的操作系统。我已经成功创建了一个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)“组装”更大的变量..)