gpt4 book ai didi

c - Linux 中的所有驱动程序都在相同的上下文或不同的上下文中工作?

转载 作者:IT王子 更新时间:2023-10-29 01:08:42 26 4
gpt4 key购买 nike

Linux 中的所有驱动程序都运行在相同的上下文(内核空间的地址空间)中,还是各自运行在不同的上下文中(类似于不同进程如何在用户空间中的不同地址空间中工作)?

最佳答案

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

这意味着驱动函数在调用进程的内存映射中执行。这意味着驱动程序函数不仅可以访问存储在内核保留地址(虚拟地址 0xC0000000 及以上)中的自己的变量和结构,还可以访问用户调用进程的变量和代码。这允许 copy_to_user()copy_from_user() 等函数能够与用户调用进程交换信息。

回想一下,Linux 中任何进程的内存映射都包含两部分:用户进程最多可使用 3GB 内存的一大部分。该内存对于该进程是私有(private)的。 1GB 的另一部分用于内核。这部分在所有用户进程的内存映射之间共享。驱动程序的代码、堆栈和全局变量驻留在这 1GB 空间内。

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

一个典型的驱动程序是函数的集合,其中大部分是根据用户进程进行系统调用的请求执行的,所以大多数时候,一个驱动程序正在执行(实际上是它的一个实例)在特定用户进程的上下文中(但与用户进程中的代码不同,驱动程序以所有特权执行)。部分驱动程序可能会被其他内核函数异步调用,因此它们可能在另一个上下文中执行,与属于使用该驱动程序的进程的上下文无关。

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

关于c - Linux 中的所有驱动程序都在相同的上下文或不同的上下文中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com