做嵌入式Linux移植,最常见也最郁闷的问题,就是自己新做的内核镜像,还没有神马把握,,就要忐忑不安地烧到板子上去测试。这个时候,我宁愿它突出一堆oops,甚至panic,心里觉得舒坦些。可是它要啥都不吐,那就抓瞎了。

这种情况,就是printk缓冲区的信息准备好了,但是串口console初始化失败或者还没执行,printk内存缓冲区吐不出来造成的。

一般内核开启会打印Linux version 2.6.xx  (gcc version 4.2.2) #47 PREEMPT  这样的linux_banner信息。

见2.3.34.1,start_kernel 函数

printk(KERN_NOTICE "%s", linux_banner);

setup_arch(&command_line);

可以看到,这里是先printk,再setup_arch的。

我这里是powerpc的板子,很可能由于dts的配置导致板子不能识别或串口配置错误等,导致内核连个屁都吐不出来。

而检查dts的内容,是在setup_arch里进行的啊。我就不服气了,凭什么要因为后面函数的原因,导致我前面的printk出不来。

内核早期输出工具early_printk不是所有平台都能用。powerpc特有的早期调试机制,我尝试了半天也没成功。

使用ppc_md.progress ,貌似可以实现powrpc下的早期输出。但是ppc_md.progress的初始化,可是在

void __init chrp_setup_arch(void)

{

...

rtas_initialize();

if (rtas_token("display-character") >= 0)

ppc_md.progress = rtas_progress;

...

}

这里才被初始化的,此时start_kernel 我觉得早就开始执行了。也就是说第一个printk已经使用过,

ppc_md.progress的初始化才开始。

这里,我从Embedded Linux primer上汲取力量,得到一种强大的软件调试手段,让printk的东西吐出来。

前提条件:

1、板子有热重启键,或者其他热重启机制(Linux异常重启,默认时间180秒),或者使用仿真器重启。不过既然有仿真器,那就不用往下看了。

2、执行到了start_kernel 中printk(KERN_NOTICE "%s", linux_banner);这一步内核尚未异常。

3、拥有能够查看内存的bootloader,如 uboot或其前身ppcboot 的md命令。

查看内核的System.map文件,__log_buf这个符号的虚拟地址,如我这里

c032cf48 b __log_buf

将内核虚拟地址转换成物理内存地址很简单,因为大多数嵌入式平台不会使用984M以上的内存,内核虚拟地址仅仅是物理地址的一个线性偏移而已。

我的物理内存基址是0,所以物理内存地址很可能是0x0032cf48

boot内核,等待一会,然后热重启。其实内存上的信息还热乎着呢,马上使用uboot查看

=> md 32cf48

cmdtp 1ffc9b1c ,flag 0 ,argc  2,argv[0] md ,argv[1] 32cf48

0032cf48: 3c363e55 73696e67 204d5043 38333778    <6>Using MPC837x

0032cf58: 20524442 2f574c41 4e206d61 6368696e     RDB/WLAN machin

0032cf68: 65206465 73637269 7074696f 6e0a3c35    e description.<5

0032cf78: 3e4c696e 75782076 65727369 6f6e2032    >Linux version 2

0032cf88: 2e362e33 342e3120 28787940 626e632d    .6.34.1 (xy@bnc-

0032cf98: 79687029 20286763 63207665 7273696f    yhp) (gcc versio

0032cfa8: 6e20342e 322e3320 28536f75 72636572    n 4.2.3 (Sourcer

0032cfb8: 7920472b 2b204c69 74652034 2e322d31    y G++ Lite 4.2-1

0032cfc8: 37312929 20233530 2053756e 204f6374    71)) #50 Sun Oct

0032cfd8: 20313020 32333a35 353a3239 20504454     10 23:55:29 PDT

0032cfe8: 20323031 300a3c37 3e466f75 6e64206c     2010.<7>Found l

0032cff8: 65676163 79207365 7269616c 20706f72    egacy serial por

0032d008: 74203020 666f7220 2f696d6d 72406530    t 0 for /immr@e0

0032d018: 30303030 30302f73 65726961 6c403435    000000/serial@45

0032d028: 30300a3c 373e2020 6d656d3d 65303030    00.<7>  mem=e000

0032d038: 34353030 2c207461 6464723d 65303030    4500, taddr=e000

虽然条件艰苦了点,总比没有强啊。怎么也比点灯调试爽多了。

此方法非常imba,山穷水尽的时候可以一试。

同样适用于arm,之前测试过。

当然,最好能有仿真器。

