【linux】linux内核移植错误记录_xiayuleWA的博客-程序员秘密_ifconfig not tainted 4.14.90

技术标签: 嵌入式linux  

  

欢迎转载,转载时请保留作者信息,谢谢。

邮箱:[email protected]

博客园地址:http://www.cnblogs.com/embedded-tzp

Csdn博客地址:http://blog.csdn.net/xiayulewa

  

在内核下载运行后,会出现各种各样的问题,将遇到的问题和解决方案贴出来。

  

  

No filesystem could mount root, tried: ext3 cramfs vfat msdos romfs(没有文件系统)

问题分析:

在make menuconfig时,没有配置文件系统类型。

解决方案:

: make menuconfig: 将M改为yes, 见下图

  

Failed to execute /linuxrc. Attempting defaults...

  

问题分析:

程序不可执行或者没有权限执行,修改根文件系统里的linuxrc的组改为root。

解决方案:

# chown -R root:root '/home/tang/work/fs/ramdisk_fs', 或者制作文件系统时就以root身份来做

  

ls输出乱码

问题分析:

ls是 busybox的命令,其输出加了一些格式输出。

解决方案:.

    两种方式,或者重新配置busybox并编译,或者 改为用secureCRT 工具

    见http://blog.chinaunix.net/uid-26404477-id-3459315.html

  

irq 57: nobody cared (try booting with the "irqpoll" option)

 

问题描述:

当开发板执行ifconfig eth0 192.168.1.3时,出错,现象如下:

  

irq 57: nobody cared (try booting with the "irqpoll" option) (__report_bad_irq: Spurious.c (src\kernel\irq))

CPU: 0 PID: 770 Comm: ifconfig Not tainted 3.10.53 #28

[<c000d8ec>] (unwind_backtrace+0x0/0xf4) from [<c000bea4>] (show_stack+0x10/0x14)

[<c000bea4>] (show_stack+0x10/0x14) from [<c005305c>] (__report_bad_irq+0x20/0xb4)

[<c005305c>] (__report_bad_irq+0x20/0xb4) from [<c0053314>] (note_interrupt+0x224/0x288)

[<c0053314>] (note_interrupt+0x224/0x288) from [<c00514d8>] (handle_irq_event_percpu+0xa8/0x1c0)

[<c00514d8>] (handle_irq_event_percpu+0xa8/0x1c0) from [<c0051618>] (handle_irq_event+0x28/0x38)

[<c0051618>] (handle_irq_event+0x28/0x38) from [<c0053aec>] (handle_edge_irq+0x7c/0x130)

[<c0053aec>] (handle_edge_irq+0x7c/0x130) from [<c005107c>] (generic_handle_irq+0x34/0x40)

[<c005107c>] (generic_handle_irq+0x34/0x40) from [<c019b528>] (s3c_irq_demux+0xb4/0x120)

[<c019b528>] (s3c_irq_demux+0xb4/0x120) from [<c005107c>] (generic_handle_irq+0x34/0x40)

[<c005107c>] (generic_handle_irq+0x34/0x40) from [<c00099fc>] (handle_IRQ+0x30/0x84)

[<c00099fc>] (handle_IRQ+0x30/0x84) from [<c000855c>] (s3c24xx_handle_irq+0x90/0x140)

[<c000855c>] (s3c24xx_handle_irq+0x90/0x140) from [<c0008e74>] (__irq_svc+0x34/0x40)

Exception stack(0xc2f67ce8 to 0xc2f67d30)

7ce0: 00000001 0000000a 00000000 20000013 00000002 00000002

7d00: c04e4160 c2f66000 c04a4f5c c04e4140 c201d90c c04e4160 00400100 c2f67d30

7d20: c001cf4c c001cfc0 20000013 ffffffff

[<c0008e74>] (__irq_svc+0x34/0x40) from [<c001cfc0>] (__do_softirq+0x84/0x1cc)

[<c001cfc0>] (__do_softirq+0x84/0x1cc) from [<c001d1b8>] (do_softirq+0x4c/0x58)

[<c001d1b8>] (do_softirq+0x4c/0x58) from [<c001d218>] (irq_exit+0x54/0x90)

[<c001d218>] (irq_exit+0x54/0x90) from [<c0009a00>] (handle_IRQ+0x34/0x84)

