2010-05-30 56 views
0

我必须实现一个字符设备,一个LKM。用户到内核模式的大图?

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

在一个C程序中,当我调用一个系统调用时,我认为它发生的是将CPU更改为ring0,然后进入系统调用向量并跳转到处理它的内核存储器空间函数。 (我认为它的int 0x80和eax是系统调用向量的偏移量,不确定)。然后,我在系统调用本身,但我猜对于内核是以前的相同的过程,只是它在内核模式,我的意思是当前的PCB是调用系统调用的过程。

到目前为止......这么好?,纠正我,如果有什么错误。

其他问题......如何在过程内存中写入/读取? 如果在系统调用处理程序中,我指的是地址,比如0xbfffffff。这意味着什么地址?物理的吗?一些虚拟内核之一?

回答

1

要从内核读取/写入内存,需要使用函数调用,例如get_user__copy_to_user

查看Linux内核的User Space Memory Access API

0

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

你必须编写一个内核模块才能进入ring0。

而且你永远不需要处理任何物理地址,0xbfffffff代表你的进程virtual address space中的地址。

+0

我的意思是,如果我在内核空间的系统调用句柄中引用0xbfffffff。这意味着什么地址 – fsdfa 2010-05-30 08:03:33

0

大图:

一切都发生在组装中。因此,在英特尔汇编中,有一组特权指令只能在Ring0模式下执行(http://en.wikipedia.org/wiki/Privilege_level)。为了使过渡到Ring0的模式,您可以使用“内部”或“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以实模式运行,不受保护(无Ring概念)等等一切皆有可能,大量的设置工作已经完成。至于虚拟与非虚拟内存地址(或物理地址):只要记住用于内存寻址的寄存器中的任何内容总是通过虚拟地址(如果MMU被设置,启用保护模式)。看看这里的图片(注意到,从CPU什么是虚拟地址,只有内存总线将看到物理地址):

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

至于空间和内核之间显存分离,你可以在这里读到:

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

相关问题