很汗颜的linux第一篇

      自大四接触linux到现在2年半了,也就是2年半没碰linux的东西。当初的热情和憧憬被读研后的具体方向冲刷的一干二净了...

    其实,我很感兴趣的,懊恼于自己没抽时间,总觉得自己以后会找机会重拾起来,可迟迟也没动手。

    今天吧,借Marvell design的机会,重新搞搞,当做新的开始,我想等到比赛结束了,我会坚持这个领域的。

    篇头写下这些,今后以此为鉴,这第一篇摘录自我买的第一块板子:友善之臂ARM9 mini2440,一个论坛博主的原创,新起点,重新看看。

 Let's begin。。。  

 

第一,学习基本的裸机编程

       学习裸机的编程的同时要好好理解这个硬件的构架、控制原理,这些我称他为理解硬件。所谓的理解硬件就是说,理解这个硬件是怎么组织这么多资源的,这些资源又是怎么由cpu、由编程进行控制的。比如说,s3c2410中有AD转换器,有GPIO(通用IO口),还有nandflash控制器,这些东西都有一些寄存器来控制,这些寄存器都有一个地址,那么这些地址是什么意思?又怎么通过寄存器来控制这些外围设备的运转?还有,norflash内部的每一个单元在这个芯片的内存中都有一个相应的地址单元,那么这些地址与刚刚说的寄存器地址又有什么关系?他们是一样的吗?而与norflash相对应的nandflash内部的储存单元并不是线性排放的,那么s3c2410怎么将nandflash的地址映射在内存空间上进行使用?或者简单地说应该怎么用nandflash

        诸如此类都是对硬件的理解,理解了这些东西就对硬件有很深的理解了,这对以后更深一步的学习将有很大的帮助,如果跳过这一步,我相信越往后学越会觉得迷茫,越觉得这写东西深不可测。因为,你的根基没打好。 

第二,使用linux系统进行一些基本的实验

       在买一套板子的时候一般会提供一些linux的试验例程,好好做一段时间这个吧,这个过程也是很有意义的,也是为进一步的学习积累感性认识,你能想象一个从没有使用过linux系统的人能学好linux的编程吗?好好按照手册上的例程做一做里面的实验,虽然有点娃娃学走路,有点弱智,但是我想很多高手都会经历这个过程。 

第三,研究完整的linux系统的的运行过程

       所谓完整的linux系统包括哪些部分呢?

       三部分:bootloaderlinux kernellinux内核)、rootfile(根文件系统)。

       那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基。介绍这方面的资料网上可以挖掘到几吨,自己好好研究吧。 

第四,开始做系统移植。

       上面说到完整的linux3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的便是自己动手学会制作这些东西

        当然我不可能叫你编写这些代码。事实上这个3者都能在网下载到相应的源代码,但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行在你的板子上,这个修改的过程就叫移植。在进行移植的过程中你要学的东西很多,要懂的相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。

         在这个过程中如果你很有研究精神的话你必然会想到看源代码。很多书介绍你怎么阅读linux源代码,我不提倡无目的地去看linux源代码,用许三多的话说,这没有意义。等你在做移植的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C语言编程水平再去看。

         至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会告诉你怎么解决,这时就要靠自己

          这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包,然后进行修改,最终运行在板子上。

盗用阿基米德的一句话:给我一根网线,我能将linux搞定 

第五,研究linux驱动程序的编写

         移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开发。

         Linux的驱动程序可以说是五花八门,linux2.4linux2.6的编写有相当大的区别,就是同为linux2.6但是不同版本间的驱动程序也有区别,因此编写linux的驱动程序变都不是那么容易的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。

         这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。 

第六,研究应用程序的编写

         做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的还是qt/e函数库。我一直就使用这个函数库来开发自己的应用程序,不过我希望你能使用国产的MiniGUI函数库。盗用周杰伦的广告词就是支持国产,支持MiniGUIMiniGUI的编程比较相似Windows下的VC编程,比较容易上手,效果应该说是相当不错的,我曾使用过来开发ARM7的程序。不过MiniGUI最大的不好就是没有像qtopia这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是MiniGUI的版权拥有者)合作使用MiniGUI函数库开发像qtopia这样的图形操作平台,不过由于水平有限这只能是幻想了,呵呵。

完成这一步你基本就学完了嵌入式linux的全部内容了。

 

       还有一个小小的经验想和大家分享。我在学习嵌入式linux的过程中很少问人,客观原因是身边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问题。这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解决问题,这样,个人的解决问题能力就显得非常关键了。因此我的建议就是一般的问题到网上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人帮你解决问题。

     记住,问题是学习的最好机会。

最好找个高手带一带,可以少走很多无用的弯路

 底层:     arm9芯片英文手册  和 vivi 的源代码

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3275791&bbs_page_no=1&search_mode=1&search_text=arm9&bbs_id=9999

 再补上一本   <<ARM嵌入式系统开发-软件设计与优化>>
              
 应用层开发:  <<Linux编程技术详解>>      适合入门
                    <<unix环境高级编程>>       unix编程的圣经!       
                   <<C++ GUI Qt 4 编程>>      官方教材
                   最后最好找本网络编程的书来看看

 驱动学习:    <<Linux设备驱动开发详解>>  前半部分还可以,后面基本就是贴代码,借来  ,不建议买:-)
              <<Linux设备驱动 第三版>>   强烈推荐!买本中文版的,译者水平很深厚, 翻译得还OK,不要找中文电子版的,翻译得很垃圾

 至于Linux Bootloader Qt移植之类实践性较强的,建议到chinaunix上的牛人的博客里找资料,内容一般比较新  


posted @ 2011-06-23 18:33  左手牛奶,右手面包  阅读(299)  评论(0编辑  收藏  举报