为什么ISA不需要request_mem_region

时间:2013-09-07 21:00:57

标签: linux linux-kernel driver

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

以下是模块的初始化。我不明白为什么在第282行调用ioremap()之前没有调用“request_mem_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 }

1 个答案:

答案 0 :(得分:4)

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

如果此范围内确实存在任何设备,则其他驱动程序可能已经保留了部分内存,因此如果silly尝试调用request_mem_region,则会失败,或者在加载silly之前需要卸载其他驱动程序。

在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
...

通常无法卸载图形驱动程序(因为它不是模块),并且会阻止您查看 silly驱动程序所执行的操作,并且ROM内存范围是由内核本身并不能被释放。

TL; DR:不调用request_mem_regionsilly驱动程序的特殊怪癖。 任何“真正的”驱动程序都需要调用它。