ARM_Linux_NOTE_1

ARM_Linux NOTE_1

Vine Farer
2016.08.05

1、基本结构

  • 内核 ——— CPU

  • 软件

    • Linux:功能较多,较复杂
    • VX Works:稳定性高,用于航天和军用
    • μ COS:轻量级OS,因结构简单,也较稳定
  • 硬件

    • ARM
    • MSP430
    • Mips:功耗很低
    • PowerPC

2、计算机系统硬件组成

  • 输入设备

  • 输出设备

  • 存储器

    CPU(寄存器组)<—>高速缓存cache<—>主存储器RAM<—>辅助存储器ROM

    (速度 快———————————————–>>>慢)

    • cache 本身由 SRAM 组成

    • cache 常和 wite buffer 一起使用,起作用就是为了针对高速的CPU和低速的主存之间速率不匹配的问题,进行缓冲

    • MMU (存储管理单元):程序编译时将虚拟地址转为物理地址,多个程序可以有相同的虚拟地址(0~4G),但各自是不同的物理地址映射

    RAM :
       > SRAM
       > DRAM(SDRAM)

    ROM:
       > EPROM
       > EEPROM
       > Flash:nand型、nor型

    磁盘、硬盘

    光盘

    相变

  • 运算器ALU

  • 控制器

  • 总线

    • 单总线结构:效率低,低档单片机
    • 多总线结构:效率高,成本高,高档单片机

3、数据和指令类型

  • ARM数据类型

    byte 8bit
    halfword 16bit
    word 32bit
    doubleword 64bit
  • 指令集:

    ARM指令集:32bit,4字节对齐
    Thumb指令集:16bit,2字节对齐
    cortex-a
    thumb-2 : arm + thumb
    java:8bit,4字节对齐
    thumb-ee



4、ARM处理器工作模式

  • 八种内核工作模式:

    user: 用户模式(非特权模式)。正常执行时用此模式
    system:系统模式,和user共享相同资源(即公用一套寄存器组)
    fiq:快速中断模式。高优先级中断介入时进入此模式
    irq:普通中断模式。通常中断处理
    supervisor{svc}:特权模式。复位、swi软中断
    abort:数据访问终止模式。读取数据失败,加载指令失败
    undef:未定义指令终止模式
    cortex-a: monitor:监控模式。在安全与非安全模式间切换

    (除user,其他7种均为特权模式)

  • fiqirq快的原因

    FIQ 优先级比 IRQ 高,不会被中断
    FIQ有自己的专属寄存器:r8~r12,不用对通用寄存器入栈保护,可以加快速度
    FIQ位于异常向量表的末尾0x1c,故无需跳转,可以在这里直接放置异常处理函数



5、ARM寄存器

Contex-A8有40个32位寄存器

8种内核工作模式,每个模式对应一组相应寄存器组

32个通用寄存器
7个状态寄存器:1个CPSR(当前)、6个SPSR(备份)
1个PC(程序计数器)

程序状态寄存器结构(面试常考)

条件标志位:N(负数)、Z(0)、C(进位)、V(溢出)
大小端控制位:E
中断禁止位:I(普通中断)、F(快速中断)
状态位:T(选择ARM指令或Thumb指令)
模式控制位:M[ 4:0 ] 确定内核处于哪种工作模式(8种)



6、异常处理

———— 操作程序状态寄存器
  • 异常类型

    ResetData AbortFIQIRQPrefetch AbortSWIUndefined instruction
    Reset异常优先级最高
  • 异常产生:

    1)拷贝CPSRSPSR_<mode>
    2)设置CPSR

    设置第 5 位,进入ARM

    设置M[4:0],改变内核模式

    设置第 6、7 位的中断禁止位,禁止相应中断响应
    (为防止中断嵌套,一旦irq中断执行过程中另一个irq中断到来,pc被保存到lr中跳转到下个中断。但irq模式下的lr只有一个,一旦改变就被覆盖了,会丢失usr下原函数的返回地址,中断结束后无法返回)

    3)保存返回地址到LR_<mode>(设置r14
    4)设置PC为相应的异常向量
  • 异常返回:

    1)从SPSR_<mode>恢复CPSR
    2)从LR_<mode>恢复PC

    (这些操作仅在ARM态下进行)



7、流水线(Pipeline)

