2

我正在阅读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 }
4

1 回答 1

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司机的一个特殊怪癖。任何“真正的”司机都需要调用它。

于 2013-09-08T07:30:13.653 回答