我正在阅读第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_region
是silly
驱动程序的一个特殊问题。任何“真实”驱动程序都需要调用它。
关于linux - 为什么ISA不需要request_mem_region,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18677881/