The Kernel Symbol Table
We’ve seen how insmod resolves undefined symbols
against the table of
public kernel symbols. The table contains global kernel
items—functions and variables—that are needed to implement modularized
drivers. The public symbol table can be read in text form from the
file /proc/ksyms
.
When your module is loaded, any global symbol you declare becomes
part of the kernel symbol table, and you can see it
appear in /proc/ksyms
or in the output of the ksyms
command.
New modules can use symbols exported by your module, and you can stack new modules on top of other modules. Module stacking is implemented in the mainstream kernel sources as well: the msdos filesystem relies on symbols exported by the fat module, and the ppp driver stacks on the header compression module.
Module stacking is useful in complex projects. If a new abstraction is implemented in the form of a device driver, it might offer a plug for hardware-specific implementations. For example, a frame buffer video driver can export symbols to be used by a lower-level VGA driver. Each user loads the frame buffer module and the specific VGA module for his or her installed hardware.
Layered modularization can help reduce development time by simplifying each layer. This is similar to the separation between mechanism and policy that we discussed in Chapter 1.
Registering Symbol Tables
An alternative to exporting all the global symbols of your module is to use the function register_symtab, which is ...
Get Linux Device Drivers now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.