系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。
所以,系统调用过程是这样的:
应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回
下面是sys_call_table的定义文件
位于./include/sys.h
其中sys_call_table的类型是fn_ptr类型,其中sys_call_table[0]元素为sys_setup,它的类型是fn_ptr类型,它实际上是函数sys_setup的
入口地址。
它的定义如下:
typedef int (*fn_ptr) (); // 定义函数指针类型。
下面的实例代码有助于理解函数指针:
system_call系统调用入口函数
./include/unistd.h文件中系统调用符号和调用号的对应定义
这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。
系统调用宏也在本文件内定义,采用内联汇编,如下:
分享到:
相关推荐
当用户空间程序通过汇编指令int $0x80执行系统调用时,CPU将会切换到内核模式并跳转到IDT中系统调用对应的处理程序_system_call。 在_system_call中断服务程序中,首先会检查系统调用号(存储在eax寄存器中)是否...
在 Linux 0.11 中,系统调用是通过中断机制实现的,具体来说,是通过执行 `int 0x80` 汇编指令触发中断 0x80,这个中断被设置为系统调用的入口点。当一个系统调用函数被执行时,它会将系统调用号放入 `eax` 寄存器,...
// Linux 的系统调用中断0x80。该中断是所有系统调用的 // 入口。该条语句实际上是int fork()创建进程系统调用。 // syscall0 名称中最后的0 表示无参数,1 表示1 个参数。 static inline _syscall0 (int, pause...
该子程序将系统模块加载到内存地址0x10000 处,并确定没有跨越64KB 的内存边界。我们试图尽快 ! 地进行加载,只要可能,就每次加载整条磁道的数据。 ! 输入:es – 开始内存地址段值(通常是0x1000) ...
这些调用在内核中被实现为函数,通过特定的陷阱指令(如 int 0x80)从用户态切换到内核态执行。 2. **进程管理**:0.11 版本的内核实现了基本的进程创建、调度和通信机制。进程状态包括运行、就绪、睡眠和僵尸,...
2. 中断类型:重要的中断类型包括时钟中断 (int 0x20)、系统调用中断 (int 0x80) 和页故障中断 (int 14)。时钟中断是整个 OS 工作的心跳,负责触发进程调度和信号处理。 3. 时钟中断处理:时钟中断服务执行 do_...
7. **系统调用**:系统调用接口的设计,如何通过int 0x80或sys_call_table映射用户空间的函数调用到内核空间。 8. **编译和启动过程**:从源码编译内核的过程,以及如何在实模式下加载保护模式,启动内核。 9. **...
`syscalls.c`定义了各种系统调用的入口点,通过`int 0x80`指令触发。 通过赵炯老师的注释版,我们可以更加清晰地理解这些核心组件的工作流程和设计思想,这对于想要深入研究操作系统或开发驱动程序的人员来说是宝贵...
答:看这一句:pid =fork() 当执行这一句时,当前进程进入fork()运行,此时,fork()内会用一段嵌入式汇编进行系统调用:int 0x80(具体代码可参见内核版本0.11 的 unistd.h文件的 133 行_syscall0函数)。...
outb_p(0x80|addr,0x70); \ inb_p(0x71); \ }) #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) static void time_init(void) { struct tm time; do { time.tm_sec = CMOS_READ(0); time.tm_...
- 在Linux中,API会将系统调用号放入EAX寄存器,然后触发0x80中断(int 0x80)来进入内核态。 - 系统调用完成后,返回值会存储在EAX寄存器中,中断处理函数会返回到API,最终API将结果返回给用户程序。 2. **实验...
系统调用是操作系统为用户程序提供的服务,通过特定的陷阱指令(在x86架构中通常是int 0x80)触发,将控制权由用户空间转移到内核空间。一旦进入内核模式,内核就可以执行受保护的操作,并在完成后返回到用户空间。 ...
- **抢占式优先级**(Preemptive Priority):决定了一个中断是否能够打断当前正在执行的更低优先级的中断处理程序。 - **子优先级**(Sub-priority):当两个或多个具有相同抢占式优先级的中断同时到达时,它们将...
a) 应用程序通过API(如`int 0x80`中断)调用系统调用。 b) API将系统调用号(如EAX寄存器中的值)和参数存入相应的寄存器。 c) 触发中断进入内核态,内核的中断处理函数根据系统调用号找到对应的操作。 d) 执行...
- 提供了72个系统调用接口,用户程序通过int 0x80指令调用,大部分涉及文件操作。 4. 内存管理: - 利用80x86架构的内存管理硬件,提供内存分配和释放,保护用户程序环境。 5. 进程调度: - 实现进程生命周期...
本实验的目标是让学生掌握在Linux 0.11内核中添加自定义系统调用的方法,并通过编写应用程序来测试这些新添加的调用。 首先,我们需要了解系统调用的基本结构。在Linux中,系统调用通常通过特定的指令(如x86架构下...
实验中,学生需要阅读《Linux内核完全注释》的第六章,学习计算机和Linux 0.11的引导流程。接着,他们需要改写引导程序bootsect.s和setup.s。在bootsect.s中,学生需添加自定义的启动提示信息,同时确保能正确加载和...
2. **编写控制程序**:根据T6963C控制器的手册编写C语言程序,实现初始化、显示控制等功能。 3. **图像处理**:使用image2lcd工具将图片转换为适合LCD显示的格式。 4. **仿真测试**:在Proteus中运行仿真,验证电路...