板级支持包BSP之 mdesc->map_io()

paging_init -->mdesc->map_io() 之回调函数(面向对象思想应用!!!)

[关于S3C2410板级支持包的内容将在讨论完虚拟内存后补上]

MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
                    * to SMDK2410 */
    /* Maintainer: Jonas Dietsche */
    .phys_ram    = S3C2410_SDRAM_PA,
    .phys_io    = S3C2410_PA_UART,
    .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params    = S3C2410_SDRAM_PA + 0x100,
    .map_io        = smdk2410_map_io,
    .init_irq    = smdk2410_init_irq,
    .timer        = &s3c24xx_timer,
    .init_machine    = smdk2410_init_lcd,
MACHINE_END

smdk2410_map_io -->s3c24xx_init_io -->iotable_init -->create_mapping

最终调用create_mapping 在页目录表中创建从虚拟地址到物理地址的映射,其它的映射与此相似。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android利用ASM(字节码操作框架)监控方法耗时的步骤如下: 1. 添加ASM依赖库 在build.gradle文件中添加ASM依赖库: ```gradle dependencies { implementation 'org.ow2.asm:asm:9.1' } ``` 2. 编写ASM代码 使用ASM编写一个ClassVisitor,用于修改字节码,在方法的开头和结尾插入计时代码: ```java public class TimeClassVisitor extends ClassVisitor { public TimeClassVisitor(int api, ClassVisitor cv) { super(api, cv); } @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (!name.equals("<init>") && !name.equals("<clinit>")) { mv = new TimeMethodVisitor(api, mv, access, name, descriptor); } return mv; } static class TimeMethodVisitor extends MethodVisitor { private final String mName; private final String mDesc; private final Label mStartLabel = new Label(); private final Label mEndLabel = new Label(); public TimeMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc) { super(api, mv); mName = name; mDesc = desc; } @Override public void visitCode() { super.visitCode(); mv.visitLabel(mStartLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } @Override public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN) || opcode == ATHROW) { mv.visitLabel(mEndLabel); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitFieldInsn(GETSTATIC, "com/example/MyClass", "sStartTime", "J"); mv.visitInsn(LSUB); mv.visitFieldInsn(PUTSTATIC, "com/example/MyClass", "sStartTime", "J"); } super.visitInsn(opcode); } @Override public void visitMaxs(int maxStack, int maxLocals) { mv.visitMaxs(maxStack + 4, maxLocals); } } } ``` 3. 在应用中使用ASM代码 在应用中调用ASM代码,在Activity的onCreate方法中插入以下代码: ```java try { ClassReader cr = new ClassReader(getClass().getName()); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); TimeClassVisitor tcv = new TimeClassVisitor(Opcodes.ASM7, cw); cr.accept(tcv, ClassReader.EXPAND_FRAMES); byte[] code = cw.toByteArray(); Class<?> clazz = defineClass(getClass().getName(), code, 0, code.length); clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } ``` 以上代码将读取当前Activity的字节码,使用TimeClassVisitor修改字节码,然后重新定义类并实例化,以便在方法中添加计时代码。 4. 打印方法耗时 在Activity的onDestroy方法中打印方法耗时: ```java Log.i("Time", "onCreate: " + (sStartTime / 1000000f) + "ms"); ``` 以上代码将打印onCreate方法的耗时,单位为毫秒。 通过以上步骤,就可以使用ASM监控方法耗时了。需要注意的是,ASM会修改字节码,可能会导致应用崩溃或出现其他问题,所以需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值