[<c0009a00>] (handle_IRQ+0x34/0x84) from [<c000855c>] (s3c24xx_handle_irq+0x90/0x140)

[<c000855c>] (s3c24xx_handle_irq+0x90/0x140) from [<c0008e74>] (__irq_svc+0x34/0x40)

Exception stack(0xc2f67da0 to 0xc2f67de8)

7da0: 00000000 00000039 c04aeab8 00000000 c04a7194 c2054d40 00000039 60000013

7dc0: c04a71c4 00000000 c201d90c c2046cc0 235e5c8f c2f67de8 c0053ff8 c00523dc

7de0: 40000013 ffffffff

[<c0008e74>] (__irq_svc+0x34/0x40) from [<c00523dc>] (__setup_irq+0x194/0x428)

[<c00523dc>] (__setup_irq+0x194/0x428) from [<c00528a8>] (request_threaded_irq+0xd8/0x158)

[<c00528a8>] (request_threaded_irq+0xd8/0x158) from [<c02168c0>] (net_open+0x88/0x488)

[<c02168c0>] (net_open+0x88/0x488) from [<c02bfa4c>] (__dev_open+0xb8/0x114)

[<c02bfa4c>] (__dev_open+0xb8/0x114) from [<c02bc8e4>] (__dev_change_flags+0x8c/0x134)

[<c02bc8e4>] (__dev_change_flags+0x8c/0x134) from [<c02bf95c>] (dev_change_flags+0x10/0x48)

[<c02bf95c>] (dev_change_flags+0x10/0x48) from [<c0310cfc>] (devinet_ioctl+0x674/0x784)

[<c0310cfc>] (devinet_ioctl+0x674/0x784) from [<c02abfdc>] (sock_ioctl+0x74/0x2a4)

[<c02abfdc>] (sock_ioctl+0x74/0x2a4) from [<c009fab4>] (do_vfs_ioctl+0x80/0x5f4)

[<c009fab4>] (do_vfs_ioctl+0x80/0x5f4) from [<c00a0064>] (SyS_ioctl+0x3c/0x60)

[<c00a0064>] (SyS_ioctl+0x3c/0x60) from [<c00091c0>] (ret_fast_syscall+0x0/0x2c)

handlers:

[<c0216cc0>] net_interrupt

Disabling IRQ #57 (Spurious.c (src\kernel\irq), 出现这个情况是中断次数99000过多,没有被处理)

cs89x0: eth0: using half-duplex 10Base-T (RJ-45)

cs89x0: net_open() succeeded

  

问题分析:

    这与网络驱动有关,我的是cs8900a网卡,代码是内核自带的,就以此说明。

    网卡驱动相关文件为 cs89x0.c,cs89x0.h, cs89x0.txt。

    从栈最底处的net_interrupt, 可以看出内核在[<c0216cc0>] net_interrupt 处崩溃。而在net_open() 中有ret = request_irq(dev->irq, net_interrupt, 0, dev->name, dev); 可见net_interrupt为网卡中断处理函数。

    从上述的打印栈可以看出问题出现时的函数调用顺序,该调用顺序就是中断的处理流程,可以看我的另一篇文章,那里有中断非常详细的说明。

s3c24xx_handle_irq→handle_IRQ→generic_handle_irq→s3c_irq_demux→ generic_handle_irq→

handle_edge_irq→handle_irq_event→handle_irq_event_percpu→note_interrupt→__report_bad_irq→show_stack→unwind_backtrace;

而在note_interrupt函数中有:

    if (unlikely(desc->irqs_unhandled > 99900)) {

        /*

         * The interrupt is stuck

         */

        __report_bad_irq(irq, desc, action_ret);

        …….

    }

desc是中断数组某个元素,其irqs_unhandled > 99900了,就是说有99900个中断没有处理了?

在note_interrupt→if (unlikely(action_ret == IRQ_NONE)) {…… desc->irqs_unhandled++; …….} 说明网卡中断返回值为IRQ_NONE,才会irqs_unhandled++。网卡中断返回值由handle_irq_event_percpu→res = action->handler(irq, action->dev_id)即net_interrupt得到,看该函数,可知while ((status = ioread16(lp->virt_addr + ISQ_PORT))) 循环必然条件为假,不然返回值不会是IRQ_NONE。

