linux 内核驱动加载

今天心血来潮,想写一下linux 驱动加载概要。

        在u-boot 运行完之后,就开始进行kernel 加载。  那么这个kernel 是依据什么来加载的, 各个驱动的加载顺序是怎样的?下面以3.10 的kernel 从大的方面概要说明一下,不正之处,敬请指正。

       1.  从kernel start 到驱动加载的函数顺序  start_kernel()-> rest_init()-> kernel_init() -> do_basic_setup() -> do_initcalls() -> do_one_initcall(initcall_t fn) -> 


   2. start_kernel() 到 do_basic_setup() 都是对系统及 cpu 等相关做初始化的动作。 这里就不多讲


   3. 驱动的加载主要是在do_initcalls() 函数中实现, 关注该函数中如下部分:

      for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) {
do_one_initcall(*fn);

      }

      这个for循环是按照level来加载驱动, 系统将所有的驱动分成了多个level, 对于同一级别的驱动,系统就按照编译顺序来逐个加载。调试发现 对于每一level的

驱动,都是从__initcalln_start 开始, 加载完后,再加载下一level的这组驱动。 

      将 initcall_levels[level] 和 *fn 打印出来 , 发现它们的值都可以在 system.map中找到。 其中*fn就是驱动中各个函数的地址。

      好了,今天就概括到这里,细节部分后面文件再讲。







你可能感兴趣的:(linux)