操作系统学习笔记——对系统调用中sys_call_table的理解

本文详细介绍了C语言中函数指针的基础知识,包括声明、初始化和使用,以及系统调用表sys_call_table的概念,它是如何通过函数指针存储系统调用处理函数地址并实现中断处理的。
摘要由CSDN通过智能技术生成

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语言:函数指针的使用

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值