×

CramFS根文件系统的移植解析

消耗积分:1 | 格式:rar | 大小:0.4 MB | 2017-11-06

分享资料个

根文件系统是构建一个uCLinux嵌入式系统的重要组成部分。目前嵌入式系统可以选择的根文件系统有:Romfs、CramFS、Ramfs、Jffs2、Ext2等等,本系统采用CramFS作为uCLinux嵌入式系统的只读根文件系统。本文讨论了CramFS文件系统的特点,并详细的说明了Nor Flash上建立一个uClinux的Cramfs根文件系统的一般步骤。
  一、引言
  随着电子产业的不断发展,基于ARM技术的系统设计和开发平台越来越多地在控制类、消费类、通信类等电子产品中广泛应用。从软件角度上看,构建基于ARM技术的uClinux系统要涉及到引导加载程序、Linux 内核、文件系统、用户应用程序几部分的设计。
  文件系统是操作系统中用来管理用户文件的内核软件层。文件可能存在于磁盘、网络或者是一些虚拟的文件。文件系统包括根文件系统和建立于内存设备之上文件系统。根文件系统是uClinux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。由于嵌入式设备中Flash资源很紧张,如何有效地使用有限的存储空间是嵌入式开发者必须考虑的,合适的文件系统格式是解决这一问题的关键所在。本文讨论了只读压缩CramFS文件系统的特点,并详细的说明了Nor Flash上建立一个uClinux的Cramfs根文件系统的一般步骤。
  二、开发环境简介
  本系统采用的是宿主机+目标板的开发模式,宿主机为PC+Cygwin1.5.1 ,目标板为采用203MHz的ARM920T内核的处理器S3C2410x+uClinux, uClinux版本为2.4.18。在宿主机上将uClinux和应用程序编译后,下载到目标板的Nor Flash中,启动运行。使用的SDRAM是2片16MB的HY57v561620,工作在16bit双字节模式下;使用的Flash是2片AMD AM29LV160DB,大小为2M字节,工作在16bit双字节模式下。在开发的时候,将Boot Loader烧入AM29LV160DB的1-5扇区;将Linux内核映象文件zImage烧入6-17扇区;将CramFS文件系统映象文件烧入18-35扇区。
  三、 Cramfs文件系统简介
  CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任职时,所参与开发的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。
  在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把Flash上的映像文件解压缩到内存中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。
  使用CramFS文件系统就是一种解决这个问题的方式。CramFS是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。
  一个完整的cramfs文件系统通常包含以下几个目录:
  /linuxrc 启动脚本文件,由Boot Loader核心命令行确定init=/linuxrc,加载/etc目录为ramfs,(cramfs为只读文件系统),拷贝/mnt/etc到/etc,配置文件目录重新加载根文件系统和/etc文件系统,执行init进程。
  /bin 引导启动所需的命令或用户可能用的命令。
  /sbin 系统管理员服务程序,其中最重要的是供内核初始化之后执行的/sbin/init进程,系统启动时由init解释并运行/etc/inittab, inittab将指导int去调用一个系统初始化程序/etc/init.d/rcS。
  /etc 特定机器的配置文件以及用户数据存放目录,其中的所有内容是在内核运行后,由linuxrc 从/mnt/etc拷贝得到的。
  /lib 文件系统上的程序所需的动态库。
  /dev 驱动程序存放目录,可以在这里存放自己编写的驱动程序。
  /usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。目录下的/usr/etc/rc.local执行本地所需要的初始化,如安装核心模块,进行网络,运行应用程序,启动图形界面等。/etc/modules.conf在系统运行期间自动加载模块。
  /mnt 用于设备安装的目录。/mnt/etc/init.d/rcS完成各个文件系统的Mount,执行/usr/etc/rc.local;通过rcS可以调动dhcp程序配置网络。rcS执行完以后,就会打开Shell。
  /proc 系统状态文件目录, 目录中的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像‘more’, ‘less’或 ‘cat’这样的程序来查看。
  四、 Cramfs文件系统的移植过程
  文件系统是紧跟uCLinux内核放置,由内核加载,主要存放用户应用程序和配置信息。CramFS文件系统的基本组成:初始化程序、Shell程序以及其他Linux常用工具、配置文件、链接库、图形界面程序和用户应用程序等。本节将介绍移植CramFS文件系统的具体操作方法。
  4.1、在内核中加入对CramFS文件系统支持
  想要在系统中提供CramFS的能力,我们必须要在编辑uCliunx内核时把支持CramFS的选项加入。尽管uCLinux可以以模块的形式加载各种类型的设备驱动上,但我们选择直接把设备驱动及CramFS文件系统静态地编译进内核中。
  在Memory Technology Devices (MTD)选项中进行配置:
  Memory Technology Device (MTD) support[Y/m/n/?] Y 内存技术设备支持
  MTD partitioning support [Y/m/n/?] Y 支持MTD分区
  Direct char device access to MTD devices[Y/m/n/?] Y MTD字符设备直接访问
  Caching block device access to MTD devices[Y/m/n/?] Y MTD块设备缓冲访问
  在File Systems选项中进行配置:
  Compressed ROM file system support [Y/m/n/?] Y ROM文件系统的支持
  完成上述修改并编译后,完成uCliunx内核对CramFS文件系统的支持。
  4.2、 拷贝需要加入的其他文件和链接库
  (1)、Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发的。Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的vi编辑器,系统不可或缺的/sbin/init程序,以及其他诸如 ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat等等。而所有这一切功能却只有区区1M左右的大小,Busybox已经成为构建嵌入式Linux文件系统的必备软件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'CramFS根文件系统的移植解析',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);