- 论坛徽章:
- 0
|
内核 版本 2.4
在时钟中断分析章节里面,跟踪到do_timer函数后, 发现对jiffies 的自增采用了转指针类型方式自增
void do_timer(struct pt_regs *regs)
{
(*(unsigned long *)&jiffies)++;
。。。。。。
}
linux内核情景分析上说这个目的是 gcc会将这个语句 翻译成一条对内存单元的inc自增指令
这样有利于保证原子性操作
但是我试了一下,发现还是 先把 jiffies mov到eax中,然后把eax 自增,然后通过mov到内存单元里面去
是书上说错了? 还是我验证的程序有问题
附上测试程序:
#include <stdio.h>
int main()
{
int i = 1;
(*(int*)&i)++;
printf("i = %d \n", i);
return (0);
}
gcc -S inc.c
cat inc.s
.file "inc.c"
.section .rodata
.LC0:
.string " i = %d \n"
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
subq $16, %rsp
.LCFI2:
movl $1, -4(%rbp)
movl -4(%rbp), %eax
addl $1, %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret
.LFE2:
麻烦大家指导一下。
谢谢
这个是针对2.4内核的, 可能有点老 |
|