精通init ramfs构建

一、init ramfs是什么  

在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件。当内核启动时,会 从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进 程。这个init进程负责启动系统后续的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话)。如果内核没有在rootfs中找到init文件,则内核会按以前版本的方式定位、挂载根分区,然后执行/sbin/init程序完成系统的后续初始化工作。

   这个压缩过的cpio格式的打包文件就是init ramfs。编译2.6版本的linux内核时,编译系统总会创建init ramfs,然后把它与编译好的内核连接在一起。内核源代码树中的usr目录就是专门用于构建内核中的init ramfs的,其中的ini tramfs_data.cpio.gz文件就是init ramfs。缺省情况下,init ramfs是空的,X86架构下的文件大小是134个字节。

  二、构建第一个init ramfs:hello world

  从C语言开始,学习计算机编程语言的第一个程序几乎都是hello world,因此我们也构建一个最简单的hello world式的init ramfs,以说明init ramfs的基本构建方法。

  init ramfs的灵魂是init文件(或者叫程序,因为它会被内核第一个执行),我们先写一个简单的init程序,它会在内核的console中打印出经典的hello world信息。

  hello.c:

  #include

  #include

  int main(int argc,char argv[])

  {

  printf("hello world, from init ramfs.n");

  sleep(9999999);

  return 0;

  }

  其中的sleep()函数语句是为了避免执行时内核很快打出panic的信息,并非功能上的需要。

  接着把hello.c编译成静态连接程序:

  gcc -o hello_static -static -s hello.c

  命令行中的-s参数表示编译后的程序不包含调试定位信息,目的是减少编译出来的程序文件的大小。

  再创建一个init ramfs的构建源文件目录image,把hello_static程序拷入这个目录,并改名为init。

  在image目录下,创建一个dev/console的设备文件,否init程序无法在内核console中输出信息:

  mknod -m 600 dev/console c 5 1

  注意,执行这个命令需要有root权限。

  好了,现在可以设置内核配置参数,进行init ramfs的构建了:

   在general setup配置目录下的init ramfs sources配置项下输入image的路径名,比如我的路径就是/home/wyk/init ramfs-test/image。因为我们的init程序是ELF格式的,所以内核需要支持ELF的可执行文件,否则启动这个init程序会失败。在内 核的 Executable file formats配置目录下,选择 kernel support for ELF binaries,则可使内核支持ELF格式的可执行文件。其他内核配置参数根据实际需要设置即可,不过,为了减少内核编译时间,可参考这篇文章 http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type- blog-itemid-293122.html设置一个最简单的内核配置。

  内核配置参数设置完成后,按常规的内核编译方法进行编译,init ramfs就自动连接到编译好的内核映像文件中了。

  三、试验环境搭建

   试验init ramfs需要经常重启系统,所以使用CPU模拟器是不错的选择。我们可以选用qemu,它支持直接启动linux内核,无需在模拟器中安装OS。从方便 使用的角度考虑,我们采用qemu launcher设置qemu的各项参数,它的安装可参考http://linuxman.blog.ccidnet.com/blog-htm-do- showone-uid-60710-type-blog-itemid-612280.html。

  在qemu launcher的linux配置标签中,打勾直接启动linux,然后在下面的文本框中填上刚才编译好的内核映像文件的路径名。因为qemu的运行还需要设置硬盘映像文件,所以还需要在左边的配置标签中新建一个硬盘映像文件,但实际上我们并不使用硬盘。

  配置好qemu的参数后,点击launcher按钮,内核就开始在qemu中运行了。内核输出一堆内核运行信息后,最后打出了

  hello world, from init ramfs.

  哈哈,我们构建的init ramfs已经能够正常工作了!

转载于:https://www.cnblogs.com/linengier/archive/2013/03/30/2990293.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 示例_带有示例的Python date isocalendar()方法

python 示例Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method is used to manipulate objects of date class of module datetime. date.isocalendar()方法用于操作模块datetime的日期类的对象。 It uses a date class object a…

mysql 函数重载_[赋值]函数,变量,重载 ,_第1页_169IT

[java/j2ee] java实现简单的给sql语句赋值的示例代码本身很简单。拼接sql的时候?不好数,简单的用来赋值。代码如下:/** * TODO 循环赋值,缺少的类型可随时添加 * author Lucius * param pt * param list * throws SQLException */ public static…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

Opencv——写入或读取数据到XML或YAML文件

