本章学习如何启动第一个应用程序

1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序:

kernel_init函数代码如下:

static int __init kernel_init(void * unused)    //进入init进程                                  
{    
   prepare_namespace()  //挂载根文件系统
   {
     ... ...      / /通过解析出来的命令行参数” root=/dev/mtdblock3”来挂接根文件系统 mount_root();   //开始挂载
   }

   init_post();           //启动应用程序     
}
}

2.接下来开始分析init_post()如何启动应用程序的,代码如下:

static int noinline init_post(void)
{
  /*内核已经初始化完成,所以清除__init_begin段到__init_end段之间的数据*/
       free_initmem();
       unlock_kernel();
       mark_rodata_ro();
       system_state = SYSTEM_RUNNING;
       numa_default_policy(); 

/*  打开dev/console控制台设备(串口0),使用户能输入信息, /dev/console即成为kernel_init进程的标准输入源(文件描述符0),
打开失败则打印Warning: unable to open an initial console.\n
*/ if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) printk(KERN_WARNING "Warning: unable to open an initial console.\n");

当我们删除根文件系统的内容再启动内核,发现串口就会打印上面的字符串,如下图:

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

会显示打开dev/console失败,是因为根文件系统还是在root=/dev/mtdblock3, 所以能挂载根文件系统,我们擦除了mtd3内容,也就是dev里面的内容,所以无法打开console控制台。 

接下来继续分析init_post():

/*调用dup打开/dev/console文件描述符两次, 该控制台设备就也可以供标准输出和标准错误使用(文件描述符1和2),
kernel_init进程现在就拥有3个文件描述符--标准输入、标准输出以及标准错误。
*/ (void) sys_dup(0); (void) sys_dup(0);
if (ramdisk_execute_command) { //若 ramdisk_execute_command为0,不运行它 run_init_process(ramdisk_execute_command); printk(KERN_WARNING "Failed to execute %s\n", ramdisk_execute_command); }

搜索上面ramdisk_execute_command,发现它是一个char型全局数组,找到它被用在init_setup()中,代码如下:

static int __init rdinit_setup(char *str)
{
         unsigned int i;
  
   /* 使ramdisk_execute_command数组等于str  *、
         ramdisk_execute_command = str;     

         /* See "auto" comment in init_setup */
         for (i = 1; i < MAX_INIT_ARGS; i++)
                   argv_init[i] = NULL;
         return 1;
}

__setup("rdinit=", rdinit_setup);
ramdisk_execute_command

相关文章:

  • 2022-12-23
  • 2022-01-01
  • 2021-09-19
  • 2021-07-25
  • 2022-12-23
  • 2021-12-18
  • 2022-01-08
  • 2022-12-23
猜你喜欢
  • 2021-12-12
  • 2021-10-30
  • 2022-12-23
  • 2021-08-16
  • 2021-06-12
  • 2022-12-23
  • 2021-10-16
相关资源
相似解决方案