Linux学习 :Uboot, Kernel, 根文件系统初步分析
1.U-Boot启动内核的过程可以分为两个阶段:
1)第一阶段的功能
- 硬件设备初始化
- 加载U-Boot第二阶段代码到RAM空间
- 设置好栈
- 跳转到第二阶段代码入口
2)第二阶段的功能
- 初始化本阶段使用的硬件设备
- 检测系统内存映射
- 将内核从Flash读取到RAM中
- 为内核设置启动参数
- 启动内核
关于uboot 启动分析以下这条链接写的不错,使用的是MINI2440平台:
http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html
2.编译Kernel:
Makefile 可以参考:/arch/arm/kernel/kbuild/Makefile.txt
config : (1) autoconf.h
(2) auto.conf
编译后可根据: /arch/arm/kernel/head.S 和 /arch/arm/kernel/vmlinux.lds 分析启动流程。
内核启动完挂接根文件系统,然后启动应用程序。
3.构建根文件系统:jffs2 , yaffs2
内核启动应用程序:①open(/dev/console) : 终端。 ②通过run_init_process 启动程序。
init程序(即busybox):①读取配置文件(/etc/inittab)。 ②解析配置文件。 ③执行(客户定制程序)。
busybox : ls, cp, cd等指令(应用)的集合。
->init_main -> parse_inittab -> file = fopen(INITTAB, "r");
inittab格式:<id>:<runlevels>:<action>:<process>
id => /dev/id ,用作终端:stdin, stdout, stderr: printf,scanf,err.
runlevels: 忽略
action: 执行时机: sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, shutdon.
process: 应用程序或脚本
(一)根据配置文件或默认设置构造action:
static void new_init_action(init action, const char *command, const char *cons)
-> new_init_action(ASKFIRST, "-/bin/sh", "/dev/tty2"); 反推出配置文件:tty2::askfirst:-/bin/sh
①创建一个init_action结构,填充。
②放入init_action_list链表。
(二)执行action:多种action类型
run_actions(SYSINIT);
run_actions(WAIT);
run_actions(ONCE);
while(1){
run_actions(RESPAWN);
run_actions(ASKFIRST);
wpid = wait(NULL);
while (wpid > 0){
a->pid = 0;
}
}
最小根文件系统构成:①/dev/console , /dev/null ②init => busybox. ③/etc/inittab ④inittab配置文件指定的程序 ⑤程序依赖的库(C库)。
构建根文件系统:
①參考INSTALL如何編譯busybox:(以下构建init)
make defconfig : 使用默认配置减少一些配置工作
make menuconfig : Build Options 配置編譯選項。
make
make CROSS_COMPILE=arm-linux- 或 在Makefile中指定编译工具链。
ARCH ?=arm
CROSS_COMPILE ?= arm-linux-
make CONFIG_PREFIX=/work/nfs_root/fs_mini/ install (指定你要编译到的目录,直接install可能会破坏pc机系统)
②制作根文件系统:(完善最小系统)
测试指令: sudo mknod console c 5 1
安装glibc库: mkdir -p /work/nfs_root/fs_mini/lib
cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib //进入交叉编译器glibc库目录
cp *so* /work/nfs_root/fs_mini/lib -d(如果是链接文件依然保持链接形式)
制作系统映像:
编译安装yaffs2image文件系统制作工具
1、下载yaffs2源码包:git clone git://www.aleph1.co.uk/yaffs2
2、解压
3、为了使内核支持yaffs2源码,必须为内核打补丁:.
进入yaffs2根目录,执行/patch-ker.sh c m /home/zdl/study/linux-2.6.10-fs2410/linux-2.6.10,
其中c表示复制 m代表复合版本,另外与之相对立的参数 l表示仅链接不复制文件,s代表单一版本,因为yaffs目前具有yaffs和yaffs2两个源码包。
使用方法:mkyaffs2image /work/nfs_root/fs_mini fs_mini.yaffs2
挂在虚拟根文件系统:mkdir proc
mount -t proc null /proc //可以加入/etc/init.d/rcS 脚本中开机自动挂载
另一种方法:mount -a //依赖/etc/fstab
fstab格式:#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
udev机制:自动创建/dev/设备节点
busybox默认的简化版mdev使用:参考mdev.txt ,同样可以在fstab中指定mount。
编译制作jffs2映像文件的工具:
cd /work/GUI/xwindow/X/deps
tar xzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --shared --prefix=/usr
make
sudo make install
然后编译 mkfs.jffs2
cd /work/tools
tar xjf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install
制作jffs2映像文件:
cd /work/nfs_root
mkfs.jffs2 -n -s 2048-e 128KiB -d fs_mini -o fs_mini.jffs2
网络文件系统NFS使用:
配置nfs服务:sudo vi /etc/exports
重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart
使用nfs服务:mount -t nfs -o nolock 192.168.1.19:/work/nfs_root/ mini_fs
直接从nfs启动:参考nfsroot.txt配置 ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/mini_fs ip=192.168.1.11:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off
Linux学习 :Uboot, Kernel, 根文件系统初步分析的更多相关文章
- 关于UBOOT,LINUX内核编译,根文件系统的15个小问题
(1)内核默认运行地址和加载地址在哪里设置? 由 arch/arm/kernel/vmlinux.lds.S 生成的 arch/armkernel/vmlinux.lds决定 (2)从FLASH什 ...
- 如何在 Linux 虚拟机上扩展根文件系统
问题描述 通过 Azure 平台部署的 Linux 虚拟机默认的根文件系统容量有限,需要进行扩展. 问题分析 由于 Azure 平台部署的 Linux 虚拟机默认根文件系统容量比较小,客户在使用过程中 ...
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- linux 内核移植和根文件系统的制作
1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1 Linux版本 Linux内核的版本号 ...
- Linux学习笔记之 Btrfs文件系统简介及使用
Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. Btrfs相关介绍: Btrf ...
- linux学习10 Linux目录结构和根文件系统全面讲解
一.回顾 1.如何获取使用帮助 help,--help,man,info 官方文档,自带文档(README,CHANGELOG,INSTALL),官方文档 发行版的文档 Google Linux Ke ...
- Linux--安装过程中的根文件系统的分析
前言: 在这篇文章中S3C6410公版的Linux BSP和U-Boot为了分析,名词和数据文件的所有内容本文是基于环境为例,所有的代码是在设置的示例进行分析的过程中.哈. 假设有不对或者不完好的地方 ...
- 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代码如下: static int __in ...
- Linux内核启动及根文件系统载入过程
上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-bo ...
随机推荐
- Less环境搭建
1.在页面中加入 .less 样式表的链接,并将 rel 属性设置为 "stylesheet/less": <link rel="stylesheet/less&q ...
- LEfSe分析
LEfSe软件用于发现两组或两组以上的biomarker,主要是通过非参数因子Kruskal-Wallis秩和检验来实现的.运行LEfSe软件主要分三大步骤:第一步:需要把普通的物种.基因等等的丰度信 ...
- [转]抓取安卓APP内接口的方法--Charles
http://blog.csdn.net/yyh352091626/article/details/52759294
- Nodejs学习总结 -Express入门(一)
Express是基于Node.js平台开发的Web应用开发框架,下面我们入手学习. 官网 : http://www.expressjs.com.cn/ github:https://github.co ...
- PR曲线,ROC曲线,AUC指标等,Accuracy vs Precision
作为机器学习重要的评价指标,标题中的三个内容,在下面读书笔记里面都有讲: http://www.cnblogs.com/charlesblc/p/6188562.html 但是讲的不细,不太懂.今天又 ...
- mac 工具集
1.brew brew 全名叫homebrew,引用官网的一句话就是 "The missing package manager for macOS",意思brew是mac os上不 ...
- 【腾讯云的1001种玩法】在腾讯云上创建您的SQL Cluster(5)
版权声明:本文由李斯达 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/97264001482830465 来源:腾云阁 h ...
- CI 3.0.6 控制器打印base_url 地址不为 localhost的解决方法
1.在application\config\autoload.php 第92行 加载url $autoload['helper'] = array('url'); 2.application\c ...
- CI3.0控制器下面建文件夹 访问一直404 的解决方法
在单入口文件(框架目录下面的index.php)最下面的require_once BASEPATH.'core/CodeIgniter.php';这行上面设置一个路径,是相对于conrollers文件 ...
- Android开发之JavaMail发送邮件(用户反馈)
给APP增加了一个用户反馈的小功能,由于懒的搭服务器,所以就用邮件的形式进行通信,有如下两种方式: 1.使用调用手机上的其他程序完成邮件发送 2.使用javamail进行邮件发送 这里果断使用java ...