现在的位置: 首页 > 综合 > 正文

linux内核裁减笔记

2017年12月13日 ⁄ 综合 ⁄ 共 2180字 ⁄ 字号 评论关闭

裁内核并非想象中那么难,但是也不简单。
两件事印象很深:
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相通,我借鉴了很多),真的精简到找不到哪一个选项可以再被裁掉,我觉得我还是有很大的差距的。

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

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

抱歉!评论已关闭.