I am reading LDD3 and had a doubt regarding the usage of static storage class in the __init and __exit function calls. http://static.lwn.net/images/pdf/LDD3/ch02.pdf
"Initialization functions should be declared static, since they are not meant to be visible outside the specific file; there is no hard rule about this, though, as no function is exported to the rest of the kernel unless explicitly requested"
But then the kernel is able to use init and exit function using insmod and rmmod system calls. If static functions are functions that are only visible to other functions in the same file, then how is the kernel able to use the __init and __exit functions defined static in our module?