当前位置: 首页 > news >正文

day12-内核与文件系统衔接流程

static int __init kernel_init(void * unused)

        init_post();       

init_post(): 这是内核启动应用程序的接口

static noinline int init_post(void)
{/* need to finish all async __init code before freeing the memory */async_synchronize_full();free_initmem();mark_rodata_ro();system_state = SYSTEM_RUNNING;numa_default_policy();current->signal->flags |= SIGNAL_UNKILLABLE;if (ramdisk_execute_command) {run_init_process(ramdisk_execute_command);printk(KERN_WARNING "Failed to execute %s\n",ramdisk_execute_command);}/** We try each of these until one succeeds.** The Bourne shell can be used instead of init if we are* trying to recover a really broken machine.*///如果命令行被定义,则执行自定义的程序if (execute_command) {run_init_process(execute_command);printk(KERN_WARNING "Failed to execute %s.  Attempting ""defaults...\n", execute_command);}//若命令行为空,则顺序执行默认程序run_init_process("/sbin/init");//都是由busybox所提供run_init_process("/etc/init");run_init_process("/bin/init");run_init_process("/bin/sh");panic("No init found.  Try passing init= option to kernel. ""See Linux Documentation/init.txt for guidance.");
}

execute_commandinit_setup函数中被赋值

static int __init init_setup(char *str)
{unsigned int i;execute_command = str;/** In case LILO is going to boot us with default command line,* it prepends "auto" before the whole cmdline which makes* the shell think it should execute a script with such name.* So we ignore all arguments entered _before_ init=... [MJ]*/for (i = 1; i < MAX_INIT_ARGS; i++)argv_init[i] = NULL;return 1;
}
__setup("init=", init_setup);//在init.h中定义#define __setup(str, fn)					\__setup_param(str, fn, fn, 0)//__setup_param定义
#define __setup_param(str, unique_id, fn, early)			\static const char __setup_str_##unique_id[] __initconst	\__aligned(1) = str; \static struct obs_kernel_param __setup_##unique_id	\__used __section(.init.setup)			\__attribute__((aligned((sizeof(long)))))	\= { __setup_str_##unique_id, fn, early }struct obs_kernel_param {const char *str;int (*setup_func)(char *);int early;
};

obsolete_checksetup处理early为0的命令 

static int __init obsolete_checksetup(char *line)
{const struct obs_kernel_param *p;int had_early_param = 0;p =  _start;do {int n = strlen(p->str);if (parameqn(line, p->str, n)) {if (p->early) {/* Already done in parse_early_param?* (Needs exact match on param part).* Keep iterating, as we can have early* params and __setups of same names 8( */if (line[n] == '\0' || line[n] == '=')had_early_param = 1;} else if (!p->setup_func) {printk(KERN_WARNING "Parameter %s is obsolete,"" ignored\n", p->str);return 1;} else if (p->setup_func(line + n))return 1;}p++;} while (p < __setup_end);return had_early_param;
}

 do_early_param处理early为1的命令

/* Check for early params. */
static int __init do_early_param(char *param, char *val)
{const struct obs_kernel_param *p;for (p = __setup_start; p < __setup_end; p++) {if ((p->early && parameq(param, p->str)) ||(strcmp(param, "console") == 0 &&strcmp(p->str, "earlycon") == 0)) {if (p->setup_func(val) != 0)printk(KERN_WARNING"Malformed early option '%s'\n", param);}}/* We accept everything at this stage. */return 0;
}

execute_command:

        UBOOT传入的"init=linuxrc"

        execute_command=linuxrc

if (linuxrc) 
        run_init_process(linuxrc);//内核切换到了linuxrc程序执行

在linux中linuxrc指向了busybox

相关文章:

  • css控制卡片内部的左右布局
  • 高等数学教材啃书汇总重难点(二)导数与微分
  • RPA在财务预测和分析中的应用
  • Bard和ChatGPT的一些比较
  • 现一个智能的SQL编辑器
  • 一手app拉新地推平台和网推平台升级啦 官签渠道直营
  • 工业物联网模块应用之砂芯库桁架机器人远程无线控制
  • 支持内录系统声音的Mac录屏软件Omi Recorder
  • cmakelist、cmake、makefile、make以及gcc的关系和区别
  • ZZ308 物联网应用与服务赛题第G套
  • Redis系列-Redis过期策略以及内存淘汰机制【6】
  • 在idea命令行,or linux 终端执行命令,快速获取通过脚本上证指数、创业板实时行情
  • Django框架简介
  • 批量添加Via
  • 【深度学习】pytorch——神经网络工具箱nn
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【刷算法】求1+2+3+...+n
  • CSS3 变换
  • javascript 哈希表
  • JS专题之继承
  • opencv python Meanshift 和 Camshift
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 构造函数(constructor)与原型链(prototype)关系
  • 简单易用的leetcode开发测试工具(npm)
  • 目录与文件属性:编写ls
  • 排序(1):冒泡排序
  • 区块链将重新定义世界
  • 如何进阶一名有竞争力的程序员?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 收藏好这篇,别再只说“数据劫持”了
  • 网页视频流m3u8/ts视频下载
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • ()、[]、{}、(())、[[]]命令替换
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • ***详解账号泄露:全球约1亿用户已泄露
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net CF下精确的计时器
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @SentinelResource详解
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++基础]-入门知识
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [FZSZOJ 1223] 上海红茶馆