我正在阅读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 }
答案 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_region
是silly
驱动程序的特殊怪癖。
任何“真正的”驱动程序都需要调用它。