sys_call_table的理解
函数指针
1.关于函数指针的基本知识
1.1 声明 函数指针:
returnType (*pointerName)(parameterTypes);
这里 returnType 是函数返回类型,parameterTypes 是函数参数类型。
例如:int (*add)(int, int);
声明一个指针,指针的变量名是add,它指向一个函数,函数的参数为两个int类型的变量,函数的返回值为int类型
1.2 初始化 函数指针:
add = &sum //sum是一个函数,将其地址赋给add指针。
add = sum //函数本身就代表着它所在的地址
1.3 函数指针的使用
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int main() {
int (*operations[])(int, int) = {add, subtract, multiply}; // 函数指针数组
// 使用函数指针数组调用不同的函数
int result1 = operations[0](5, 3); // 调用add
int result2 = operations[1](5, 3); // 调用subtract
int result3 = operations[2](5, 3); // 调用multiply
printf("Results: %d, %d, %d\n", result1, result2, result3);
return 0;
}
2.sys_call_table的理解
下面是sys_call_table的定义文件 位于./include/sys.h
extern int sys_setup (); // 系统启动初始化设置函数。 (kernel/blk_drv/hd.c,71)
extern int sys_exit (); // 程序退出。 (kernel/exit.c, 137)
extern int sys_fork (); // 创建进程。 (kernel/system_call.s, 208)
……
extern int sys_setregid (); // 设置真实与/或有效组id。 (kernel/sys.c, 51)
// 系统调用函数指针表。用于系统调用中断处理程序(int 0x80),作为跳转表。
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork,……, sys_setregid
};
对于最后的sys_call_table,是一个全局的数组,存放的是每个系统调用的处理函数的地址。
为什么呢?怎么实现的呢?
因为sys_call_table,是由fn_ptr声明,fn_ptr的定义是:
typedef int (*fn_ptr) ();
这是一个函数指针,指针指向的函数 没有参数,返回值是int类型。
从sys_setup ()等内核函数的声明中,我们可以看到确实是这样。
因此,这个数组里存放的变量 就是函数指针,函数的地址,
可以通过call指令,直接跳转到对应位置去执行。
参考文章:C语言:函数指针的使用