电脑技术学习

FreeBSD的Loader和内核初始化

dn001

 7 .set.cons_set 00000014 c03164c0 c03164c0 002154c0 2**2
         CONTENTS, ALLOC, LOAD, DATA
 8 .set.kbddriver_set 00000010 c03164d4 c03164d4 002154d4 2**2
         CONTENTS, ALLOC, LOAD, DATA
 9 .set.scrndr_set 00000024 c03164e4 c03164e4 002154e4 2**2
         CONTENTS, ALLOC, LOAD, DATA
10 .set.scterm_set 0000000c c0316508 c0316508 00215508 2**2
         CONTENTS, ALLOC, LOAD, DATA
11 .set.sysctl_set 0000097c c0316514 c0316514 00215514 2**2
         CONTENTS, ALLOC, LOAD, DATA
12 .set.sysinit_set 00000664 c0316e90 c0316e90 00215e90 2**2
         CONTENTS, ALLOC, LOAD, DATA

  这一屏信息显示表明节.set.sysinit_set有0x664字节的大小,所以0x664/sizeof(void *)个sysinit对象被编译进了内核。其它节,如.set.sysctl_set表示其它链接器集合。通过定义一个类型为struct linker_set的变量,节.set.sysinit_set将被“收集到那个变量里:sys/kern/init_main.c:

   extern struct linker_set sysinit_set; /* XXX */
struct linker_set定义如下:/usr/include/linker_set.h:
 struct linker_set {
  int ls_length;
  void  *ls_items[1];    /* ls_length个项的数组, 以NULL结尾 */
};
译者注: 实际上是说,用C语言结构体linker_set来表达那个ELF节。第一项是sysinit对象的数量,第二项是一个以NULL结尾的数组,数组中是指向那些对象的指针。回到对mi_startup()的讨论,我们清楚了sysinit对象是如何被组织起来的。函数mi_startup()将它们排序,并调用每一个对象。最后一个对象是系统调度器:/usr/include/sys/kernel.h:

标签: