ldrlo? ? pc, [tbl, scno, lsl #2]
? 20:? ? b? ? sys_ni_syscall
? 21: ENDPROC(sys_syscall)
??二次包含是建立在第一次包含的基础上,第一次包含的结果是:
?#undef CALL? ?
?#define CALL(x) .long x
?NR_syscalls 是系统调用的个数,并且进行了4的倍数对齐(最后几个系统调用可能只是为了凑数)
?syscalls_padding的数值保证了CALL(x)的个数可以4倍对齐,即.long x 的个数是4的倍数。目的是在下面的sys_syscall函数中的:
ldrlo? ? pc, [tbl, scno, lsl #2]
即将“系统调用表基地址tbl+系统调用号scno*4”地址单元(上面的某个.long x)的数据(也就是某个系统调用处理函数的入口地址)放到PC寄存器中(因为有了对齐,所以不会产生访问越界的情况,又因为
cmp? ? scno, #__NR_syscall - __NR_SYSCALL_BASE
? ? ? cmpne? ? scno, #NR_syscalls? ? @ check range
以上两条语句保证了系统调用号scno的大小不会超出范围)。
可以看到,在calls.S结尾的系统调用:sys_ni_syscall。它除了返回-ENOSYS之外啥也没干:
? 1: /*
? ? 2:? * Non-implemented system calls get redirected here.
? ? 3:? */
? ? 4: asmlinkage long sys_ni_syscall(void)
? ? 5: {
? ? 6:? ? return -ENOSYS;
? ? 7: }