我要实现一个char设备,一个LKM。
我知道一些关于操作系统的基础知识,但我觉得我没有全局。
在C程序中,当我调用系统调用时,我认为它发生的是CPU被更改为ring0,然后转到系统调用向量并跳转到处理它的内核memmory空间函数。 (我认为它在int 0x80和eax中是系统调用向量的偏移量,不确定)。
然后,我在系统调用本身,但我想对于内核是与之前相同的过程,只是它处于内核模式,我的意思是当前的PCB是调用系统调用的过程。 / p>
到目前为止......太好了?如果出现问题,请纠正我。
其他问题......如何在进程内存中写入/读取? 如果在syscall处理程序中我引用地址,比如0xbfffffff。地址是什么意思?身体一个?一些虚拟内核?
答案 0 :(得分:1)
要从内核读取/写入内存,您需要使用get_user
或__copy_to_user
等函数调用。
请参阅Linux内核的User Space Memory Access API。
答案 1 :(得分:0)
答案 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