无内存启动linux,彻底解决Linux启动无输出问题
做嵌入式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启动无输出问题相关推荐
- 【Linux】解决Linux服务器内存不足问题
[Linux]解决Linux服务器内存不足问题 参考文章: (1)[Linux]解决Linux服务器内存不足问题 (2)https://www.cnblogs.com/haochuang/p/1191 ...
- 电脑启动计算机无法启动 修复工具栏,如何利用Win7启动修复功能解决电脑启动进不了系统的问题...
如何利用Win7启动修复功能解决电脑启动进不了系统的问题 腾讯视频/爱奇艺/优酷/外卖 充值4折起 电脑就像人一样,时常会生点"小病",闹闹"罢工".在所有电脑 ...
- linux . 乱码,解决Linux乱码现象
这里介绍三种解决Linux乱码现象的方法,这里三个步骤修改远程linux机器的配置.然后再改secure crt的设置.退出,再重新登录.经过这三个步骤我们就完成了Linux乱码现象的解决方法. 具体 ...
- 雷电模拟总是显示android启动,雷电模拟器启动失败如何解决?启动失败解决方法图文分享...
雷电模拟器启动失败卡在0-29%怎么解决?有很多用户在启动雷电安卓模拟器程序时,发现程序启动卡在0-29%,启动失败的情况,下面通过这篇文章给大家讲讲怎么解决. 雷电安卓模拟器加载时卡在89%解决方法 ...
- linux篇---解决 Linux 系统,出现“不在sudoers文件中,此事将被报告”的问题
解决 Linux 系统,出现"不在sudoers文件中,此事将被报告"的问题 我在使用个人用户(非root用户)时,在添加用户,使用sudo命令来执行的时候,需要验证当前用户的密码 ...
- 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 ...
- VMOS+小黄鸟无root抓包(解决抓包无网络问题)(附工具)
前言: 最近在搞手机安卓抓包,看了网上很多教程都没有解决抓包无网络问题.于是费了一上午时间找遍全网终于解决了,在此分享给大家参考. 准备工具(文末附工具): 1. vmos pro破解版 2. 小黄鸟 ...
- 【Linux】解决Linux上解压jdk报错gzip: stdin: not in gzip format
最近在阿里上买了个服务器玩,需要安装jdk,在解压过程中遇到了一些问题,又是一番Google度娘,终于解决了.问题原因让我有点无奈-- 输入 #tar -xvf jdk-8u131-linux-x64 ...
- linux中gradle编译慢,【Linux】解决linux下android studio用gradle构建从jcenter或maven下载依赖太慢...
一个简单的办法,修改项目根目录下的build.gradle,将jcenter()或者mavenCentral()替换掉即可: allprojects { repositories { maven{ u ...
最新文章
- 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )
- mysql 返回mysql,mysql函数返回表
- 基于FPGA的costas环同步系统仿真与分析
- LeetCode 52.N-Queens II
- jdk动态代理源码分析(一)---代理的定义
- SAP Spartacus RouteReducer
- java des3加密_JAVA加密算法(3)- 对称加密算法(DES、3DES、AES)
- [后缀数组] Luogu P5028 Annihilate
- leetcode 786 第K个最小的素数分数
- MySQL一个语句查出各种整形占用字节数及最大最小值
- flex blazeds java spring_flex3+blazeds+spring+hibernate整合小结
- 项目管理-项目风险管理
- 广州科二化龙考场_广州考驾照[科目二]化龙考场.考试详解
- grunt的基本使用
- Stanford Parser使用
- java8421码,8421BCD转余3码Verilog HDL的设计(2)
- 用Speedtest-Tracker跟踪上网速度
- 2022年建筑电工(建筑特殊工种)考试技巧及建筑电工(建筑特殊工种)复审模拟考试
- CNN 入门讲解:什么是全连接层
- 如何调试oracle,sqlserver存储过程
热门文章
- 大学计算机实验6实验报告,东华大学计算机病毒课实验六宏病毒实验报告
- 华为HarmonyOS 鸿蒙,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
- ios html5 拍照旋转,H5 解决ios拍照旋转90度
- 使用STC-ISP向KEIL添加STC芯片头文件
- 英文个人简历中英文词汇对照大全
- 用html画布做扇形,jquery canvas 画扇形
- 零数科技成功通过CMMI3级认证,软件研发能力获国际认可
- Python:根据身高、体重计算BMI指数
- POJ2228 Naptime 【例题精讲】
- Laya---竖向滚动列表