day14-文件系统工作流程分析

1.内核启动文件系统后,文件系统的工作流程

1.参数的接收

2.参数的解析

3.参数的应用

问题:

  1. UBOOT 传给 KERNEL 的参数是以tagglist进行的

KERNEL 传给 文件系统(busybox)的参数是以什么进行的?

  1. 在整个文件系统中都需要什么组件?

文件系统初始化流程

parse_inittab()

file = fopen(INITTAB, "r"); //#define INITTAB "/etc/inittab"

if (file == NULL) {

/* Reboot on Ctrl-Alt-Del */

new_init_action(CTRLALTDEL, "reboot", "");

/* Umount all filesystems on halt/reboot */

new_init_action(SHUTDOWN, "umount -a -r", "");

/* Swapoff on halt/reboot */

if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");

/* Prepare to restart init when a HUP is received */

new_init_action(RESTART, "init", "");

/* Askfirst shell on tty1-4 */

new_init_action(ASKFIRST, bb_default_login_shell, "");

new_init_action(ASKFIRST, bb_default_login_shell, VC_2);

new_init_action(ASKFIRST, bb_default_login_shell, VC_3);

new_init_action(ASKFIRST, bb_default_login_shell, VC_4);

/* sysinit */

new_init_action(SYSINIT, INIT_SCRIPT, "");

inittab的格式:

Format for each entry: <id>:<runlevels>:<action>:<process>

文件系统默认的参数解析:

cs 复制代码
static void new_init_action(int action, const char *command, const char *cons)
{
	struct init_action *new_action, *a, *last;

	if (strcmp(cons, bb_dev_null) == 0 && (action & ASKFIRST))
		return;

	/* Append to the end of the list */
	for (a = last = init_action_list; a; a = a->next) {
		/* don't enter action if it's already in the list,
		 * but do overwrite existing actions */
		if ((strcmp(a->command, command) == 0)
		 && (strcmp(a->terminal, cons) == 0)
		) {
			a->action = action;
			return;
		}
		last = a;
	}

	new_action = xzalloc(sizeof(struct init_action));
	if (last) {
		last->next = new_action;
	} else {
		init_action_list = new_action;
	}
	strcpy(new_action->command, command);
	new_action->action = action;
	strcpy(new_action->terminal, cons);
	messageD(L_LOG | L_CONSOLE, "command='%s' action=%d tty='%s'\n",
		new_action->command, new_action->action, new_action->terminal);
}

struct init_action {
	struct init_action *next;
	int action;
	pid_t pid;
	char command[INIT_BUFFS_SIZE];
	char terminal[CONSOLE_NAME_SIZE];
};

默认的inittab:

::ctrlaltdel:/sbin/reboot

::shutdown:/sbin/swapoff -a

::shutdown:/bin/umount -a -r

::restart:/sbin/init

::askfirst:/bin/sh

tty2::askfirst:/bin/sh

tty3::askfirst:/bin/sh

tty4::askfirst:/bin/sh

::SYSINIT:/etc/init.d/rcS

参数使用流程

run_actions(SYSINIT);

waitfor(a, 0); //运行该action对应的命令函数,并且等待其退出

启动流程:

run_actions(SYSINIT); //运行::SYSINIT:/etc/init.d/rcS脚本,并且等待退出

run_actions(WAIT);

run_actions(ONCE);

cs 复制代码
	while (1) {
		/* run the respawn stuff */
		run_actions(RESPAWN);

		/* run the askfirst stuff */
		run_actions(ASKFIRST);//:/bin/sh

		/* Don't consume all CPU time -- sleep a bit */
		sleep(1);

		/* Wait for a child process to exit */
		wpid = wait(NULL);
		while (wpid > 0) {
			/* Find out who died and clean up their corpse */
			for (a = init_action_list; a; a = a->next) {
				if (a->pid == wpid) {
					/* Set the pid to 0 so that the process gets
					 * restarted by run_actions() */
					a->pid = 0;
					message(L_LOG, "process '%s' (pid %d) exited. "
							"Scheduling it for restart.",
							a->command, wpid);
				}
			}
			/* see if anyone else is waiting to be reaped */
			wpid = waitpid(-1, NULL, WNOHANG);
		}
	}

一个文件系统都需要什么?

1./dev/console

2.init_main函数---->busybox

3./etc/init.d/rcS--脚本

4.因为需要运行shell命令,所以要有shell命令的支持函数--->busybox

5.标准库函数,包含glibc

相关推荐
SHENGWEI胜为4 小时前
二层网络广播风暴如何排查?从交换机接口计数器到 STP 拓扑变化分析
网络
艾芯微科技5 小时前
HR911130C|汉仁 HANRUN 集成变压器千兆 RJ45 网口参数、电路、PCB 布线、替代与采购避坑
网络·单片机·嵌入式硬件·集成测试·51单片机
日常筹谋记5 小时前
工业厂房 TPO 防水卷材:技术需求如何传导到配方层面?
运维·网络·html
迷途之人不知返5 小时前
【文件系统】-4-软硬连接
linux
老歌老听老掉牙5 小时前
WorkBuddy 如何接入 PrePoMax 的 MCP 服务器
服务器·ai·mcp
Linux_cy6 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
1234567890@world8 小时前
正点原子 ATK-DLRK3568 嵌入式Linux系统开发手册V1.3 详细总结
linux·stm32·单片机
sun_weitao8 小时前
极简版 MCP 工具实现方案
java·linux·服务器
玄芯散人9 小时前
【元婴·106】I2C总线:地址冲突、Clock Stretching、总线死锁怎么破
网络
YH_Analytics9 小时前
2026 年增亮膜(DBEF)行业市场格局深度解析
大数据·网络