C Linux中的所有驱动程序都在相同的上下文中工作,还是在不同的上下文中工作?

C Linux中的所有驱动程序都在相同的上下文中工作,还是在不同的上下文中工作?,c,linux,linux-kernel,kernel,virtual-address-space,C,Linux,Linux Kernel,Kernel,Virtual Address Space,Linux中的所有驱动程序都在相同的上下文(内核空间的地址空间)中运行,或者每个驱动程序都在不同的上下文(类似于不同进程在用户空间的不同地址空间中的工作方式)?在x86 Linux中,32位,所有驱动程序都在所谓的内核模式下运行(有时被称为环0模式,因为Intel组织其CPU保护方案的方式)。 当进程调用驱动程序时(例如,您向设备驱动程序发出read()系统调用),驱动程序中有一个函数被执行。该函数被称为在该进程的上下文中执行 这意味着驱动程序函数在调用进程的内存映射中执行。这意味着驱动程序函数

Linux中的所有驱动程序都在相同的上下文(内核空间的地址空间)中运行,或者每个驱动程序都在不同的上下文(类似于不同进程在用户空间的不同地址空间中的工作方式)?

在x86 Linux中,32位,所有驱动程序都在所谓的内核模式下运行(有时被称为环0模式,因为Intel组织其CPU保护方案的方式)。 当进程调用驱动程序时(例如,您向设备驱动程序发出
read()
系统调用),驱动程序中有一个函数被执行。该函数被称为在该进程的上下文中执行

这意味着驱动程序函数在调用进程的内存映射中执行。这意味着驱动程序函数不仅可以访问存储在内核保留地址(虚拟地址0xC0000000及以上)中的自身变量和结构但是可以访问用户调用过程的变量和代码。这允许像
copy\u to\u user()
copy\u from\u user()
这样的函数能够与用户调用过程交换信息

回想一下,Linux中任何进程的内存映射都有两部分:用户进程可用的最大3GB内存中的一大部分。该内存是该进程的专用内存。1GB内存中的另一部分是内核内存。该部分在所有用户进程的内存映射中共享。驱动程序的代码、堆栈和全局变量位于该内存映射中1GB空间

还有另一个上下文:中断上下文。Linux驱动程序可以为硬件中断安装处理程序。当触发此中断时,将执行该处理程序,但这一次,它将在当时正在执行的任何进程的上下文中执行(即,未从用户进程调用该处理程序)

然后,典型的驱动程序是一组函数,其中大多数函数是在用户进程发出系统调用请求时执行的,因此大多数情况下,驱动程序是在特定用户进程的上下文中执行的(实际上是它的一个实例)(但与用户进程中的代码不同,驱动程序以所有特权执行)。驱动程序的某些部分可能会被其他内核函数异步调用,因此它们可能在另一个上下文中执行,而与使用驱动程序的进程所属的上下文无关


还请记住,可能有多个用户进程在使用该驱动程序,因此每个进程在其自己的上下文中执行相同的代码。应编写驱动程序以便重新输入,以避免副作用。

非常感谢!但有两个澄清:1。这意味着驱动程序函数不仅可以访问存储在内核保留地址(虚拟地址0xC0000000及以上)中的自己的变量和结构…-位于0xC0000000及以上的内核保留地址,或0x0-0xC0000000?2**处理程序被执行,但这一次,它将在当时正在执行的任何进程的上下文中执行**“-这是否意味着中断的处理程序可以访问某些上下文的数据,或者它不能-即处理程序被执行,但它不会在任何进程的任何上下文中执行,而此时正在执行这些上下文?在进程上下文中运行的驱动程序可以访问分配给该进程的所有内存,除了它自己的(内核)内存之外。”内存。好的,但硬件中断由硬件发生,但不会由用户空间中的任何进程发生。中断上下文表示处理程序正在未知进程上下文中执行(以中断到达时正在执行的为准)。可能与当前与驱动程序交互的用户进程上下文不同(其动作可能导致设备产生中断)。在编写设备驱动程序时,如果假设某个进程已打开驱动程序,则驱动程序中的每个函数(包括中断处理程序)都可以访问用户进程的内存,这是一个常见错误。当中断到达时,用户进程可能已被调出。