嵌入式Linux学习——构建根文件系统

1 内核启动

  内核启动最后调用init_post(),如果uboot中指定了的ramdisk_execute_command或execute_command,则执行对应的程序。否则,执行配置文件。若没有配置文件,则启动失败。
  ramdisk_execute_command——对应“rdinit=…”
  execute_command——对应“init=…”

static noinline int init_post(void)
	__releases(kernel_lock)
{
	...
	
	if (ramdisk_execute_command) {
		run_init_process(ramdisk_execute_command);
		printk(KERN_WARNING "Failed to execute %s\n",
				ramdisk_execute_command);
	}

	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");
	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.");
}

2 busybox

  busybox即常用的指令集合,体积小,便于应用于嵌入式系统中。
  开发板中ls、cp、vi等命令都在/bin目录中,不过它们的链接地址都是放在了busybox里。比如:执行ls命令,其实就是执行 busybox ls。在busybox中,例如,执行cp指令时,会去调用cp_main(),初始化init.c中有init_main()。
  看busybox源码调用流程:

init.c/init_main-->
	parse_inittab--->
		new_init_action

  首先会去读取配置文件,并加入到链表init_action_list中。配置文件中,每个配置项格式:

<id>:<runlevels>:<action>:<process>

  id: id 会等于/dev/id, 用做终端(标准输入、标准输出以及标准错误) ,这个可以不需要设置,因为/etc/console已经设为标准输入输出了,如不设置就等于dev/null,则从控制台输入输出。
  runlevels:可以被忽略
  action: 运行时机
  process:应用程序或者脚本
  之后在init_main中,通过run_actions执行。

3 移植

  busybox版本:busybox-1.14.4
  解压后,

make clean

  修改Makefile

CROSS_COMPILE = arm-linux-
ARCH = arm

  执行make menuconfig,修改配置项:
(1)

Busybox Settings --->
	Build Options --->
		[*]Build BusyBox as a static binary(no shared libs)

(2)

Busybox Settings --->
	Busybox Library Tuning --->
		[*]vi-style line editing commands
		[*]username completion
		[*]fancy shell prompts

(3)

Linux Module Utilities -->
	[]Simplified modutils
	[*]insmod
	[*]rmmod
	[*]lsmod
	[*]modprobe

  编译make,安装到指定目录

make CONFIG_PREFIX=自己的目录 install

4 构建根文件系统

  (1)建立系统目录
  在busybox的安装目录

mkdir dev etc home lib mnt proc sys tmp var opt root
mkdir -p etc/init.d

  (2)创建设备文件
  这里使用静态创建,也可参考mdev使用。

cd dev
mknod console c 5 1
mknod null c 1 3
mknod ttySAC0 c 204 64
mknod mtdblock0 b 31 0
mknod mtdblock1 b 31 1
mknod mtdblock2 b 31 2
mknod mtdblock3 b 31 3

  (3)创建etc/inittab

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh

  (4)创建etc/init.d/rcS

#!/bin/sh
mount -a

  并修改权限

chmod +x etc/init.d/rcS

  mount -a会挂接/etc/fstab文件内容。
  (5)创建etc/fstab

none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /tmp tmpfs defaults 0 0

  (6)拷贝库文件

cd lib
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/armv4t/usr/lib/*.so* ./ -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/armv4tlib/*.so* ./ -d

  使用mkyaffs2image工具制作成镜像文件,下载到开发板。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值