用户对内核模式大图?

时间:2010-05-30 07:34:47

标签: linux-kernel

我要实现一个char设备,一个LKM。

我知道一些关于操作系统的基础知识,但我觉得我没有全局。

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

然后,我在系统调用本身,但我想对于内核是与之前相同的过程,只是它处于内核模式,我的意思是当前的PCB是调用系统调用的过程。 / p>

到目前为止......太好了?如果出现问题,请纠正我。

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

3 个答案:

答案 0 :(得分:1)

要从内核读取/写入内存,您需要使用get_user__copy_to_user等函数调用。

请参阅Linux内核的User Space Memory Access API

答案 1 :(得分:0)

你永远无法从常规流程中获得ring0。

你必须编写一个内核模块来获取ring0。

您永远不必处理任何物理地址,0xbfffffff代表您流程的virtual address space中的地址。

答案 2 :(得分:0)

大图:

一切都在集会中发生。因此在Intel程序集中,有一组权限指令只能在Ring0模式下执行(http://en.wikipedia.org/wiki/Privilege_level)。要转换到Ring0模式,您可以使用" Int"或者" Sysenter"指令:

what all happens in sysenter instruction is used in linux?

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

http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection/

你可能会问,CPU如何初始化内存并首先注册:这是因为在启动时,x86 CPU在realmode中运行,不受保护(没有Ring概念),所以一切皆有可能并且很多设置工作完了。

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

http://en.wikipedia.org/wiki/Memory_management_unit

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

http://www.inf.fu-berlin.de/lehre/SS01/OS/Lectures/Lecture14.pdf