切换到用户空间

飞碟

这是演示os内核基本功能的代码的一部分。刷新GTD并设置IDT之后,我想切换到Ring 3,运行一些int和context切换。但是我不能跳到用户模式。我想在iret指令中使用技巧据我所知,iret将从堆栈中弹出以下值:SS ESP EFLAGS CS EIP因此,这个想法是将适当的值(使用新的段选择器)推入堆栈,并iret在寄存器中设置值。这是我正在使用的代码:

    .equ NULL_DESCRIPTOR,  0x0000000000000000

    .equ CODE_P3,          0x40C3FA000000D090 
    .equ DATA_P3,          0x40C3F2000000D090 
    .equ CODE_KERNEL,      0x00CF9A000000FFFF 
    .equ DATA_KERNEL,      0x00CF92000000FFFF 
         GDT:
            .quad NULL_DESCRIPTOR
            .quad CODE_P3       #0x08
            .quad DATA_P3       #0x10
            .quad CODE_KERNEL   #0x18
            .quad DATA_KERNEL   #0x20
        _GDT:
            .word 39
            .long GDT


    .global flushGDT
    .type flushGDT, @function
    flushGDT:
        cli
        lgdt _GDT

        xor %eax, %eax

        #Data segment setup
        mov $0x10, %ax
        mov %ax, %ds
        mov %ax, %gs
        mov %ax, %fs
        mov %ax, %es

        #Stack save
        mov %esp, %eax

        #stack setup for iret and user space return

        pushl $0x10
        pushl %eax

        pushf
        #enable ints after switch to ring 3
        pop %eax
        or $0x200, %eax
        push %eax

        #CS selector
        pushl $0x08
        pushl $0x60 #Address of .leave (I have written proper ld script and checked with objdump)
        iret

    .section .upper_code, "ax", @progbits
    .leave:
        hlt
        call upperKernelCode

问题在于iret开始执行此指令后,请在选择器的特权级别上检查代码,然后检查代码是否正确,从而导致CPU故障并复位。这是BOCHS的日志形式:check_cs(0x0008): non-conforming code seg descriptor dpl != cpl, dpl=3, cpl=0我将非常感谢您对此问题的任何帮助

小丑

正如bochs告诉您的那样,您的选择器0x08具有,CPL=0但描述符条目具有DPL=3请记住,选择器的两个最低有效位是CPL因此,要切换到ring3,您应该使用0x0b

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

pthread_spinlock是否导致从用户空间切换到内核空间

来自分类Dev

是什么阻止了用户空间程序切换到更高级别?

来自分类Dev

从用户模式切换到内核模式

来自分类Dev

从用户模式切换到内核模式

来自分类Dev

让sudo询问切换到的用户密码

来自分类Dev

从Windows切换到Ubuntu后丢失磁盘空间

来自分类Dev

如何防止macOS将应用切换到不同的空间?

来自分类Dev

安装PostgreSQL后切换到postgres用户,无法切换回普通用户

来自分类Dev

用户输入后将perl进程切换到后台

来自分类Dev

切换到普通用户的命令是什么?

来自分类Dev

在内核转储中切换到用户堆栈

来自分类Dev

切换到新用户时需要脚本继续

来自分类Dev

切换到普通用户的命令是什么?

来自分类Dev

如何切换到其他用户的进程?

来自分类Dev

Windows用户质疑他切换到Ubuntu

来自分类Dev

超级用户通过切换到Shell脚本

来自分类Dev

将用户从sudoer切换到Bash到root

来自分类Dev

一步切换到用户,退出SSH连接

来自分类Dev

无法通过命令行切换到root用户

来自分类Dev

AWS 控制台 > 切换到用户

来自分类Dev

切换到Ubuntu

来自分类Dev

从Mockito切换到JMockit

来自分类Dev

从MySQL切换到MariaDB

来自分类Dev

从Windows切换到Fedora

来自分类Dev

从UbuntuGNOME切换到Ubuntu?

来自分类Dev

从ActiveAndroid切换到GreenDao

来自分类Dev

从 Jmockit 切换到 mockito

来自分类Dev

切换到正确的 iframe?

来自分类Dev

当行模式没有足够的空间时,如何使Flexbox切换到列模式?