无内存启动linux,彻底解决Linux启动无输出问题相关推荐

  1. 【Linux】解决Linux服务器内存不足问题

    [Linux]解决Linux服务器内存不足问题 参考文章: (1)[Linux]解决Linux服务器内存不足问题 (2)https://www.cnblogs.com/haochuang/p/1191 ...

  2. 电脑启动计算机无法启动 修复工具栏,如何利用Win7启动修复功能解决电脑启动进不了系统的问题...

    如何利用Win7启动修复功能解决电脑启动进不了系统的问题 腾讯视频/爱奇艺/优酷/外卖 充值4折起 电脑就像人一样,时常会生点"小病",闹闹"罢工".在所有电脑 ...

  3. linux . 乱码,解决Linux乱码现象

    这里介绍三种解决Linux乱码现象的方法,这里三个步骤修改远程linux机器的配置.然后再改secure crt的设置.退出,再重新登录.经过这三个步骤我们就完成了Linux乱码现象的解决方法. 具体 ...

  4. 雷电模拟总是显示android启动,雷电模拟器启动失败如何解决?启动失败解决方法图文分享...

    雷电模拟器启动失败卡在0-29%怎么解决?有很多用户在启动雷电安卓模拟器程序时,发现程序启动卡在0-29%,启动失败的情况,下面通过这篇文章给大家讲讲怎么解决. 雷电安卓模拟器加载时卡在89%解决方法 ...

  5. linux篇---解决 Linux 系统,出现“不在sudoers文件中,此事将被报告”的问题

    解决 Linux 系统,出现"不在sudoers文件中,此事将被报告"的问题 我在使用个人用户(非root用户)时,在添加用户,使用sudo命令来执行的时候,需要验证当前用户的密码 ...

  6. Linux之 解决 Linux 性能瓶颈的黄金 60 秒

    文章目录 前言 一.概述 1.1 uptime 1.2 dmesg丨tail 1.3 vmstat 1 1.4 mpstat-P ALL 1 1.5 pidstat 1 1.6 iostat-xz 1 ...

  7. VMOS+小黄鸟无root抓包(解决抓包无网络问题)(附工具)

    前言: 最近在搞手机安卓抓包,看了网上很多教程都没有解决抓包无网络问题.于是费了一上午时间找遍全网终于解决了,在此分享给大家参考. 准备工具(文末附工具): 1. vmos pro破解版 2. 小黄鸟 ...

  8. 【Linux】解决Linux上解压jdk报错gzip: stdin: not in gzip format

    最近在阿里上买了个服务器玩,需要安装jdk,在解压过程中遇到了一些问题,又是一番Google度娘,终于解决了.问题原因让我有点无奈-- 输入 #tar -xvf jdk-8u131-linux-x64 ...

  9. linux中gradle编译慢,【Linux】解决linux下android studio用gradle构建从jcenter或maven下载依赖太慢...

    一个简单的办法,修改项目根目录下的build.gradle,将jcenter()或者mavenCentral()替换掉即可: allprojects { repositories { maven{ u ...

最新文章

  1. 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )
  2. mysql 返回mysql,mysql函数返回表
  3. 基于FPGA的costas环同步系统仿真与分析
  4. LeetCode 52.N-Queens II
  5. jdk动态代理源码分析(一)---代理的定义
  6. SAP Spartacus RouteReducer
  7. java des3加密_JAVA加密算法(3)- 对称加密算法(DES、3DES、AES)
  8. [后缀数组] Luogu P5028 Annihilate
  9. leetcode 786 第K个最小的素数分数
  10. MySQL一个语句查出各种整形占用字节数及最大最小值
  11. flex blazeds java spring_flex3+blazeds+spring+hibernate整合小结
  12. 项目管理-项目风险管理
  13. 广州科二化龙考场_广州考驾照[科目二]化龙考场.考试详解
  14. grunt的基本使用
  15. Stanford Parser使用
  16. java8421码,8421BCD转余3码Verilog HDL的设计(2)
  17. 用Speedtest-Tracker跟踪上网速度
  18. 2022年建筑电工(建筑特殊工种)考试技巧及建筑电工(建筑特殊工种)复审模拟考试
  19. CNN 入门讲解:什么是全连接层
  20. 如何调试oracle,sqlserver存储过程

热门文章

  1. 大学计算机实验6实验报告,东华大学计算机病毒课实验六宏病毒实验报告
  2. 华为HarmonyOS 鸿蒙,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
  3. ios html5 拍照旋转,H5 解决ios拍照旋转90度
  4. 使用STC-ISP向KEIL添加STC芯片头文件
  5. 英文个人简历中英文词汇对照大全
  6. 用html画布做扇形,jquery canvas 画扇形
  7. 零数科技成功通过CMMI3级认证,软件研发能力获国际认可
  8. Python:根据身高、体重计算BMI指数
  9. POJ2228 Naptime 【例题精讲】
  10. Laya---竖向滚动列表