STM32F103 ucLinux内核没有完全启动

从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅。

但是内核输出不正常,如下所示:

Linux version 2.6.26-uc0 (stm32@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-163) ) #2 Wed Sep 2 10:09:23 UTC 2009
CPU: ARMv7-M Processor [411fc231] revision 1 (ARMv?(11)M)
Machine: STM3210E-EVAL
Warning: bad configuration page, trying to continue
SRAM Config: bank[0] @ 0x68000000 (size: 1024KB) - bank[1] @ 0x20000000 (size: 64KB).
Ignoring unrecognised tag 0x00000000
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 254
Kernel command line:
PID hash table entries: 16 (order: 4, 64 bytes)
console [ttyS0] enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Bad page state in process 'swapper'
page:68901180 flags:0x2f55030e mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011c0 flags:0x08a8420a mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011c0 flags:0x08a8420a mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011e0 flags:0x2eb8430e mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:689011e0 flags:0x2eb8430e mapping:00000000 mapcount:0 count:134218033
Trying to fix it up, but a reboot is needed
Backtrace:
Bad page state in process 'swapper'
page:68901200 flags:0x0185000c mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
CPU: 0 Tainted: G B (2.6.26-uc0 #2)
pc : [<08039bc2>] lr : [<08039cb1>] psr: 0100000b
sp : 20001f50 ip : 00000000 fp : 68901000
r10: 2000c28c r9 : 00000006 r8 : 00900000
r7 : 00000000 r6 : 00020000 r5 : 0c955a82 r4 : 68901220
r3 : 2984a715 r2 : ffffffff r1 : 9e375c8e r0 : 689
01220

跟踪调试内核,发现在mem_init→ free_all_bootmem_node→  free_all_bootmem_core→  __free_pages_bootmem→ __free_page→ __free_pages

→free_hot_page→ free_hot_cold_page→ free_pages_check→ bad_page

在bad_pages函数最终输出了下面的信息

Bad page state in process 'swapper'
page:68901180 flags:0x2f55030e mapping:00000000 mapcount:0 count:0
Trying to fix it up, but a reboot is needed
Backtrace:

而导致上面的原因是在free_all_bootmem_core函数中

pfn_to_page→ __pfn_to_page(根据推断是它,但看编译又不是)

#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
#define PHYS_OFFSET (CONFIG_DRAM_BASE)
#define CONFIG_DRAM_BASE 0x20000000

struct page *mem_map,page结构体占用32个字节,mem_map的地址是0x6800 0000,ARCH_PFN_OFFSET根据上面的推算为2000 0

若pfn是6800 0,则内存0x6800 0000对应的页管理地址是

0x6800 0000 +(6800 0-2000 0)*32 = 6890 0000

而6890 0000这个地址实际是不存在的。

综上所述,很奇怪ST官网上的开发板可以正常运行。

我做了如下尝试:

1、将官网上的BOOT、内核下载到自己的设备上,串口输出乱码。原因是官网上是无源的8M晶振,而我们使用的是有源的11.0592M,

这样根据BOOT配置,系统主频变成了99M,但是串口的波特率应该不会改变啊,输出却是乱码,试了几个波特率都不对。

2、内核中,在调用控制台初始化时,我对串口1重新配置,修改它的波特率,仍然不起作用,输出乱码。

3、更换晶振,但是手边没有8M有源的,无源又需要电容搭接电路等,现在暂时没有试验出来。

STM32F103 ucLinux开发之三(内核启动后不正常)(完结)的更多相关文章

  1. STM32F103 ucLinux开发之四(内核启动后的调试)

    Stm32-uclinux启动后的调试 1.  修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后 ...

  2. STM32F103 ucLinux开发BOOT

    STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...

  3. STM32F103 ucLinux开发之一(BOOT分析及源码)

    STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...

  4. 通过JTAG对比内核启动后text/rodata段内容

    关键词:vmlinux.strip.dump._text.__end_rodata等等. 在日常的调试中,可能会在某些情况下踩到内核重要的数据,比如代码段或者rodata之类. 这种情况下,需要确认这 ...

  5. STM32F103 ucLinux开发之二(内核启动汇编代码分析)

    start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...

  6. linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)

    linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86 ...

  7. 自定义内核启动后的Logo

    1.使用图像GIMP工具   2.详细步骤如下:   A.将800x480的图片导入到GIMP工具.   B.选中GIMP菜单栏进行以下操作     图像         -->模式       ...

  8. 内核启动后,lcd显示logo失败

    针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印“Start display and show logo”,但是LCD屏没有显示    ...

  9. Stm32-uclinux启动后的调试

    Stm32-uclinux启动后的调试 1.  修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后 ...

随机推荐

  1. input file样式美化

    默认样式: <input type="file" /> 美化样式时: 将其设置为透明,设置宽高覆盖到需要用的地方,宽100%,高100% 可以用到定位 .box{ po ...

  2. 基于 JWT-Auth 实现 API 验证

    基于 JWT-Auth 实现 API 验证 如果想要了解其生成Token的算法原理,请自行查阅相关资料 需要提及的几点: 使用session存在的问题: session和cookie是为了解决http ...

  3. PDO drivers no value in Windows 或 ndefined class constant 'MYSQL_ATTR_USE_BUFFERED_QUERY'

    把办公室的drupal7.54版本放到自己的笔记本(OS:Windows10 Pro,php:7.0.9,mysql 5.7.11,apache:2.4)上运行不了,查看了各项配置应该没问题啊.之前还 ...

  4. Swiper测试

    在页面body中插入 <div class="swiper-container temp"> <div class="swiper-wrapper&qu ...

  5. Linux命令行bash批量重命名文件

    本文介绍下,在linux下使用shell批量重命名文件的例子,有需要的朋友参考下吧. 在linux中,重命名文件名,需要用到mv命令.如果需要批量重命名名一批文件,就需要写bash脚本或命令行了. 例 ...

  6. eclipse 乱码问题总结

    Eclipse 的控制台必须用GBK编码.所以条件1和条件4必须同时满足否则运行的还是乱码.才能保证不是乱码. 条件1,Window  | Preferences  | Workspace  |  T ...

  7. PHP中的trait方法冲突

    laravel使用中我们可能需要对User model使用softdelete这个功能,以便删除后还可以恢复,不幸的是entrust模块也有这个方法,两者产生冲突, 解决办法: https://lar ...

  8. 快速设置UITableView不同section对应于不同种类的cell

    快速设置UITableView不同section对应于不同种类的cell 本文主要是为了写明如何在UITableView中,一个section对应于一种类型的cell,写起来不凌乱. 在不封装任何类的 ...

  9. cygwin64-安装包管理工具

    1.dos command, install pkg $ setup-x86_64.exe -q -P curl $ setup-x86_64.exe -q -P lynx 2. cygwin64 c ...

  10. Python学习---文件操作的学习1208

    1.1. 对文件操作基本操作: 操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 注意:pyton中操作的文件是utf8保存的,打开文件时open函数是通过操作系统 ...