固然书本上讲明jiffies是jiffies_64的低32位,但是我还是自己测试了下,重点在于链接脚本的写法。
此处只是为了测试,因此简化链接脚本。
/* link.lds */
1 ENTRY(_start) jiffies = jiffies_64; SECTIONS
{ . = 0x0; . = ALIGN();
.text :
{
test.o (.text)
*(.text)
} . = ALIGN();
.rodata : { *(.rodata) } . = ALIGN();
.data : { *(.data) } . = ALIGN();
.got : { *(.got) } . = ALIGN();
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
#Makefile
1 CROPROSS_COMPILER = arm-none-linux-gnueabi-
LD := ${CROPROSS_COMPILER}ld
AS := ${CROPROSS_COMPILER}as
GCC := ${CROPROSS_COMPILER}gcc mytest: test.o main.o
${LD} -T link.lds $^ -o $@ test.o: test.S
${AS} $^ -o $@ main.o : main.c
${GCC} -c $^ -o $@ .PHONY: clean clean:
@rm -f -r mytest test.o main.o
#test.S
1 .text
.global _start
_start:
b 1f
:
mov r0, r0
:
mov r0, r0
:
mov r0, r0
:
b main
//main.c
1 unsigned long long jiffies_64 = - * ; extern int jiffies; int main(void)
{ jiffies_64 += ;
jiffies += ; return ;
}
#反汇编,省略了一部分
1 <_start>:
: b <_start+0x4>
: nop
: nop
c: nop
: b <main> <main>: 1c: ldr r3, [pc, #] ; 取jiffies_64地址 : ldm r3, {r1, r2}
: mov r3, # ; 0x1 ; jiffies_64低位加1
: mov r4, # ; 0x0 ; jiffies_64高位加0
2c: adds r3, r3, r1
: adc r4, r4, r2
: ldr r2, [pc, #] ; 取jiffies_64地址
: stm r2, {r3, r4} ; 将jiffies_64 + 存入jiffies_64 3c: ldr r3, [pc, #] ; 取jiffies地址 : ldr r3, [r3]
: add r2, r3, # ; jiffies低位加3
: ldr r3, [pc, #] ; 取jiffies地址
4c: str r2, [r3] ; 将jiffies + 存入jiffies : .word 0x00000070 ; jiffies_64地址
: .word 0x00000070 ; jiffies地址
Disassembly of section .data: <jiffies>:
: .word 0xfffedb08
: .word 0xffffffff