/*
* Match LDD devices to drivers. Just do a simple name test.
*/
static int ldd_match(struct device *dev, struct device_driver *driver)
{
return !strncmp(dev->bus_id, driver->name, strlen(driver->name));
}
/*
* The LDD bus device.
*/
static void ldd_bus_release(struct device *dev)
{
printk(KERN_DEBUG "lddbus release\n");
}
/*
* For now, no references to LDDbus devices go out which are not
* tracked via the module reference count, so we use a no-op
* release function.
*/
static void ldd_dev_release(struct device *dev)
{ }
int sculld_init(void)
{
int result, i;
dev_t dev = MKDEV(sculld_major, 0);
/*
* Register your major, and accept a dynamic number.
*/
if (sculld_major)
result = register_chrdev_region(dev, sculld_devs, "sculld");
else {
result = alloc_chrdev_region(&dev, 0, sculld_devs, "sculld");
sculld_major = MAJOR(dev);
}
if (result < 0)
return result;
/*
* Register with the driver core.
*/
register_ldd_driver(&sculld_driver);
/*
* allocate the devices -- we can't have them static, as the number
* can be specified at load time
*/
sculld_devices = kmalloc(sculld_devs*sizeof (struct sculld_dev), GFP_KERNEL);
if (!sculld_devices) {
result = -ENOMEM;
goto fail_malloc;
}
memset(sculld_devices, 0, sculld_devs*sizeof (struct sculld_dev));
for (i = 0; i < sculld_devs; i++) {
sculld_devices[i].order = sculld_order;
sculld_devices[i].qset = sculld_qset;
sema_init (&sculld_devices[i].sem, 1);
sculld_setup_cdev(sculld_devices + i, i);
sculld_register_dev(sculld_devices + i, i);
}
//#ifdef SCULLD_USE_PROC /* only when available */
在另一個模塊里調用EXPORT的函數,編譯的時候 WARNING: "register_ldd_driver" [/sculld/sculld.ko] undefined! insmod 的時候出錯 Unknown symbol in module
cat /proc/kallsyms | grep register_ldd_driver
ffffffffa0493310 r __ksymtab_unregister_ldd_driver [lddbus]
ffffffffa0493370 r __kstrtab_unregister_ldd_driver [lddbus]
ffffffffa0493350 r __kcrctab_unregister_ldd_driver [lddbus]
ffffffffa0493320 r __ksymtab_register_ldd_driver [lddbus]
ffffffffa0493386 r __kstrtab_register_ldd_driver [lddbus]
ffffffffa0493358 r __kcrctab_register_ldd_driver [lddbus]
ffffffffa0493330 r __ksymtab_unregister_ldd_device [lddbus]
ffffffffa049339a r __kstrtab_unregister_ldd_device [lddbus]
ffffffffa0493360 r __kcrctab_unregister_ldd_device [lddbus]
ffffffffa0493130 t unregister_ldd_driver [lddbus]
00000000cea62aa1 a __crc_unregister_ldd_device [lddbus]
00000000750790d6 a __crc_register_ldd_device [lddbus]
ffffffffa04931f0 t register_ldd_device [lddbus]
0000000073ce301d a __crc_unregister_ldd_driver [lddbus]
ffffffffa04930d0 t unregister_ldd_device [lddbus]
000000002db493e5 a __crc_register_ldd_driver [lddbus]
ffffffffa0493140 t register_ldd_driver [lddbus]
cat /proc/kallsyms | grep ssb_device_enable
ffffffffa0033310 u ssb_device_enable [b43]
ffffffffa0037c60 r __ksymtab_ssb_device_enable [ssb]
ffffffffa0037e79 r __kstrtab_ssb_device_enable [ssb]
ffffffffa0037d68 r __kcrctab_ssb_device_enable [ssb]
ffffffffa0033310 T ssb_device_enable [ssb]
00000000654ba824 a __crc_ssb_device_enable [ssb]