背景:做linux 驱动,但是从来没有想过module_init 函数的实现原理。都是按照框架然后就开始写了。现在想做一个记录。
解析:
驱动加载到内核中有两种方式。第一:编译进内核里,随内核启动。第二:动态加载到内核中(insmod)。
这两种方式对module_init 的使用是不一样的。先简单的总结一下:
第一种:在内核的 init.text __start 和 __end 段中被统一初始化。
第二种:由busybox 中的insmod_main 函数到调用syscall() 函数。将用户态的.ko 文件注册到内核态中运行。自然module_init 函数就由insmod 命令调用执行。这个最重要的是理解syscall () 函数,init 和 exit 都是调用的syscall() 函数。
------------------------------------------------------------ 华丽的分割线 --------------------------------------------------------
上面总结了。下面附上我看到的链接吧,我感觉最重要的是上面的一段。
第一种:https://blog.csdn.net/ffmxnjm/article/details/71713670
第二种:https://blog.csdn.net/menghuanbeike/article/details/77979497 https://blog.csdn.net/feixin620/article/details/78416560