- 博客(151)
- 资源 (3)
- 收藏
- 关注
原创 测试framebuffer
static GGLContext *gr_context = 0;static GGLSurface gr_framebuffer[2];static unsigned gr_active_fb = 0;static int gr_fb_fd = -1;static int gr_vt_fd = -1;static struct fb_var_screeninfo v
2013-12-04 22:40:59
2529
原创 kernel hexdump分析 (2.0)
有的时候print_hex_dump_bytes循环打印很多信息的时候(大于1K)用UART串口打印的信息总是会有丢失,估计是printk缓冲区的问题把,具体原因不是太清楚于是自己写了个比较笨的dump函数,问题得到解决://每次打印128个字节(当然你也可以打印更多),只调用一次printk , // 而 print_hex_dump_bytes 则 最多32个字节 就调用一次p
2013-12-04 22:35:01
2021
原创 kernel hexdump分析
驱动调试中,很多时候是二进制的,这个时候hexdump就是个非常有用的工具了。不要再自己去实现类似的功能,kernel代码里面就有:参考: kernel/lib/hexdump.c// 0Xxx转换成 ASCII ,实现简单巧妙const char hex_asc[] = "0123456789abcdef";#define hex_asc_lo(x) hex_asc[((x)
2013-12-04 22:31:33
5188
原创 android recovery模式选项中索引改进
有个客户有特殊要求,需要去掉recovery模式的某些选项#define ITEM_REBOOT 0#define ITEM_APPLY_SDCARD 1#define ITEM_WIPE_DATA 2#define ITEM_WIPE_CACHE 3#ifdef SUPPORT_DATA_BACKUP_RESTOR
2013-12-03 22:36:45
1332
原创 ARM架构kprobe应用及实现分析(11 原理)
1 拷贝探测的code , 插入特殊指令(ARM是插入未定义指令)2 CPU运行到未定义指令,会产生trap, 进入ISR,并保存当前寄出去的状态 通过LINUX的通知机制,会执行“pre_handler”(前提是你已经注册过了)3 进入单步模式,运行你备份出来的代码 (此代码运行的是拷贝出来的,防止别的CPU也恰巧运行到此位置)4 单步模式后,运行“post_handler
2013-12-03 22:31:02
3143
原创 android flash 下载完整性检查
由于厂线下载都是大批量的下载难免有下载失败的情况(认为操作或nand / emmc本身的缺陷),故下载校验就显得尤为重要:
2013-12-03 22:26:24
1711
原创 如何mount ext4 分区
mount -t ext4 target_path/your.img ./mount_dir 上面mount的时候有可能失败: 第一中,没有权限: sudo mount -t ext4 target_path/your.img ./mount_dir 第二中,由于你的your.img不是一个真正的分区后者设备:
2013-11-28 21:46:23
8811
原创 preloader阶段memory测试
假如MEMORY出现硬件问题的话,会导致系统崩溃,有必要在preloader阶段,大概检测下MEMORY是否读写正常:void mem_init (void){ int i = 0; // 目前测试大小为 #define MEM_TEST_SIZE (0x2000) // 起始位置为 : 0x80000000 ,这个地址一
2013-11-28 21:45:49
1901
原创 取得下个参数宏定义
#define skip(n) do { argc -= (n); argv += (n); } while (0)实际当中用的时候,只需要:skip(1); //就可以取得下个参数
2013-11-27 22:14:57
1188
原创 tail命令实现截取掉文件开始的一部分字节
实现把文件开始的1024个字节截取(注意参数N / +N的区别):tail -c +1024 ./secro_dump.bin > cut_secro.im
2013-11-27 22:11:47
4508
原创 ARM架构显示寄存器的详细信息
void show_regs(struct pt_regs * regs){ printk("\n"); printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm); __show_regs(regs); dump_stack();} void __show_regs(struct p
2013-11-27 22:07:29
2352
原创 Uboot 怎么添加commandline参数
参考:bootable/bootloader/uboot/arch/arm/lib/bootm.c有的时候你需要往kernel传入更多的参数,如uboot自身的版本号,或者LCM的相关驱动参数int do_nand_boot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ ..... //加入preloader
2013-11-27 22:04:59
3027
原创 linux reset 分析
遇到个系统reset的问题,简单看了下kernel reset的代码,简单记录下:简单看下log:[ 25.900749] Restarting system with command 'recovery'.[ 25.901449] arch_reset: cmd = recovery[ 25.901981] wdt_arch_reset called@Kernel
2013-11-27 22:02:25
4055
原创 minicom 轻松使用
由于preloader / uboot / kernel 调试都会用到串口输出调试信息, 这里简单介绍下minicom的使用 ./minicom -s 之后选择 serial port setup (设置波特率,停止位等基本信息) 配置正确的设备文件 dmesg : 当时kernel log 太多的话可以先: sudo dmesg –c
2013-11-20 23:10:20
1566
原创 获取kernel各个数据段,代码段的地址及范围
有的时候需要知道代码段,数据段,字符串段,已经初始话数据段等信息记得添加: #include printk("_text is %08x--%08x , \ _data is %08x--%08x , \ __bss_start is %08x--%08x , \ __init_begin is %08x--%08x ,
2013-11-20 22:54:28
4834
2
原创 Uboot 向cmdline添加更多的参数
参考:bootable/bootloader/uboot/arch/arm/lib/bootm.c有的时候你需要往kernel传入更多的参数,如uboot自身的版本号,或者LCM的相关驱动参数int do_nand_boot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ ..... //加入preloader
2013-11-20 22:49:21
3896
原创 ARM架构kprobe应用及实现分析(10 trap中断注册及回调)
首先可以看下探测点检测到非法指令时候,产生中断的dump_stack:symbol] (dump_backtrace+0x0/0x10c) from [] (dump_stack+0x18/0x1c)symbol] (dump_stack+0x0/0x1c) from [] (handler_pre+0x144/0x19c [kk])symbol] (handler_pre+0x0/0
2013-11-19 22:55:29
2173
原创 ARM架构kprobe应用及实现分析(9.0 arch_prepare_kprobe平台相关注册)
// ARM 架构注册kprobeint __kprobes arch_prepare_kprobe(struct kprobe *p){ kprobe_opcode_t insn; kprobe_opcode_t tmp_insn[MAX_INSN_SIZE]; unsigned long addr = (unsigned long)p->addr; bool thumb
2013-11-19 22:48:54
2023
原创 ARM架构kprobe应用及实现分析(8.0 register_kprobe实现)
int __kprobes register_kprobe(struct kprobe *p){ int ret = 0; struct kprobe *old_p; struct module *probed_mod; kprobe_opcode_t *addr; //返回要探测的决定地址 addr = kprobe_addr(p); if (IS_
2013-11-19 22:42:43
2036
原创 ARM架构kprobe应用及实现分析(7.0 自动显示参数的值)
通过前面的介绍知道参数在寄存器及堆栈的位置,我们就有可能显示参数的值jprobe也可以显示参数的值,但是其有缺点:不能探测函数时加上偏移量具体上下文请参考: ARM架构kprobe应用及实现分析(3.0 被探测函数说明)导出参数的函数:static int dump_arm_parameter(struct pt_regs *regs){ int i=0;
2013-11-19 22:36:46
1769
原创 ARM架构kprobe应用及实现分析(6.0 导出堆栈的值)
上篇讲过了导出寄存器的值但是当函数参数多余4个的话(R0 R1 R2 R3 ),其他的值会保存在堆栈中,所以必须导出SP附近的值才能查看其它参数的值此函数实现如下:第一个参数为SP的值,第二个是一SP为中心要打印周围栈的数据static int dump_arm_stack(unsigned int * _addr , unsigned int addrSize){
2013-11-17 11:13:33
1601
原创 ARM架构kprobe应用及实现分析(5.0 打印寄存器的值)
kp.pre_handler = handler_pre;在此函数中打印寄存器的值,才能对我们分析当时的情况有帮助。(如查看调用函数的参数值等)static int handler_pre(struct kprobe *p, struct pt_regs *regs){ printk(" kprobes name is %s pt_regs size is %d \n
2013-11-17 10:58:07
2517
原创 ARM架构kprobe应用及实现分析(3.0 被探测函数说明)
在此系列中都是探测 testAddadd5 ,作为分析入口,我在do_fork 函数的最后的位置调用了testAddadd5 ,具体模样如下:int mykProbeCount = 0;char * mytestbuf ="this is a mytestbuf";int testAddadd5(int a, int b,int c,char * buf,int d,int
2013-11-16 22:45:13
1511
原创 ARM架构kprobe应用及实现分析(2.0 register_kprobe error 38)
最开始 register_kprobe 的时候,返回错误,一直注册不成功,且返回错误号为38最后发现是一些kernel编译的配置没有打开导致的.所以当你编译kernel之前请确保下面选项是打开支持的: general setup --> kprobesCONFIG_OPTPROBES=yCONFIG_PREEMPT=yCONFIG_OPTPROBES=
2013-11-16 22:38:31
2276
原创 ARM架构kprobe应用及实现分析(1.0 简单示例)
网络对krpobe的实现机制及扩展都不是特别详细由于工作需要及个人爱好,正好有这个机会好好学习此模块及应用到实际中并将整个应用扩展及当时的分析情况,详细记录下来,希望对感兴趣的人有些许帮助最开始还是先给个具体的栗子: static struct kprobe kp = { //.symbol_name = "do_fork", .symbol_name =
2013-11-16 22:24:36
1935
原创 ARM 架构 dump_stack 实现分析(3.0 printk %pS选项实现)
上篇提到了函数:void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame){#ifdef CONFIG_KALLSYMS //记住%pS是关键 printk 与 普通printf最大的不同 //惭愧啊,现在才知道此选项 print
2013-11-15 22:43:27
5513
原创 ARM 架构 dump_stack 实现分析(2.0 调用时序)
看下具体调用时序:void dump_stack(void){ dump_backtrace(NULL, NULL);} dump_stack -->dump_backtrace -->unwind_backtrace - ->dump_backtrace_entry
2013-11-15 22:31:13
5295
原创 ARM 架构 dump_stack 实现分析(1.0 具体实例)
dump_stack也就是我们平时说的backtrace对分析,对异常或crash发生的时候,具有重要的意义 每种架构会有或多或少的区别,如现在linux kernel支持如下架构:alpha avr32 c6x frv hexagon m68k mips openrisc powerpc score sparc um
2013-11-15 22:26:26
3087
原创 kernel list 与普通list区别及其最牛叉的地方
参考:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ http://blog.csdn.net/yangzhiloveyou/article/details/8758699
2013-11-09 12:25:35
1279
原创 nand flash otp(one time Programable)驱动编写细节
首先了解下OTP的背景:OTP 是指OTP区域内的每一bit位1. 仅有一次将 “1” 写成 “0”的机会2. 以上操作不能逆转(人死不能复生),即将“0”改写为“1”,也不能进行擦除该位 某些敏感的数据如:IMEI 号,有的客户要求此号能写且只能够写一次,这个时候OTP就有用武之地了。首先需要了解下nand flash 的地址概念(一共五个bytes)
2013-11-08 21:22:20
6397
原创 adb push常见问题
有的时候我们直接 adb push someting android会遇到下面的错误:failed to copy 'someting' to 'android': Read-only file system这个时候你只需要adb remount下就可以解决问题。但是当你要更新根文件系统(bootimage),如你要更新些属性文件由于根文件系统是直接在内存中的,默认MO
2013-11-08 21:04:53
9726
原创 linux md5sum 应用
首先看个最简单的例子:$ md5sum ./1/iAmCdRom.iso ./2/iAmCdRom.iso 773682e3494b6155855dd580bef8cb04 ./1/iAmCdRom.iso34d75a13d98b245c2a32a0bf816abb36 ./2/iAmCdRom.iso//更多详细的选项如下:$ md5sum --helpUsag
2013-11-08 20:57:11
1534
原创 怎么找到android系统input命令的实现代码
首先,我的固定思维认为system层中的命令大部分是用C语言写的。所以一直以为input命令也是C语言写的,但是找了很多地方都找不到对应其源代码。最后在framework开发人员帮助下找到,特此记录一下:1 首先找到input 命令的位置: system//bin/input2 查看input的内容如下:cat .system//bin/input
2013-11-08 20:29:13
3710
原创 android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
首先看下操作界面: 你可以可以远程控制手机,模拟发送触摸屏及按键事件 (应用场合:开发早期触摸屏还没确定及判断问题是驱动层还是framework / app 层)先讲发送按键事件的实现(如下面是发送KEYCODE_HOME):'adb shell input keyevent 3'更多的按键编码请参考:KeyEvent.java 下面是其部分内容: public
2013-11-07 22:07:28
3061
1
原创 perror实现分析(3.0: Linux支持的系统错误)
参考: bionic/libc/include/sys/_errdefs.h__BIONIC_ERRDEF( 0 , 0, "Success" )__BIONIC_ERRDEF( EPERM , 1, "Operation not permitted" )__BIONIC_ERRDEF( ENOENT , 2, "
2013-11-07 21:47:02
1611
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人