Linux kernel 用户到内核模式大图?

Linux kernel 用户到内核模式大图?,linux-kernel,Linux Kernel,我必须实现一个字符设备,一个LKM 我知道一些操作系统的基本知识,但我觉得我没有大局 在C程序中,当我调用一个系统调用时,我认为发生的是CPU被更改为ring0,然后转到系统调用向量并跳转到处理它的内核内存空间函数。(我认为它是int 0x80,在eax中是syscall向量的偏移量,不确定) 然后,我在系统调用本身中,但是我猜内核的进程与以前相同,只是它处于内核模式,我的意思是当前PCB就是调用系统调用的进程 到目前为止。。。这么好?如果有什么不对劲,请纠正我 其他问题。。。如何在进程内存中写

我必须实现一个字符设备,一个LKM

我知道一些操作系统的基本知识,但我觉得我没有大局

在C程序中,当我调用一个系统调用时,我认为发生的是CPU被更改为ring0,然后转到系统调用向量并跳转到处理它的内核内存空间函数。(我认为它是int 0x80,在eax中是syscall向量的偏移量,不确定)

然后,我在系统调用本身中,但是我猜内核的进程与以前相同,只是它处于内核模式,我的意思是当前PCB就是调用系统调用的进程

到目前为止。。。这么好?如果有什么不对劲,请纠正我

其他问题。。。如何在进程内存中写入/读取?。
如果在系统调用处理程序中,我引用地址,比如0xbfffffff。那个地址是什么意思?物理的?一些虚拟内核?

要从内核读取/写入内存,需要使用函数调用,例如
get\u user
\u copy\u To\u user


请参阅Linux内核的说明。

您永远无法通过常规进程访问ring0

您必须编写一个内核模块才能访问ring0

而且您不必处理任何物理地址,0xbfffffff表示流程中的一个地址。

大图:

一切都在装配中发生。因此,在英特尔汇编中,有一组特权指令只能在Ring0模式下执行()。要转换到Ring0模式,可以使用“Int”或“Sysenter”指令:

然后在Ring0模式(即内核模式)内,访问内存需要通过段寄存器中标记的DPL/CPL/RPL属性位匹配特权级别:

您可能会问,CPU首先是如何初始化内存和寄存器的:这是因为在启动时,x86 CPU在realmode下运行,没有保护(无环概念),因此一切都是可能的,并且完成了大量的设置工作

至于虚拟内存地址与非虚拟内存地址(或物理地址):请记住,寄存器中用于内存寻址的任何内容都始终通过虚拟地址(如果MMU已设置,则启用保护模式)。请看这里的图片(注意CPU中的任何内容都是虚拟地址,只有内存总线可以看到物理地址):

关于用户空间和内核之间的内存分离,您可以在这里阅读:


我的意思是,如果我在内核空间的系统调用句柄中引用0xbfffffff。那个地址是什么意思