我正在阅读第9章LDD3的源代码。还有一个名为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 }

最佳答案

此特定的驱动程序允许访问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驱动程序的一个特殊问题。
任何“真实”驱动程序都需要调用它。

关于linux - 为什么ISA不需要request_mem_region,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18677881/

10-10 07:33