Linux 为什么ISA不需要请求成员区域

Linux 为什么ISA不需要请求成员区域,linux,linux-kernel,driver,Linux,Linux Kernel,Driver,我正在阅读LDD3第9章的源代码。还有一个ISA驱动程序的例子,名为Squil 以下是模块的初始化。我不明白的是,为什么在第282行调用ioremap之前没有调用request\u mem\u region 268 int silly_init(void) 269 { 270 int result = register_chrdev(silly_major, "silly", &silly_fops); 271 if (result < 0) { 272

我正在阅读LDD3第9章的源代码。还有一个ISA驱动程序的例子,名为Squil

以下是模块的初始化。我不明白的是,为什么在第282行调用ioremap之前没有调用request\u mem\u region

268 int silly_init(void)
269 {
270     int result = register_chrdev(silly_major, "silly", &silly_fops);
271     if (result < 0) {
272         printk(KERN_INFO "silly: can't get major number\n");
273         return result;
274     }
275     if (silly_major == 0)
276         silly_major = result; /* dynamic */
277     /*
278      * Set up our I/O range.
279      */
280 
281     /* this line appears in silly_init */
282     io_base = ioremap(ISA_BASE, ISA_MAX - ISA_BASE);
283     return 0;
284 }

此特定驱动程序允许访问0xA0000..0x100000范围内的所有内存

如果在这个范围内确实有任何设备,那么很可能其他驱动程序已经保留了一些内存,因此如果傻瓜尝试调用request_mem_region,它将失败,或者在加载傻瓜之前必须卸载其他驱动程序

在PC上,此范围包含图形卡内存和系统BIOS:

$ cat /proc/iomem
...
000a0000-000bffff : PCI Bus 0000:00
000c0000-000cedff : Video ROM
000d0000-000dffff : PCI Bus 0000:00
000e4000-000fffff : reserved
  000f0000-000fffff : System ROM
...
卸载图形驱动程序通常是不可能的,因为它不是一个模块,并且会阻止您看到愚蠢的驱动程序所做的事情,并且ROM内存范围由内核本身保留,无法释放

TL;DR:不呼叫request_mem_区域是愚蠢司机的一个特殊怪癖。
任何“真实”驱动程序都需要调用它。

此特定驱动程序允许访问0xA0000..0x100000范围内的所有内存

如果在这个范围内确实有任何设备,那么很可能其他驱动程序已经保留了一些内存,因此如果傻瓜尝试调用request_mem_region,它将失败,或者在加载傻瓜之前必须卸载其他驱动程序

在PC上,此范围包含图形卡内存和系统BIOS:

$ cat /proc/iomem
...
000a0000-000bffff : PCI Bus 0000:00
000c0000-000cedff : Video ROM
000d0000-000dffff : PCI Bus 0000:00
000e4000-000fffff : reserved
  000f0000-000fffff : System ROM
...
卸载图形驱动程序通常是不可能的,因为它不是一个模块,并且会阻止您看到愚蠢的驱动程序所做的事情,并且ROM内存范围由内核本身保留,无法释放

TL;DR:不呼叫request_mem_区域是愚蠢司机的一个特殊怪癖。
任何“真正的”驱动程序都需要调用它。

我的理解是请求区域/请求区域将申请对I/O端口的独占访问权限。另一方面,ioremap将端口号映射到虚拟内存地址空间,即将端口注册到TLB中。你能解释一下ioremap到底做了什么吗?这确实是ioremap做的。为了补充CL的评论,没有理由不能两次映射相同的物理地址,从而导致两个虚拟地址映射到相同的物理地址。事实上,request_mem_region旨在防止正常情况下出现这种情况。我的理解是request_region/request_mem_region将申请对I/O端口的独占访问权限。另一方面,ioremap将端口号映射到虚拟内存地址空间,即将端口注册到TLB中。你能解释一下ioremap到底做了什么吗?这确实是ioremap做的。为了补充CL的评论,没有理由不能两次映射相同的物理地址,从而导致两个虚拟地址映射到相同的物理地址。事实上,request_mem_region的设计目的是在正常情况下防止这种情况发生。