分析到这里基本明白了,cs8900a的中断是硬件与s3c2440连接的,cs8900a只有实在产生了中断,才会导致cpu进入中断函数,但是网卡实际上是不可能产生那么频繁的中断的,那么猜想可能是中断触发类型设置不正确。

配上原理图:

看s3c2440手册:

EXTINT1寄存器的[6:4]控制了lan口中断触发类型。

在内核中添加代码,打印EXTINT1寄存器的值,发现其被配置为低电平触发中断了,而在cs8900a的datasheet中,明确说了高电平表明是一个中断。

  

    到这里问题原因定位。

  

解决方案:

. 在MACH_START中mini2440_map_io修改,添加中断支持

    s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));

//此处添加外部中断控制EINT9, 高电平触发,是cs8900中断    

    unsigned long tmp = ioread32(S3C24XX_VA_GPIO + 0x8c); // EXTINT1寄存器

    tmp &= ~0xf0;

    tmp |= 0x90;

    iowrite32(tmp , S3C24XX_VA_GPIO + 0x8c); // 设置为高电平触发中断

  

    然后ifconfig, ping等命令在应用层都正常执行了。

感想:

    驱动移植时,本身最后改的代码就几句话,但是却要了解linux整个实现体系,包括设备总线驱动模型,platform driver,因为cs89x0驱动就是用这种架构,包括完整的中断处理流程,包括s3c2440芯片本身,cs8900a芯片本身资料,cs8900a驱动源代码,linux虚拟地址和物理地址映射等背景知识,真是折腾伤神啊,还好带来点成就感,开发从此后就可以使用nfs文件系统了,方便了很多,也值得了。

  • EEPROM is configured for unavailable media

问题描述:

    执行ifconfig eth0 up时,出错。

EEPROM is configured for unavailable media

问题分析:

    在cs89x0.c中,查找,发现出在net_open函数中,发现是lp->adapter_cnf没有合适的赋值。

    如cs89x0.txt描述, 在网卡驱动作为模块加载时,在模块加载时,可以传递参数,insmod cs89x0.o io=0x200 irq=0xA media=aui,以此确定媒介,会对lp->adapter_cnf赋值。

     但是当make menuconfig,配置成CONFIG_CS89x0_PLATFORM=y时,网卡驱动作为非模块开机自动加载, 不会自动对lp->adapter_cnf赋值。

