《程序员的自我修养》读书笔记6 -- 系统调用

本文详细介绍了系统调用的基本原理,包括如何从用户态切换到内核态,以及不同系统调用号的作用。特别地,文章深入探讨了Linux系统中具体的系统调用过程,包括如何使用寄存器传递系统调用号及参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统调用原理


        系统调用运行在内核态,而用户程序基本上都是运行在用户态的,切换到内核态需要通过中断。来自硬件的异常和其他事件的发生为硬件中断;通过指令(int)实现软中断。中断有中断号和中断服务程序,内核中有中断向量表。其中系统调用的中断号int 0x80

        对于不同系统调用有不同系统调用号(exit调用号为1,fork 调用号为2),通过系统调用表索引。其中EAX寄存器用于传递系统调用号。

如果系统调用有参数。一个参数用EBX传递,多个参数分别用EBX,ECX,EDX,ESI,EDI和EBP传递。


Linux下系统调用过程

        

### 关于《程序员自我修养》的学习笔记与总结 #### 构建过程概述 构建一个软件项目的过程可以分为四个主要阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)以及链接(Linking)[^1]。 - **预处理**涉及宏替换、头文件包含等操作,准备源码供后续步骤使用- **编译**将高级语言转换成低级机器代码或中间表示形式;此过程中会进行语法分析、优化等工作。 - **汇编**把由编译器产生的汇编代码转化为目标二进制文件(.o 或 .obj),这些文件包含了可以直接加载到内存运行的指令序列。 - **链接**负责收集多个对象模块并解决它们之间的相互依赖关系,最终生成可执行文件或共享库。 #### 函数重入特性解析 当提到函数能够被安全地重复调用而不引起冲突,则称之为具备“重入性”。具体来说,在多线程环境中允许多个实例并发访问同一个函数体而不会造成数据损坏或其他异常行为。另外一种情形是在递归场景下——即使当前调用尚未结束也能再次进入同一函数继续执行下去[^2]。 #### ELF 文件结构中的重要段落介绍 对于Linux平台上的应用程序而言,其可执行文件通常遵循ELF(Executable and Linkable Format)标准来组织内部布局。以下是几个值得注意的数据区: - `.rodata` 段保存着只读性质的内容,例如字符串字面量和常数定义; - `.text` 区域存放已编译好的CPU指令集; - 特殊用途的部分还包括但不限于`.bss`(未初始化静态变量), `.data`(已赋初值全局/静态变量); - 此外还有辅助性的元数据区域如`.symtab`, `.strtab`用来记录符号名称及其关联信息以便调试工具查询[^3]. ```cpp // C++ Example of a reentrant function using static local variable to ensure thread safety. #include <iostream> void safe_counter() { static int count = 0; ++count; // Increment the counter safely within this scope. } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值