流氓兔子的嵌入式生活

---------------------------文档库 Making everything simple

ID:hubu01
[修改头像]
12661次访问,排名7839好友0人,关注者0
hubu01的文章
原创 29 篇
翻译 0 篇
转载 12 篇
评论 1 篇
hubu01的公告
Just do it !
最近评论
ets2008:很好
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    嵌入式圈(精)
    CSDN专家门诊
    daishengs专栏
    device driver
    embedded linux
    Peter lee
    陈志新blog
    存档

    原创 linux内核裁减笔记

    新一篇: Linux启动时间的极限优化

    裁内核并非想象中那么难,但是也不简单。
    两件事印象很深:
    1、编网卡驱动
      网卡是用的broadcom公司的百兆以太网网卡芯片,用的开源驱动模块编出来以后叫tg3.ko,insmod一下kernel就报错了。开始一两天在网

    上找了很多资料,没有结果,后来仔细阅读硬件工程师发过来的硬件设计文档,发现网卡是通过PCI-E BUS接在南桥芯片上的,看看kernel呢,没有编入PCI-E。于是乎加选了PCI-E。当时的选项是这样的:
     [*] PCI support                                                      
             PCI access mode (Any)  --->                                    
             [*]   PCI Express support                                            
             [*]   Message Signaled Interrupts (MSI and MSI-X)
    在选了PCI-E以后自动加选了MSI,MSI 是个什么东西我没认真去管,就编了。重新编网卡驱动,insmod。这下倒好,直接kernel crash了。
    于是想,也许是这个MSI造成的,选掉以后,
     [*] PCI support                                                      
             PCI access mode (Any)  --->                                    
             [*]   PCI Express support                                            
             [  ]   Message Signaled Interrupts (MSI and MSI-X)
    再来一次,编驱动,insmod。奇迹般的,
    tg3: eth0: Link is up at 100 Mbps, full duplex.
    tg3: eth0: Flow control is on for TX and on for RX.
    出现了。
    为什么会这样呢?我查了一下MSI的相关信息,明白了这种“信息信号中断”需要CPU有APIC的支持(注意不是ACPI,APCI是Advanced
    Configuration and Power Interface,像usb查上去能自动通电就是靠这个东东的作用)APIC叫做Advanced Programmable Interrupt
    Controller,高级可编程中断控制器,CPU要用它才能接受MSI。看看用的cpu的datasheet,写着“APIC is not implemented in this chip yet
    ”ok, 明白了。
     
    2、做telnet服务。一直觉得telnet deamon的功能应该实现起来是很简单的,但偶编的系统偏偏就不能用telnet,症状是在通过串口接上去
    ps一下可以看到有telnetd在运行,网络也能ping通,但用远程机器(比如windows下的cmd)telnet一下,telnet直接什么信息都没有就跳出
    来了。开始这个问题并不重要,后来因为sata接口的原因(这个说来话长,在另一篇blog里面会详细讲)我必须把板子拿到另外一间实验室去
    ,自己在远端调试它,telnet就非开起来不可了。搞了很久啊,至少也郁闷了我三四个小时都没搞清楚是怎么回事,以前有问题还可以拿
    error message去google一下,这个连error message都没有,怎么办呢?基础在做移植工作中的经验来看,有的问题不是这个功能本身的问题
    而是其它原因,也许不是telnetd有问题,也许原因在其它方便,我得从源头上去找。试试看源代码吧。busybox的源代码虽是精简版的,但
    telnetd还是着实郁闷我一阵子。怎么会比init的源代还复杂?看了十分钟就放弃了。去网上下了一本书叫做《unix 环境高级编程》,讲到
    telnetd功能是通过伪终端实现的,内核中一定要有Legacy (BSD) PTY support的支持。不出我所料,果然这一项被我很粗心地裁掉了。补选上这一项,
     -> Device Drivers                                                  
             -> Character devices 
           ->[*]Legacy (BSD) PTY support
    重编内核,ok了。
     
    到底裁内核需要具备什么样的素质呢?我也说不上来,感觉这东西说简单很简单,不就是make menuconfig,make bzImage, make modules三步嘛,勾勾选选就出来了,但说难又很难,怎么知道哪些项必选,哪些项不需要,就是很高深的东西了。想想前辈cy裁的内核(虽然那个是针对XSCALE裁的,但有很多选项和X86相通,我借鉴了很多),真的精简到找不到哪一个选项可以再被裁掉,我觉得我还是有很大的差距的。

    至于要一句话总结内核裁减的决窍,我想说:首先认真阅读硬件文档,其实要什么懂一点点。不是夸张,裁减内核是个包罗万象的很有挑战性的工作。

    很有趣味,比打游戏好玩多了 

    发表于 @ 2007年05月21日 02:07:00|评论(loading...)|编辑

    旧一篇: 最小的BabyLinux系统制作过程详解

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © hubu01