在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。
本节用新用到的汇编指令如下:
指令功能说明ldmLoad multiple registers将内存中的值load到多个寄存器中,属于pop操作stmStore Multiple将多个寄存器中的值store到内存中,属于push操作subSubtract减法andAnd逻辑与teqTest bitwise equality相等测试指令(该指令用于把一个寄存器Rn的内容和另一个操作数operand2按位进行异或运算,并根据运算结果更新CPSR中条件标志位的值cmpCompare比较两个操作数是否相同(作差,结果影响CPSR)stm有8种操作模式,主要用于现场保护、数据复制、参数传送和堆栈操作等,详细说明见下表:
模式功能说明iaIncrease After每次传送后地址加4,其中的寄存器 从左到右执行 ,例如:STMIA R0,{R1,LR} 先存R1,再存LRibIncrease Before每次传送前地址加4,其余同iadaDecrease After每次传送后地址减4,其中的寄存器 从右到左执行 ,例如:STMDA R0,{R1,LR} 先存LR,再存R1dbDecrease Before每次传送前地址减4,其余同dafdFull Descending满减栈(每次传送 前 地址 减 4)faFull Increase满增栈(每次传送 前 地址 加 4)edEmpty Descending空减栈(每次传送 后 地址 减 4)eaEmpty Increase空增栈(每次传送 后 地址 加 4)以arm920为例的proc_info结构体定义:
/* /arch/arm/mm/proc-arm920.S */ .section ".proc.info.init", #alloc, #execinstr @ 将下述结构体指定存放在.proc.info.init节中。 .type __arm920_proc_info,#object @ 定义proc_info结构体并赋值 __arm920_proc_info: .long 0x41009200 @ cpuid .long 0xff00fff0 @ mask(掩码) .long PMD_TYPE_SECT | \ PMD_SECT_BUFFERABLE | \ PMD_SECT_CACHEABLE | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ .long PMD_TYPE_SECT | \ PMD_BIT4 | \ PMD_SECT_AP_WRITE | \ PMD_SECT_AP_READ b __arm920_setup .long cpu_arch_name .long cpu_elf_name .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB .long cpu_arm920_name .long arm920_processor_functions .long v4wbi_tlb_fns .long v4wb_user_fns #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH .long arm920_cache_fns #else .long v4wt_cache_fns #endif .size __arm920_proc_info, . - __arm920_proc_infoC语言定义的结构体是汇编定义的结构体的另外一种形式而已,各个成员的含义和偏移必须保证一致。
/* /include/asm-arm/procinfo.h */ /* * Note! struct processor is always defined if we're * using MULTI_CPU, otherwise this entry is unused, * but still exists. * * NOTE! The following structure is defined by assembly * language, NOT C code. For more information, check: * arch/arm/mm/proc-*.S and arch/arm/kernel/head.S */ struct proc_info_list { unsigned int cpu_val; /*cpuid 值*/ unsigned int cpu_mask; /*cpuid 掩码*/ unsigned long __cpu_mm_mmu_flags; /* used by head.S */ unsigned long __cpu_io_mmu_flags; /* used by head.S */ unsigned long __cpu_flush; /* used by head.S */ const char *arch_name; const char *elf_name; unsigned int elf_hwcap; const char *cpu_name; struct processor *proc; struct cpu_tlb_fns *tlb; struct cpu_user_fns *user; struct cpu_cache_fns *cache; };<完>