解决方案:.

   如<<cs89x0.txt>> 6.5 Kernel module parameters描述,可采用u-boot向kernel传递命令的方式,如cs89x0_media=rj45等为lp->adapter_cnf赋值。

    另外就是直接修改源代码:当然这种方式不通用。

    在net_open中

    修改

    /* check to make sure that they have the "right" hardware available */

    switch (lp->adapter_cnf & A_CNF_MEDIA_TYPE) {

为    lp->adapter_cnf = A_CNF_MEDIA_TYPE | A_CNF_10B_T;

    /* check to make sure that they have the "right" hardware available */

    switch (lp->adapter_cnf & A_CNF_MEDIA_TYPE) {

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiayuleWA/article/details/45217877

智能推荐

【HTTP】HTTP基本知识_灰子学技术的博客-程序员秘密

写在前面的话,这篇文章是作者参考网上的帖子的一个整理,参考资料较多,作为Http的入门文章,以供学习使用~一、Http是什么?HTTP协议是Hyper Text Transfer Pr...

CSI简析(二)_氟西汀汀汀不喝奶茶的博客-程序员秘密

       在第一篇博客中,简单的介绍了一下什么是CSI,在这篇博客中,用matlab软件对采集到的CSI信息进行一下简单的解析。只需要将原始的CSI数据读取到一个元胞数组中,然后在命令行窗口中显示即可。                                  timestamp_low: NIC网卡1MHz时钟的低32位    bfee_count:驱动记录并发送到用户控件的波束测量...

springMVC请求参数解析问题:日期格式转换的问题(日期字符串yyyy-MM-dd解析为Date类型时时,返回400错误)_拔苦与乐喵的博客-程序员秘密

#写在最前:以后接收参数的属性类型,尽量都写为String类型,以免再次引发参数解析的问题#问题描述:springmvc controller中的一个方法中,接收参数为一个Bean,在这个bean里面有一个类型为Date的属性leaveBeginDate入参为json对象,格式:{"leaveBeginDate":["2018-07-05"]}请求报400错误#原因...

Java与设计模式(十一)创建型--抽象工厂模式_keep_trying_gogo的博客-程序员秘密

一需求二产品等级结构与产品族三抽象工厂模式概述抽象工厂模式定义抽象工厂模式中的角色抽象工厂模式代码示例四抽象工厂模式总结主要优点主要缺点适用场景工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个

TaskScheduler的分析_3_zk_sima的博客-程序员秘密

前面提到了跟 DelayTask相关的一个链表,现在来看跟BackgroundHandling相关的另一个链表:HandleSet.这个链表跟:setBackgroundHandlingdisableBackgroundHandlingmoveSocketHandling这3个函数相关。其中setBackgroundHandling根据第二个参数 int conditionSet 是否为零 对应于插入和删除节点的操作。disableBackgroundHanding 对应删除节点操作。moveSocketH

C# - 简单介绍TaskScheduler _iteye_13882的博客-程序员秘密

标题: C# - 简单介绍TaskSchedulerTitle: C# - A Brief bump to the TaskSchedulertask Scheduler根据定义The task Scheduler by the definition blurb.“Is the class where the usage context is within the task libra...

随便推点

Mysql-组件_James_si的博客-程序员秘密

Buffer Poolbuffer pool 默认大小是128M, 不过在生产环境下是偏小的. 一般要调整大一些. 16核32G服务器上一般设置为2G.[server]innodb_buffer_pool_size = 2147483648数据页/缓存页磁盘中不是直接存的一行一行的数据, 而是抽象成一个一个的数据页存放的, 对应到Buffer Pool中就是一个一个的缓存页.比如要更新一条数据, 就会找到这行数据所在的数据页加载到Buffer Pool中.磁盘中数据页默认大小是16KB.

Bzoj2154: Crash的数字表格_Cyhlnj的博客-程序员秘密

题意求ans=∑ni=1∑nj=1lcm(i,j)求ans=\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i, j) n,mSol原式=∑ni=1∑mj=1i∗jgcd(i,j)原式=\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i*j}{gcd(i, j)} 假设n 则ans=∑nd=1∑⌊nd⌋i=1∑⌊md⌋j=1d∗i∗j∗[gcd

程序代码加行号及修改注释颜色为蓝色_a63820542的博客-程序员秘密

在侯捷《word排版艺术》一书中有一个很实用的vba宏,可通过录制宏,打开vba代码窗口,然后添加如下代码:Dim nLineNum '行号(数值)Dim sLineNum As String '行号(文字)Dim selRge As Range '用以记录整区块程序代码(多行)Dim i '计数器'以下变量用于“将注释改为蓝色”Dim lineProgramRange ...

DagScheduler 和 TaskScheduler_dagscheduler和taskscheduler_总角之宴的博客-程序员秘密

DagScheduler 和 TaskScheduler 的任务交接  spark 调度器分为两个部分, 一个是 DagScheduler, 一个是 TaskScheduler,  DagScheduler 主要是用来把一个 Job 根据宽依赖划分为多个Stage(阶段),  对于划分出来的每个 stage 都抽象为一个 TaskSet任务集 交给TaskScheduler 来进行进一步的...

[条码打印]使用斑马语言(ZPL)打印汉字_weixin_30349597的博客-程序员秘密

默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟windows里面的字体库肯定不是一回事, 起初我觉得最好能通过上传字体来实现打印汉字, 但是大概研究了一下, 发现这个太复杂, 而且字体库文件也无从搞到, 所以换了方向, 考虑将汉字画成图片, 通过打印图片的方式来实现打印汉字. 所以总的过程为: 将需要打印的汉字在服务器上通过GDI画成图片, 然后...

Anaconda Propmt切换到除C盘的其它盘_Phoenixtree_DongZhao的博客-程序员秘密

Anaconda Propmt切换到除C盘的其它盘今天需要用 Anaconda Propmt 运行一个命令,而代码在 E 盘。进入 Anaconda Propmt,默认的路径是 C:\Users\Administrator,即自己的用户路径下面。而我又不想把代码复制在 C 盘里,所以,需要修改路径。但当我尝试使用cd E:\ Code\ 指令时,发现并不能进去。然后尝试退到 C 盘,再执行cd E:\ Code\, 还是不行。原来,切换盘的指令不是 cd,正确执行过程是:...