什么是XML、YAML文件 XML(eXtensible Markup Language)是一种元标记语言。所谓“原标记”,就是开发者可以根据自身需要定义的标记,任何满足XML命名规则的名称都可以标记。此外,XML是一种语义/结构化语言,它描述了文档的结构和语义…

mysql 迁移 nosql_从关系型Mysql到Nosql HBase的迁移实践

2013年11月22-23日,作为国内唯一专注于hadoop技术与应用分享的大规模行业盛会,2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒店隆重举行。来自国内外各行业领域的近千名CIO、CTO、架构师、IT经理、咨询顾问、工程师、Hadoop…

Oracle EBS数据定义移植工具:FNDLOAD

在实际的EBS二次开发中,我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义,如在EBS二次开发中并发请求的定义会涉及到:可执行、并发程序、值集、请求组等的定义,定义需要从开发环境、测试环境、UAT环境一直到正…

21-特征匹配方法(Brute-Force蛮力匹配)

Brute-Force蛮力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示两个特征点相互匹配 例如A中的第i个特征点与B中的第j个特征点最近,并且B中的第j个特征点到A中的第i个特征点也是 NORM_L2:归一化数组的(欧几里得距离),如果其他特征计算…

weakhashmap_Java WeakHashMap values()方法与示例

weakhashmapWeakHashMap类values()方法 (WeakHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get the values that exist in this map to be viewed in a collection. val…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换【1】几何变换(空间变换)简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换(不做展示)1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线Y…

用于主题检测的临时日志(e1784e6f-037e-45de-bad1-8bbc239818ee - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...

这是一个未删除的临时日志。请手动删除它。(578392f7-2207-4b01-b36d-c483f0699988 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)转载于:https://www.cnblogs.com/Fly-sky/archive/2011/03/03/1969850.html

probuffer java_Protocol Buffer的使用

Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同:一个是数据结构化,一个是数据序列化。这里的数据结构化…

根据DbSchema生成代码2

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Threading; using System.IO; using Rocky;namespace Rocky.CodeBuilder {public class DbBuilder : Disposable{#region 字段public even…

22-随机抽样一致算法RANSAC

随机抽样一致算法(Random sample consensus,RANSAC) 看似复杂,其基本思想就是:随机选取俩点,然后连接,给定一个容忍范围,在这个范围内的点越多越好,然后不断的迭代进行找两点之间容忍范围内点最…

treeset比较器_Java TreeSet比较器()方法与示例

treeset比较器TreeSet类的compare()方法 (TreeSet Class comparator() method) comparator() method is available in java.util package. 比较器()方法在java.util包中可用。 comparator() method is used to get the Comparator object based on customizing order the eleme…

智能车复工日记【1】——菜单索引回顾

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 菜单回顾 1、系列文章解析结构元素菜单图示菜单缺点:1、系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能…

[转载]Oracle 11g R1下的自动内存经管(2)

AMM调整 除现有的用于内存经管的V$视图外,Oracle 11g还新添加了下面4个视图用于自动内存经管: ? ◆V$MEMORY_CURRENT_RESIZE_OPS ? ◆V$MEMORY_DYNAMIC_COMPONENTS ? ◆V$MEMORY_RESIZE_OPS ? ◆V$MEMORY_TARGET_ADVICE 转载于:https://www.cnblogs.…

23-背景建模

帧差法 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标&#xf…

DB2 9 运用开辟(733 考试)认证指南,第 3 部门: XML 数据独霸(4)

议决运用顺序存储和检索 XMLXML 编码字符编码在汗青上,术语 字符集、字符编码 和 码页 都有雷同的意义:一个字符集和一个二进制码集,其中每个码示意一个字符。(码页是来自 IBM 的一个术语,示意一个大型主机或 IBM PC 上…

system.setin_Java System类setIn()方法及示例

system.setin系统类setIn()方法 (System class setIn() method) setIn() method is available in java.lang package. setIn()方法在java.lang包中可用。 setIn() method is used to assign again the standard input stream. setIn()方法用于再次分配标准输入流。 setIn() met…

Opencv——霍夫变换以及遇到的一些问题

目录问题1 :颜色空间转换函数参数问题:CV_BGR2GRAY vs CV_GRAY2BGR问题2:cvRound()、cvFloor()、cvCeil()函数用法霍夫变换的含义标准霍夫直线变换霍夫线变换函数参数讲解累计概率霍夫变换霍夫变换圆变换原理和算法步骤:霍夫圆变换…