———— 改善硬件资源使用率和处理器吞吐量
  • 3级流水线(如ARM7系列):

    取指令fetch:从存储器中读指令
    译码decode:解码指令中用到的寄存器
    执行execute:寄存器读、移位和ALU操作、寄存器写
  • 5级流水线:

    取指令 <—> 译码 <—> 执行 <—> 缓冲 / 数据 <—> 回写
  • 流水线工作实例

    1) 最佳流水线( F—>D—>E )

    6个周期执行6条指令

    所有操作在寄存器中

    指令周期数CPI = 1

    2) LDR流水线( F、D、E、M、W )

    M:将数据从内存读到CPU; W:将读到的数据写回寄存器

    6个周期4条指令

    CPI = 1.5

    3) 分支流水线( F、D、E、L、A )

    L:设置LR = PC_old; A:硬件自动PC = PC_old - 4

    需要对BL跳转语句做处理,所以流水线被阻断

    内核运行在ARM态

    4) 中断流水线( F、D、E、DI、EI、L、A )

    DI:解码中断指令; EI:处理中断

    中断到来,跳转到中断向量表,执行相应地址内的跳转语句,跳转到下个地址执行中断处理函数

    IRQ中断的反应时间最小是 7 个周期



DESCEND objtool HOSTCC scripts/mod/modpost.o INSTALL libsubcmd_headers CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/exec-cmd.o scripts/mod/modpost.c: In function ‘addend_arm_rel’: scripts/mod/modpost.c:1178:7: error: ‘R_ARM_MOVW_ABS_NC’ undeclared (first use in this function); did you mean ‘R_ARM_THM_ABS5’? case R_ARM_MOVW_ABS_NC: ^~~~~~~~~~~~~~~~~ R_ARM_THM_ABS5 scripts/mod/modpost.c:1178:7: note: each undeclared identifier is reported only once for each function it appears in scripts/mod/modpost.c:1179:7: error: ‘R_ARM_MOVT_ABS’ undeclared (first use in this function); did you mean ‘R_ARM_THM_ABS5’? case R_ARM_MOVT_ABS: ^~~~~~~~~~~~~~ R_ARM_THM_ABS5 scripts/mod/modpost.c:1185:7: error: ‘R_ARM_CALL’ undeclared (first use in this function); did you mean ‘R_ARM_COPY’? case R_ARM_CALL: ^~~~~~~~~~ R_ARM_COPY scripts/mod/modpost.c:1186:7: error: ‘R_ARM_JUMP24’ undeclared (first use in this function); did you mean ‘R_ARM_PC24’? case R_ARM_JUMP24: ^~~~~~~~~~~~ R_ARM_PC24 scripts/mod/modpost.c:1190:7: error: ‘R_ARM_THM_MOVW_ABS_NC’ undeclared (first use in this function); did you mean ‘R_ARM_THM_ABS5’? case R_ARM_THM_MOVW_ABS_NC: ^~~~~~~~~~~~~~~~~~~~~ R_ARM_THM_ABS5 scripts/mod/modpost.c:1191:7: error: ‘R_ARM_THM_MOVT_ABS’ undeclared (first use in this function); did you mean ‘R_ARM_THM_ABS5’? case R_ARM_THM_MOVT_ABS: ^~~~~~~~~~~~~~~~~~ R_ARM_THM_ABS5 scripts/mod/modpost.c:1200:7: error: ‘R_ARM_THM_JUMP19’ undeclared (first use in this function); did you mean ‘R_ARM_THM_PC9’? case R_ARM_THM_JUMP19: ^~~~~~~~~~~~~~~~ R_ARM_THM_PC9 scripts/mod/modpost.c:1222:7: error: ‘R_ARM_THM_JUMP24’ undeclared (first use in this function); did you mean ‘R_ARM_THM_PC8’? case R_ARM_THM_JUMP24: ^~~~~~~~~~~~~~~~ R_ARM_THM_PC8 make[2]: *** [scripts/Makefile.host:133: scripts/mod/modpost.o] Error 1 make[1]: *** [/usr/src/kernels/linux-6.12.33/Makefile:1216: prepare0] Error 2 make[1]: *** 正在等待未完成的任务.... CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/help.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/pager.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/parse-options.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/run-command.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/sigchain.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/subcmd-config.o LD /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/libsubcmd-in.o AR /usr/src/kernels/linux-6.12.33/tools/objtool/libsubcmd/libsubcmd.a CC /usr/src/kernels/linux-6.12.33/tools/objtool/weak.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/arch/x86/special.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/arch/x86/decode.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/arch/x86/orc.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/check.o LD /usr/src/kernels/linux-6.12.33/tools/objtool/arch/x86/objtool-in.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/special.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/builtin-check.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/elf.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/objtool.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/orc_gen.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/orc_dump.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libstring.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/libctype.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/str_error_r.o CC /usr/src/kernels/linux-6.12.33/tools/objtool/librbtree.o LD /usr/src/kernels/linux-6.12.33/tools/objtool/objtool-in.o LINK /usr/src/kernels/linux-6.12.33/tools/objtool/objtool make: *** [Makefile:224: __sub-make] Error 2 是什么意思,该怎么解决
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值