日期:2014-05-16  浏览次数:20622 次

请教 :linux启动时的logo
Hi 大虾们:
  有一个问题请教。关于frame buffer的问题。
  我现在在调试omap的开发板,非常迷茫。。。。。。
   
  现在最简单的事情就是我想看看logo(左上角的小企鹅)是如何打印出来的。
  我的调试方法比较简陋。就是看代码然后加打印。
  call treace:

  file:logo.c
  fb_find_logo(int depth)
  file:fbmem.c
  fb_prepare_logo(struct fb_info *info, int rotate)
  file:fbcon.c
  static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
  int cols, int rows, int new_cols, int new_rows)
  file:fbcon.c
  static void fbcon_init(struct vc_data *vc, int init)
  file:vt.c
  static void visual_init(struct vc_data *vc, int num, int init)
  {
  ........
  vc->vc_sw->con_init(vc, init);
  ........
  }
  file:vt.c
  static int bind_con_driver(const struct consw *csw, int first, int last,int deflt)
  file:vt.c
  int take_over_console(const struct consw *csw, int first, int last, int deflt)
  file:fbcon.c
  static int fbcon_takeover(int show_logo)
  file:fbcon.c
  static int fbcon_fb_registered(struct fb_info *info)
  file:fbcon.c
  static int fbcon_event_notify(struct notifier_block *self,unsigned long action, void *data)
   
  后面找不到调用了,而且看了代码加了打印,发现这条线索好像是不对的。有没有什么问题啊?是不是我的trace的思路错了?

  请大虾指点。

谢谢

------解决方案--------------------
要么你编一个debug版的内核试试,优化后的内核有些函数内联了,有些被删了,有些逻辑变了,反正很坑爹
------解决方案--------------------
我一直只是加debug选项,不过又查了下貌似仅仅是增加了调试符号,优化其实还是开的
------解决方案--------------------
你进到你要调试的几个文件的目录,在makefile里加上-O0,如果还跟不到你的代码,那可能就是trace不对
------解决方案--------------------
你怎么trace的?手动?
------解决方案--------------------
探讨

还有没有谁知道这个logo kernel boot后再lcd左上角有个小企鹅。
到底是怎么打印到lcd上面的?

除了frame buffer的方法还有其他什么方法吗?

谢谢

------解决方案--------------------
手动怎么行 内核有现成的调用栈打印api
使用dump_stack 即可 ,除了内联函数,其他的不会跟丢

------解决方案--------------------
回答楼主两个问题:
1 linux的启动logo是怎么实现的?
答:通常linux把图片数据变成数组编译进内核镜像,内核启动加载fb驱动过程中,注册完fb设备后,会将图片填入fb设备的显存地址.(具体好像是用fb设备的draw_image的函数,函数名可能不太准确.呵呵).
2 内核调试问题?
楼主想调试的话建议用dump_stack函数
------解决方案--------------------
dump_stack是拿来用的 不是研究的啊
用起来非常简单啊 在目标函数里dump_stack(); 会打印当前的函数调用栈