问题1。
是什么意思
asm volatile(" ljmp%0,$ 1f \ n 1:\ n" ::" i"(KERNEL_CS));
我的猜测是将%cs设置为KERNEL_CS,但是立即数$ 1f呢?
问题2。
如果我们可以使用jmp label
跳转到某个标签,我们为什么还要写jmp label f
或jmp label b
?
问题3。
我的内核程序可以使用asm volatile ("ljmp %0, $1f\n 1:\n" :: "i" (USER_CS));
将权限级别更改为第0环的响铃3吗?我在我的ISR中执行了此操作,并且我获得了一般保护错误。但我认为我的%cs和%ip是在jmp之后的有效可执行和可重写内存段,因为我的GDT就是这样的
static struct segdesc gdt[] = {
SEG_NULL,
[SEG_KTEXT] = SEG(STA_X | STA_R, 0x0, 0xFFFFFFFF, DPL_KERNEL),
[SEG_KDATA] = SEG(STA_W, 0x0, 0xFFFFFFFF, DPL_KERNEL),
[SEG_UTEXT] = SEG(STA_X | STA_R, 0x0, 0xFFFFFFFF, DPL_USER),
[SEG_UDATA] = SEG(STA_W, 0x0, 0xFFFFFFFF, DPL_USER),
[SEG_TSS] = SEG_NULL,
};
内核文本,数据和用户文本,数据段均来自同一地址并具有相同的大小。