tag 标签: 内核

相关帖子
相关博文
  • 热度 5
    2016-4-12 13:25
    602 次阅读|
    0 个评论
    很多人对于华为海思芯片非常感兴趣,相关的讨论争论自然也不会少,在论坛上有时候也会看到。有人把它吹上天,也有人说它毫无技术含量。我(作者)看完之后痛心疾首,觉得很多人说的很多方面都是不对的。所以献上此文,客观介绍一下芯片的设计制造流程。 卖弄前先自我介绍顺便声明一下,本人海思新员工,但不从事芯片设计类岗位,只是最近听过一个关于芯片的培训,再加上本人对芯片如何实现等问题也比较好奇,所以搜集过一些非官方、不科学资料,发表一下浅鄙之见。 一、工艺制程并不是越小越好 OK,废话不多说,对于芯片,先说一些自己感兴趣的,可能涉及海思的不多。经常能听到有人争论40nm工艺、28nm工艺,14nm工艺,那么这个多少nm指得是什么呢? 它指的是mos管在硅片上的大小,mos管就是晶体管,它是组成芯片的最小单位,一个与非门需要4个mos管组成,一般一个ARM四核芯片上有5亿个左右的mos管。 世界上第一台计算机用个是真空管,效果和mos管一样,但是真空管的大小有两个拇指大,而现在最先进工艺蚀刻的mos管只有7nm大。 说到这里,大家一定和我一样,非常好奇如何在一个15mm*15mm的正方形硅片上制作出5亿个大小仅为40nm的mos管。如果要用机械的方法完成这一过程,世界上很难有这么精密的仪器,可以雕刻出nm级的mos管,就算有,要雕刻出5亿个,所需要的成本、时间也是难以估计的。 借助光可以在硅片上蚀刻下痕迹,掩膜就可以控制硅片上哪些部分会被蚀刻。掩膜覆盖的地方,光照不到,硅片不会被蚀刻。硅片被蚀刻后,再涂上氧化层和金属层,再蚀刻,反复多次,硅片就制造好了。一般来说,制作硅片需要蚀刻十几次,每次用的工艺、掩膜都不一样。几次蚀刻之间,蚀刻的位置可能会有偏差,如果偏差过大,出来的芯片就不能用了,偏差需要控制在几个nm以内才能保证良品率,所以说制作硅片用的技术是人类目前发明的最精密的技术。 芯片可以靠掩膜蚀刻,批量生产,但是掩膜必须用更高精度的机器慢慢加工制作,成本非常高,一块掩膜造价十万美元。制造一颗芯片需要十几块不同的掩膜,所以芯片制造初期投入非常大,动辄几百万美元。芯片试生产过程,叫做流片,流片也需要掩膜,投入很大,流片之前,谁都不知道芯片设计是否成功,有可能流片多次不成功。所以国内能做高端芯片的公司真没几家,光是掩膜成本就没几个公司支付得起。 芯片量产后,成本相对来说就比较低了,好的掩膜非常大,直径30厘米,可以同时生产上百块芯片。芯片如果出货量很大,利润还是非常高的,像英特尔的芯片,卖1000多一块,可能平均制造成本100不到。但如果出货量很少,那芯片平均制造成本就高得吓人,几百万美元打水漂是很正常的。 海思芯片价格有没有竞争力,还得看华为手机出货量大不大。看到有人问20nm好还是40nm好,从大小上来看显而易见20nm好。20nm意味着mos管大小只有40nm的1/4。mos管工作时是一个充电放电的过程,mos管越小,它充电需要的电量越小,所以功耗越小。而且mos管小之后,门电路密度就大,同样大小芯片能放的mos管数就越多,性能空间越大。40nm工艺门电路密度是65nm的2.35倍。但以上都是在不考虑漏电和二级效应的情况下的理论数据。 当然,IC尺寸缩小也有其物理限制,当我们将晶体管缩小到 20 奈米左右时,就会遇到量子物理中的问题,让晶体管有漏电的现象,抵销缩小 L 时获得的效益。作为改善方式,就是导入 FinFET(Tri-Gate)这个概念,如下图。在 Intel 以前所做的解释中,可以知道藉由导入这个技术,能减少因物理现象所导致的漏电现象。 图1 为什么会有人会说各大厂进入10奈米制程将面临相当严峻的挑战,主因是   制作上相当困难,而且只要有一个原子的缺陷,像是在制作过程中有原子掉出或是有杂质,就会产生不知名的现象,影响产品的良率。 如果无法想象这个难度,可以做个小实验。在桌上用 100 个小珠子排成一个 10×10的正方形,并且剪裁一张纸盖在珠子上,接着用小刷子把旁边的的珠子刷掉,最后使他形成一个 10×5的长方形。这样就可以知道各大厂所面临到的困境,以及达成这个目标究竟是多么艰巨。 再说说二级效应吧,学过初中物理的都知道一个最简单电路的组成,包括电源、导线、电阻。接通电源,电流就瞬间流过电阻。如果把电阻换成电感,则电感会有一个逐渐充电的过程,这种情况下,电流就不是瞬间流过电感。 其实电阻也有感抗,只是非常微小,可以忽略不计。但如果接在电阻上的电压非常微小,电流量非常微小,那此时,感抗就不能被忽略不计了。二级效应在芯片制程非常小时(28nm以下),非常明显,mos管由于电压低,电流小,充电受到感抗的影响比40nm大,充电速度慢。芯片想要达到高频率,mos管要加载更高的电压,这样就增加了功耗。漏电也是低制程的一个副作用,也需要提供芯片的功耗才能克服。所以低制程带来的功耗优势就被漏电和二级效应扳回去了很多。 当然,新的工艺、好的工艺可以部分解决上面两个问题,不同工艺用的物理、化学材料不同,工艺流程也不同。高通四核用的是老28nm工艺,目前来看,这个28nm工艺相比40nm工艺优势不大。 然后制程方面,目前听过的最先进的制程是7nm,但这个制程只存在于实验室里,远远没有达到大规模量产的需要。低制程有些困难是难以克服的,学过物理的都知道光的衍射,低制程意味着掩膜透孔会非常小,衍射会非常严重,这样肯定是无法蚀刻硅片的。这个问题也许可以通过使用电子射线或者其他粒子射线来蚀刻硅片解决,但这是那帮孙子去想的问题了。 二、芯片设计考验公司技术水平 说说设计吧,芯片设计分为前端设计和后端设计。前端设计就像做建筑中的画设计图,芯片的逻辑、模块、门电路关系都是前端设计完成的。后端设计则是布局布线,芯片做出来,最终是个实际的东西,那每个mos管摆放什么位置,每一条线怎么连,这个都是后端设计决定的。前端设计没啥好说的,虽然技术含量非常高。 我就说说后端设计吧,有趣一点。5亿个mos管的布局布线,虽然很多用的是IP硬核,别的厂商已经帮忙做好了,但这绝对不是一个轻松的活。拿导线来说,两条导线在一个硅平面上不能交叉,它们可不像我们家里的导线,包了一层塑料。如果把5亿个mos管的导线放在一个平面上,还要让某些连接、某些不连接,还不能 交叉,这绝对是不可能的。 事实上,一个芯片布线,从上到下可能有十几层。每一层都是蜘蛛网一样的布线,如果我们化身成一个1nm的小人,进入芯片的世界走一圈,那绝对会发现那是一个非常宏伟,非常不可思议的世界。后端设计除了要保证线路正确连接,还要使模块占用面积小,功耗小,规避二级效应,要求是很高的。名牌大学毕业搞后端,搞个两年也才刚刚入门。 再说说仿真,芯片在流片之前,谁都不知道它长什么样子,更难以去揣测它设计是否成功、合理,流片成本又非常高,不可能为了验证设计是否成功去流片。这个时候就需要用到仿真,用计算机去模拟电路的运行情况。仿真贯穿芯片设计的始末,有前端仿真、后端仿真、模拟仿真、数字仿真…仿真脱离不了计算机仿真软件,像Sysnopys、Cadence它们是芯片设计、验证软件领域的巨擘,海思每年付给他们的费用我不知道,但起码千万级别。 仿真是一个需要超高性能计算机的任务,海思在IT中心有大量高性能计算机组成云计算资源,但在面对大型仿真时还是很吃力,跑几个小时只能模拟出芯片几秒钟的运行情况。因为要跑仿真,这些计算机一天24小时都在跑。顺便说一下我们部门一个Linux服务器的配置,英特尔4核4GCPU,内存16G。 这个只是一个打杂的服务器,放个数据库,编译几个软件。海思小网的Solaris接入服务器同时有上百人在上面办公。从这点也可以看出,做芯片投入还是非常大的,就光这些软件、硬件成本,每个人每年要花掉公司几十万。 再说说海思目前的水平,我也不想吹牛,确实和美国那些公司比起来有很大差距。毕竟80年代,人家芯片设计、制作都已经非常成熟的时候,我们才有第一台计算机。比如K3V2,它上面很多模块都是别人的,公司花了大笔钱买了版权,这个叫IP核。 IP核分软核和硬核,现在貌似也有软硬结合的核…它是什么东西呢?比如ARM指令授权,它就是软核,它只规定了CPU的指令集,好比建桥,它只告诉你桥应该建多长、多宽、大概长什么样,但是具体细节没有,不告诉你电路在芯片上怎么摆放,怎么连线。软核的好处是给了很大的发挥空间,模仿、抄袭也简单,以后做类似东西可以参考。硬核就是它只告诉你电路在芯片上具体长什么样子,把它摆上去用就行了。硬核的好处是它一般都是经过其它芯片验证的,很容易了解它的具体性能。但你几乎不可能修改它,也很难了解它的实现细节,毕竟有几千万个mos管,人怎么分析。 海思自主IP核不多,主要集中在基带方面和数字电视机顶盒方面,这两块还是比较牛的,海思机顶盒芯片占世界份额90%以上(听老大说)。像K3V2大部分还是在搭积木,搭个USB核,搭一个音频解码核…但客观地说,现在芯片设计分工越来越细,每个公司只是完成其中一小部分,就算是高通,也用了很多其他公司的IP核。 一个公司想把所有活都干了,那绝对是不可能的,就算做到了,它的芯片也不会有竞争力。其实玩搭积木也是很有技术含量的,海思肯定是国内玩得最好的公司。目前公司的一个目标也是把越来越多的模块自主化,但是需要时间。 先从最底层芯片说起,开头说了mos管,现在说说与非门。上面说了mos管是芯片的最小单位,但这是对于芯片制造厂而言的。芯片设计时不会直接画mos管,在数字电路中,使用的最小单位是门电路,与非门就是用得最广泛的一种。一个与非门大概要4个mos管组成,与非门大家应该都非常熟悉。如下图: 图2 大家都知道,家里的开关有两种状态嘛,打开和关闭。当上图中的开关1和开关2两个开关中只有1个开关打开时,经过与非门处理,开关3就打开了。如果开关1和开关2两个开关都关闭或者两个开关都打开,经过与非门处理,开关3就关闭了。 其实和与非门类似的东西生活中随处可见。比如说有的人家里有一个灯,这个灯在家门口设了一个开关,方便进出家门时开关灯。在床边也设了个开关,方便晚上睡觉时关灯。这个其实就是一个与非门,两个开关控制同一个灯。一个开关打开,灯就亮了,两个开关同时打开或者关闭,灯就灭了。   这样的话,用一个与非门和一个与门就模拟了最简单的一个加法器,最大只能计算1+1。计算机中有几亿个这样的门电路,它们组合起来就能做非常复杂的运算。现在的大部分CPU都是64位的,这种CPU肯定会有64位加法器甚至128位加法器。拿64位加法器来说,它最大可以计算出18446744073709551616 +18446744073709551616。 说到这里,不得不说说芯片频率。K3V2年初时号称1.5G四核,到发布密派时,又改口1.2G,到D1四核,又改成1.4G…可谓坑爹至极,这件事也引发了不少争论。但估计大部分人和我原来一样,只知道争论多少G,不知道这个芯片频率意味着什么。先说说1G是什么概念吧,就是每秒钟10亿(1,000,000,000)次。 为什么会有这个东西呢?刚才我说了与非门,开关3是随着开关1和开关2的变化而变化的,对人类来说,开关3的变化速度很快,是瞬间的,但这个变化总是需要一点时间的。开关3可能是另外一个门电路的输入开关,如果变化到一半,它的下一个门电路就接受开关3的输入,可能会产生很严重的问题。 一般来说,一层门电路需要等它的上一层门电路完全变化完毕,输出稳定之后,它才接收上一层的输入,开始变化。这个时候就需要有一个指挥家来指挥这些门电路什么时候开始变化,这个指挥家就是芯片频率,指挥家会定时发出脉冲,1G就是每秒1一次脉冲。门电路等脉冲到来的时候就开始做这个变化。 从上面可以看出,指挥家指挥得越快,芯片运算速度越快。但要说明一点,两倍的频率并不代表两倍的性能。因为CPU和内存、外设频率不同步,它们之间的频率相差越多,CPU空转的次数越多。另外再说一点,门电路变化的过程其实就是mos充电放电的过程,mos管充电放电越快,芯片的频率可以做到越高,而二级效应会减慢mos充电放电的速度。如果mos管想要充电放电快一点,要提高mos管电压,这样就提高了芯片的功耗。 大家对海思比较好奇的,可能都有这么几点疑问: 海思用了ARM的IP核,是不是闭着眼睛就能把K3V2(海思4核A9架构处理器)整出来? ARM核究竟是怎么回事? 开发K3V2的团队实力如何,在海思地位怎么样? 海思究竟有没有竞争力,核心技术在哪里,和国外比相差多少? 先说说ARM的IP核吧,ARM授权包括指令集和CPU核心架构。据我了解,除了高通外,其它芯片厂商都使用了ARM的CPU核心架构,也就是经常可以听到的A9A15。 高通比较高端,CPU核心架构自己搞,如果搞得比A9 A15好的话确实可以提高CPU性能,但由于ARM收取高昂的核心架构修改费用,所以要付更多的钱给ARM。指令集是CPU与上层的编译器、操作系统和应用程序的接口,使用ARM指令集意味着你做的CPU可以兼容安卓系统、安装应用、C编译器。 如果哪个公司自己整一套全新的指令集,那它做出来的CPU一点用处没有,既没有操作系统也没用应用。此前联想出了个K800,用的是英特尔Atom CPU,这款CPU非常特别,使用X86指令集,结果是一出悲剧,很多游戏兼容不了。不过英特尔还得感谢谷歌,否则这个CPU连安卓都兼容不了。目前来看,CPU不用ARM指令集很难玩转,而且随着越来越多应用只支持ARM,ARM的地位会越来越巩固,就像电脑CPU,如果不用X86指令集,连Windows都很难安装,这是一个垄断的帝国。 下面说说CPU核心架构,说之前不得不先谈谈PDK。PDK是ProcessDesign Kit 工艺设计包,它和晶圆厂的制作工艺紧密相关。PDK是什么呢,它描述了一个具体工艺基本元器件的电器特性。比如台积电28nm工艺和40nm工艺做出来的mos管电器特性肯定不一样。28nm工艺和40nm工艺做出来的mos管额定电流范围、电压范围肯定不同,在相同外界输入下,输出曲线也肯定不一样。 芯片公司如果没有PDK,根本不知道设计出来的电路性能如何,也没办法跑仿真。简单一点说,你拿40nmPDK设计电路,用28nm工艺生产,生产出来的芯片绝对一点用处没有。所以说芯片设计非常苦逼,搞编程的,代码可以重用,搞芯片设计的,如果换了生产工艺,很多东西得要从头再来。 ARM给华为的CPU核心架构只是FPGA代码,它不是工艺相关的,数字前端设计的工作会少不少,但后端设计有大量的工作要做。但ARM提供的仅仅是一个计算核心,外围一个都没有。外围包括一些什么呢?比如USB IP核,没有这个,手机就没有USB功能;比如GPU,这个不用我多说吧;比如音频IP核,杜比音效就是这么来的;比如视频解码IP核,没有这个,看视频只能软解;还有CPU功耗控制IP核,K3V2功耗低,说明海思这一块做得不错。这些外围的IP核海思很多都是外购的,海思也自主了一部分。所以说看CPU真心不能只看频率,外围IP有好有坏,有些比较高端的IP核授权费用非常高。即使买了很多IP核,但芯片也绝不是闭着眼睛就能整出来的。 顺便说一下,高通芯片外围的IP核很多也是外购的。再说说开发K3V2的海思图灵团队,这个团队的前身是海思平台的数字什么开发部,具体叫什么我忘了,做K3V2之前,也没什么名声。这个团队的技术实力和海思其它开发部的技术实力差不多,因为做K3V2的时候图灵也没有说去别的部门抓厉害的壮丁进去。另外,K3V2完全不能说是海思做的最有技术含量的产品。海思成立七、八年了,做K3V2之前核心技术都在路由器芯片和安防芯片那块。 大家可以去百度一下华为最新的高性能路由器,吞吐量是思科高性能路由器的好几倍,至少领先思科一年。这是怎么做到的呢?因为那些路由器用的是海思专门定制的芯片,这些芯片也是ARM架构的,只是外围IP核变成了处理网络数据的IP核,这些IP核都是有自主知识产权的。 把程序写进芯片是目前的一个趋势,典型的例子就是原来播放rmvb都是用播放器软解,软解的时候CPU占用率非常高,稍微清晰一点的容易卡,而现在的CPU或显卡基本都有硬解rmvb的的功能。 把程序写进芯片可以让程序跑得更快,所以华为的路由器在性能上可以超过思科。 所以说海思绝对不是第一次做ARM,能做出四核K3V2也是有原因的,另外八核、十六核目前都在研发过程中。海思在做手机芯片时和国外厂商比,几乎没有任何优势,因为除了K3,原来基本没有做过手机芯片,IP核自主化程度还比较低,优势还得靠积累,这个要慢慢来。另外,海思也有自己的核心技术,其它厂商来做路由芯片,不见得能比海思做得好。 PS: 最近加班得比较晚,九点半回来,洗个澡、拖个地、洗个衣服再墨迹一下就快十点半了。现在有点累了。随便说说工作吧,我想这也是大家非常好奇的一方面,华为工作不是人干的、压榨员工、疯狂加班等传闻在网上早已喜闻乐见。我去之前也有点提心吊胆。现在在公司上班了快三个月,感觉工作压力确实不小,但没有网上说的那么恐怖。平时一般早上八点刷卡,晚上八点多闪人,除去中午下午吃饭时间,每天工作九到十个小时。工作时间一般精神都比较紧张,确实会比很多公司累一点。但这件事怎么看呢?我觉得月薪两万的人和月薪一万的人最大差别就是,月薪两万的创造的价值起码是月薪一万的两倍,有的人挣的多,但付出的肯定也多。美研所有个大牛,我们部门最怕跟他打交道。那家伙提的要求特别多,经常把我们部门的人整死。他年薪50万美元以上,大家羡慕吧。但是我发现他经常下午一两点的时候还在上班,换成美国时间就是凌晨一两点。而且我听说他打算在硅谷买别墅,要500万美元。
  • 热度 5
    2016-1-8 11:20
    730 次阅读|
    0 个评论
      由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。   三 设置uboot启动参数   我的nfs根目录为/nfsroot,我的根文件系统目录是在该目录之下的,即/nfsroot/rootfs目录,故uboot启动参数设置如下:   noinitrd console=ttySAC0 root=主机IP:/nfsroot/rootfs rw ip=开发板IP:主机IP:网关:子网掩码::eth0:off init=/linuxrc   需要注意的是,所有的冒号":"都不可省略。   四 网卡驱动移植(DM9000)   选择网卡移植是因为网卡驱动相对较为简单,对于DM9000就更加简单了,因为内核本身提供了DM9000的驱动程序,但是没有针对开发板进行管教配置,因此,我们配置下开发板相关的东西即可完成网卡驱动的移植。打开arch/arm/mach-s5pv210/mach-smdkv210.c文件,并作以下修改:   (1) 修改smdkv210_dm9000_resources定义如下   static struct resource smdkv210_dm9000_resources = {   .start = 0x88000000,   .end = 0x88000000 + 3,   .flags = IORESOURCE_MEM,   },    = {   .start = 0x88000000 + 4,   .end = 0x88000000 + 4 + 3,   .flags = IORESOURCE_MEM,   },    = {   .start = IRQ_EINT(10),   .end = IRQ_EINT(10),   .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,   }   };   (2) 修改smdkv210_dm9000_init函数如下   static void __init smdkv210_dm9000_init(void)   {   unsigned long* srom_bw = ioremap(0xE8000000, 4);   unsigned long* srom_bc1 = ioremap(0xE8000004, 4);   *srom_bc1 = ((028)|(024)|(516)|(012)|(08)|(04)|(00));   *srom_bw = ~(0xf 4);   *srom_bw |= (14)|(15);   gpio_request(S5PV210_MP01(1), "nCS1");   s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));   gpio_free(S5PV210_MP01(1));   iounmap(srom_bw);   iounmap(srom_bc1);   }   这样,就完成了DM9000网卡驱动的移植,其实这样修改是有逻辑的,根据TQ210的原理图可知DM9000连接的片选时nCS1,也就是网卡是接在来ROM控制器的BANK1上。        根据S5PV210的内存映射表可以看出,SROMC的BANK1地址空间为0x88000000~0x8FFFFFFF,故当CPU寻址该范围内的地址空间时才会使能片选nCS1。所以,我们采用的是0x88000000地址。        另外,从TQ210原理图的DM9000部分还可以看到,DM9000使用的是外部中断10,故将中断号修改为10号。   最后需要说明的是smdkv210_dm9000_init函数的修改,这是因为DM9000的数据访问、命令发送等是按照一定时序工作的,而DM9000接再SROMC上,因此需要配置SROMC时序,使其可以正确驱动DM9000,关于时序的详细配置我还没研究,不过韦东山老师的第二期视频中讲述了DM9000的驱动移植,也讲了时序配置,需要的话可以参考。   五 挂接文件系统   我们现在配置好了网卡驱动,还需要对内核稍作配置才能使内核支持网络文件系统挂载,具体的可以参考以下配置。   (1) 配置网络支持    Networking support ---   Networking options ---   * Packet socket   * Unix domain sockets    TCP/IP networking    IP: multicasting    IP: kernel level autoconfiguration    IP: DHCP support    IP: BOOTP support    IP: RARP support    IP: multicast routing   (2) 配置网卡设备支持   Device Drivers ---    Network device support ---    Ethernet driver support ---   * DM9000 support   (3) 配置网络文件系统支持   File systems ---    Network File Systems ---   * NFS client support   * NFS client support for NFS version 2   * NFS client support for NFS version 3    NFS client support for the NFSv3 ACL protocol extension   * NFS client support for NFS version 4    Root file system on NFS   配置完以上三项后保存配置,然后再次编译内核,直接执行make指令即可。   这时,重新下载内核测试运行,没有意外的话现在内核已经可以正常工作了,如果不幸的遇到了问题,那么问题应该是NFS服务器配置的问题,ubuntu下配置NFS服务器很简单   sudo apt-get install nfs-kernel-server   然后以根权限打开/etc/exports文件,我的NFS根目录为/nfsroot,故,我设置export为   /nfsroot/ *(rw,sync,no_root_squash)   设置完成之后需要重启NFS服务,ubuntu下执行   sudo service nfs-kernel-server restart   重启的时候会看到一些警告,如下图        但是上述警告不影响使用。反之,如果设置为no_subtree_check,虽然系统可以正常挂载,但是无法进行创建文件等写操作,也就是说,挂载的文件系统是只读的。最后还要修改下/nfsroot的权限,为了以后使用方便。   chmod a+x /nfsroot -R   到这里,基于TQ210的内核移植已经初步完成了,接下来我们就可以进行驱动开发了。   六 问题总结   我在配置过程中遇到了很多问题,现在稍作总结   (1) 串口中断打印完Starting kernel...之后就没有任何输出了   配置内核,指定调试信息输出端口为UART0,文中讲到了详细配置。   (2) 解压完内核之后没有任何输出了   a.检查bootargs环境变量设置是否正确,必须设置console=ttySAC0   b.检查uboot传递的机器码根内核是否对应   c.检查uboot传给内核的taglist是否正确   (3) 内核无法挂接到NFS文件系统   a. 正确移植DM9000网卡驱动   b. 配置内核的网络部分、网卡设备和文件系统中的网络文件系统   c. 确认NFS服务器的配置是否正确,用另外其他linux或已经移植好系统的linux进行测试(mount -o nolock xx.xx.xx.xx:/nfsroot/rootfs)。   (4) 文件系统挂接成功,无法执行/linuxrc   a. 检查NFS配置文件,最好以NFSv2方式配置,内核不支持的话会出现问题。   b. 最好以文中推荐的方式进行NFS服务器配置。   c. 配置完成之后需要重启NFS服务或者是重启系统。
  • 热度 7
    2016-1-8 11:19
    821 次阅读|
    0 个评论
      由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。   内核移植其实很简单,因为内核是linus率领的linux内核开发团队开发并维护的,我们只需要跟我们的平台交叉编译一下即可使用,但是,内核移植也不简单,因为内核移植起见出现任何问题都可能会被卡住,因为内核代码非常庞大,我们无法通读内核代码,下面是我移植期间遇到的各种悲催的问题和解决方案,首先是必备的开发环境:   a) Linux内核代码,版本3.8.3   b) S5PV210开发板(我的是TQ210)   c) HOST环境是WIN7(64位)下安装的Ubuntu虚拟机(12.10)   一 内核编译   从Linux内核网站(kernel.org)下载内核代码、解压并进入内核目录   (1)修改Makefile,将195行和196行改为:   ARCH = arm   CROSS_COMPILE ?= arm-linux-   (2)进行默认配置,进入arch/arm/configs目录,可以发现最接近我们开发板的配置文件是s5pv210_defconfig,故   make s5pv210_defconfig   (3)编译内核,如果需要生成zImage则执行   make zImage   如果需要生成uImage则执行   make uImage   (4)用uboot下载并尝试运行,结果是悲剧的,在uboot打印”Starting kernel...“之后就看不到任何输出了,显然,有两种原因:   a. 编译的内核类型错误,比如您的uboot使用的是uImage,而您编译的是zImage。   b. 移植的uboot存在问题,没能正确的拷贝内核到正确的内存地址并启动。   c. 内核存在某些配置,我们没有配置。   经过查看内核配置项知道,内核默认采用的UART1打印调试信息,因此,执行:   make menuconfig   在出来的对话中依次选择System type = (1) S3C UART to use for low-level messages,在编辑框中将1改为0,然后保存配置并再次编译内核,直接执行make即可,无需make clean。如果是首次执行make menuconfig会遇到错误,这是因为make menuconfig依赖一个库,这里我忘记名字了,如果是ubuntu可以直接用指令安装的,网上搜一下就可以搞定。   编译完内核之后再次下载并尝试运行,这时,可以看到内核打印的信息了,如果您不幸只看到“Uncompressing Linux... done, booting the kernel.”就没有任何输出了,那么请检查uboot传入的机器码跟内核机器码是否匹配,如果不匹配请修正,然后重新编译运行内核或者uboot,如果修正之后仍然看不到其他输出,那么请检查uboot的bootargs参数,bootargs中必须配置console=ttySAC0,否则也看不到打印信息。   如果没有出现上面的错误,那么您的内核已经可以打印出很多信息,但是由于内核默认没有提供对Nand或网卡的支持,无法挂接文件系统,所以仍然无法正常运行。为了能使内核进入控制台,为后面的驱动开发提供环境,我们先制作文件系统,然后来移植网卡驱动,让内核NFS方式挂接文件系统,然后我们就可以开发其他驱动了,如Nand、LCD、声卡等等。   二 构建文件系统   其实构建文件系统还是比较简单的,注意几个地方,然后按部就班的来就可以了。   (1)创建根文件系统目录结构,可以使用如下脚本:   #!/bin/sh   echo "------Create rootfs directons start...--------"   mkdir rootfs   cd rootfs   echo "--------Create root,dev....----------"   mkdir root dev etc boot tmp var sys proc lib mnt home usr   mkdir etc/init.d etc/rc.d etc/sysconfig   mkdir usr/sbin usr/bin usr/lib usr/modules   echo "make node in dev/console dev/null"   sudo mknod -m 600 dev/console c 5 1   sudo mknod -m 600 dev/null c 1 3   mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp   mkdir var/lib var/lock var/run var/tmp   chmod 1777 tmp   chmod 1777 var/tmp   echo "-------make direction done---------"   在这里我将脚本命名为mkrootfs.sh,接下来给脚本加可执行权限(即chmod a+x mkrootfs)并运行脚本。我的脚本是在/nfsroot目录下运行的,所以我的根文件系统的根目录为/nfsroot/rootfs,后面均以该目录为例阐述。   (2)编译Busybox   到Busybox下载最新版的Busybox源码,我是用的是1.21.0版本,下载完后解压并进入busybox目录,首先是配置busybox   make menuconfig   配置菜单跟配置内核时的差不多,依次进入Busybox Settings = Build Options = Cross Compiler prefix (NEW),设置为编译器的前缀,我的是arm-linux-。网上有些朋友还推荐选择Busybox Settings = Build Options = Build BusyBox as a static binary (no shared libs),但是如果我们正确拷贝编译器了运行库的话,不设置也可以。现在可以编译Busybox了,执行   make   编译过程很顺利,我这里没有遇到任何错误,接下来将编译好的Busybox安装到/nfsroot/rootfs就可以了,执行   make CONFIG_PREFIX=/nfsroot/rootfs install   (3)拷贝编译器运行库   我的编译器是4.5.1版本的,拷贝arm-none-linux-gnueabi/sys-root/lib的所有动态库到/nfsroot/rootfs/lib下,为了不拷贝连接,应该加上”-d"选项,执行   cp *so* /nfsroot/rootfs/lib -d   同样拷贝arm-none-linux-gnueabi/sys-root/usr/lib下的所有动态库到/nfsroot/rootfs/usr/lib下,执行   cp *so* /nfsroot/rootfs/usr/lib -d   (4)构建etc目录   在etc目录下创建Inittab文件,内容如下   ::sysinit:/etc/init.d/rcS   console::askfirst:-/bin/sh   ::restart:/sbin/init   ::ctrlaltdel:/sbin/reboot   ::shutdown:/bin/umount -a -r   ::shutdown:/sbin/swapoff -a   在etc/init.d/目录下创建rcS文件,内容如下   echo "----------mount all.........."   mount -a   echo "----------Starting mdev......"   echo /sbin/mdev /proc/sys/kernel/hotplug   mdev -s   /bin/hostname -F /etc/sysconfig/HOSTNAME   为inittab和rcS文件添加可执行权限   chmod a+x inittab   chmod a+x rcS   在etc目录下创建fstab文件,内容如下   #evice mount-point type option dump fsck order   proc /proc proc defaults 0 0   none /tmp ramfs defaults 0 0   mdev /dev ramfs defaults 0 0   sysfs /sys sysfs defaults 0 0   在etc目录下创建profile文件,内容如下   PATH=/bin:/sbin:/usr/bin:/usr/sbin   export PATH   #set hostname   HOSTNAME='/bin/hostname'   export HOSTNAME   # Set PS1   PS1=' $'   export PS1   拷贝主机/etc目录下的passwd和group文件到etc目录下。   (5) 设置HOSTNAME文件   在etc/sysconfig目录下创建HOSTNAME文件,在文件中写入主机名,我这里写的是bruce。   (6) 安装内核modules   进入内核源码目录,执行   make modules   待编译完成后安装modules,执行指令   make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs   到这,根文件系统就构建完成了。
  • 热度 6
    2012-11-3 18:00
    692 次阅读|
    2 个评论
      对于Linux来说,其可裁剪的特性使得它的使用在嵌入式的系统中应用广泛,而正是这样的特性,也使得我们可以自己对其进行一定的自由的配置,来构成自己需要功能组成的一个可以运行在嵌入式系统上的内核的映像,当然,这些都需要对Linux有一定的了解和理解,当然,在构建完一个完整的Linux的内核后,你对其的理解应该会更进一步。 好了,废话不多说,首先是Linux的内核的组织方式,配置者必须首先了解整个Linux的系统的组织,以及一个完整的Linux发行的版本中的各个目录的职能,这里就2.4内核版本而言,各个主要的配置信息项如下: Code maturity level options Loadable module support System type General setup Memory technology Devices Block devices Network options Network devices support Characters devices File systems Console drivers Sound 这些配置项还是有很多内容需要去看,去了解的,当然,这些可以在网络上方便的寻找到,这个就不细细讲了。 主要的配置就是在System type即系统类型,还有File systems中,当然,因为我们还需要文件系统,所以还有一个不能忘记,那就是Console Drivers,这里有一些设定需要做出。   内核和文件系统的配置是大同小异的,我这里说的是具体的配置过程,而不是其他的什么,因为就具体步骤的原理而言,这一点是大大不同的,所以这里没有那么多的空间去说明,只是做一个说明。   你可能会问,那上面的配置项怎么调出来呢?恩,这是一个好问题,问得好,普通的过程中,需要对内核的所有需要包含的文件作出编译和链接,然后就可以了,当然,Linux中,有一个指令很有用,那就是Makefile,这个东西是啥,你可以去百度一下,当然,google也没有关系,总结起来,这就是一个全自动化过程的指导,这个文件中会详细的记录需要系统编译和链接的文件,以及相应系统哦哦那个执行的对应的指令,这些内容可以你手工敲打,当然,这样你得对Makefile有一定的了解,并且你的耐心是足够的,Makefile这个文件既然这么多的内容,能不能提供一个图形化的界面,我去点击要加载啥,然后系统自动生成这个Makefile文件,然后系统自动完成编译和链接的过程中,这样用户可以在界面中配完Makefile后,喝上一杯茶,看着电脑慢慢的把所有的工作做完,恩,这个是可以的,科技的力量是无穷的啊。   Make menuconfig就是这样的一条指令,你需要用它开始图形化的方便亲和的配置过程,其实也有不那么亲和以及比这更加亲和的方法,这个不细讲,可以网上看到。
  • 热度 6
    2012-3-16 11:22
    693 次阅读|
    3 个评论
           我的主要关注点是linux内核和驱动和bootloader。在将来的一段日子里,我会不定期的就以上几点写一些东西,以和大家共同探讨。         linux的真谛在于开放和共享。我辈为人,不光要有能力,更要有让能力传承下去的能力。这是我钦佩Linus的地方。望与大家共勉。
相关资源
广告