设为首页 加入收藏

TOP

对entry-common.S和call.S的部分理解1 - 摩斯电码(十)
2015-02-13 18:24:18 来源: 作者: 【 】 浏览:135
Tags:entry-common.S call.S 部分 理解 电码
t_noifar)
? 431:? ? ? ? mov? ? pc, lr
? 432: ENDPROC(pabort_ifar)
? 433: ENDPROC(pabort_noifar)
? 434:?
? 435: #ifdef CONFIG_OABI_COMPAT
? 436:?
? 437: /*
? 438:? * These are syscalls with argument register differences
? 439:? */
? 440:?
? 441: sys_oabi_pread64:
? 442:? ? ? ? stmia? ? sp, {r3, r4}
? 443:? ? ? ? b? ? sys_pread64
? 444: ENDPROC(sys_oabi_pread64)
? 445:?
? 446: sys_oabi_pwrite64:
? 447:? ? ? ? stmia? ? sp, {r3, r4}
? 448:? ? ? ? b? ? sys_pwrite64
? 449: ENDPROC(sys_oabi_pwrite64)
? 450:?
? 451: sys_oabi_truncate64:
? 452:? ? ? ? mov? ? r3, r2
? 453:? ? ? ? mov? ? r2, r1
? 454:? ? ? ? b? ? sys_truncate64
? 455: ENDPROC(sys_oabi_truncate64)
? 456:?
? 457: sys_oabi_ftruncate64:
? 458:? ? ? ? mov? ? r3, r2
? 459:? ? ? ? mov? ? r2, r1
? 460:? ? ? ? b? ? sys_ftruncate64
? 461: ENDPROC(sys_oabi_ftruncate64)
? 462:?
? 463: sys_oabi_readahead:
? 464:? ? ? ? str? ? r3, [sp]
? 465:? ? ? ? mov? ? r3, r2
? 466:? ? ? ? mov? ? r2, r1
? 467:? ? ? ? b? ? sys_readahead
? 468: ENDPROC(sys_oabi_readahead)
? 469:?
? 470: /*
? 471:? * Let's declare a second syscall table for old ABI binaries
? 472:? * using the compatibility syscall entries.
? 473:? */
? 474: #define ABI(native, compat) compat
? 475: #define OBSOLETE(syscall) syscall
? 476:?
? 477:? ? .type? ? sys_oabi_call_table, #object
? 478: ENTRY(sys_oabi_call_table)
? 479: #include "calls.S"
? 480: #undef ABI
? 481: #undef OBSOLETE
? 482:?
? 483: #endif
? 484:?


在entry-common.S中包含了上次calls.S,这里简单分析前两次:


第一次:


在entry-common.S中:



? 1: .equ NR_syscalls,0
? ? 2: #define CALL(x) .equ NR_syscalls,NR_syscalls+1
? ? 3: #include "calls.S"
? ? 4: #undef CALL
? ? 5: #define CALL(x) .long x


在calls.S的结尾:



? 1: CALL(sys_preadv)
? ? 2: CALL(sys_pwritev)
? ? 3: #ifndef syscalls_counted
? ? 4: .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
? ? 5: #define syscalls_counted
? ? 6: #endif
? ? 7: .rept syscalls_padding
? ? 8: CALL(sys_ni_syscall)
? ? 9: .endr


分析:


.equ NR_syscalls,0? ? 中涉及到汇编指令.equ:



.equ/.set: 赋值语句, 格式如下:


? .equ(.set) 变量名,表达式
? 例如:
? .equ abc 3 @让abc=3



这里只是定义了一个变量NR_syscalls,并将其初始化为0。可以理解为: NR_syscalls = 0


#define CALL(x) .equ NR_syscalls,NR_syscalls+1?


即 将CALL(x) 定义为: NR_syscalls = NR_syscalls? + 1


#include "calls.S"? ? 将calls.S的内容包进来,因为上面对CALL(x)进行了定义所以相当于执行了多次NR_syscalls++,相当于统计了系统调用的个数,但是注意:在calls.S的结尾的对齐处理:


#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
#endif
.rept syscalls_padding
? ? ? ? CALL(sys_ni_syscall)
.endr



由于是第一次包含,故syscalls_counted没有定义,
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls


为了保证NR_syscalls是4的整数倍,上面的语句相当于:syscalls_padding = ((NR_syscalls + 3) & ~3) - NR_syscalls;


即:假如NR_syscalls 是1,那么syscalls_padding 就是3
?


.rept syscalls_padding
? ? ? ? CALL(sys_ni_syscall)
? ? ? .endr


?


这里涉及到汇编指令.rept的用法:



.rept:重复定义伪操作, 格式如下:
?.rept 重复次数
?数据定义
.endr @结束重复定义
?例如:
?.rept 3
?.byte 0x23
?.endr


?



继续上面的例子:syscalls_padding 为3,那么上面的rept语句块相当于:


CALL(sys_ni_syscall)


CALL(sys_ni_syscall)


CALL(sys_ni_syscall)


即又执行了三次:NR_syscalls++,此时NR_syscalls就变成了4,对齐了。


?


第二次:



? 1: .type? ? sys_call_table, #object
? ? 2: ENTRY(sys_call_table)
? ? 3: #include "calls.S"
? ? 4: #undef ABI
? ? 5: #undef OBSOLETE
? ? 6:?
? ? 7:?
? ? 8: @r0 = syscall number
? ? 9: @r8 = syscall table
? 10: sys_syscall:
? 11:? ? bic? ? scno, r0, #__NR_OABI_SYSCALL_BASE
? 12:? ? cmp? ? scno, #__NR_syscall - __NR_SYSCALL_BASE
? 13:? ? cmpne? ? scno, #NR_syscalls? ? @ check range
? 14:? ? stmloia? ? sp, {r5, r6}? ? ? ? @ shuffle args
? 15:? ? movlo? ? r0, r1
? 16:? ? movlo? ? r1, r2
? 17:? ? movlo? ? r2, r3
? 18:? ? movlo? ? r3, r4
? 19:? ?

首页 上一页 7 8 9 10 下一页 尾页 10/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于Linux系统如何实现fork的研究 下一篇Linux-2.6.21 pi futex关键数据结..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: