1准备
int func1(int x)
{
return (x+3);
}
int calc(int x)
{
return func1(x);
}
int main(void)
{
return calc(32)+1;
}
反汇编编译
gcc -S -o dis_test.s dis_test.c -m32
其中-m32是因为:
在64位的机器上编译32位还是62位程序,主要是要编译器和链接器上加上参数据:-m32 (编译32位) -m64(编译64)
.file"dis_test.c"
.text
.globlfunc1
.typefunc1, @function
func1:
.LFB0:
.cfi_startproc
pushl%ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl%esp, %ebp
.cfi_def_cfa_register 5
movl8(%ebp), %eax
addl$3, %eax
popl%ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.sizefunc1, .-func1
.globlcalc
.typecalc, @function
calc:
.LFB1:
.cfi_startproc
pushl%ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl%esp, %ebp
.cfi_def_cfa_register 5
subl$4, %esp
movl8(%ebp), %eax
movl%eax, (%esp)
callfunc1
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE1:
.sizecalc, .-calc
.globlmain
.typemain, @function
main:
.LFB2:
.cfi_startproc
pushl%ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl%esp, %ebp
.cfi_def_cfa_register 5
subl$4, %esp
movl$32, (%esp)
callcalc
addl$1, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE2:
.sizemain, .-main
.ident"GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section.note.GNU-stack,"",@progbits
它主要是把/init/main.c
在start_kernel()
里边添加了my_start_kernel()
名字无所谓,只是在运行init
开始前,借用这个环境运行自己的任务。
在timer_interrupt
中添加自己的timer isr
:
arch/x86/kernel/time.c
static irqreturn_t timer_interrupt(int irq, void *dev_id)
{
global_clock_event->event_handler(global_clock_event);
+ my_timer_handler();
return IRQ_HANDLED;
}