Linux0.12中断处理

1.不带出错码的中断处理过程-asm.s

(1)原寄存器入栈(由硬件完成):SS, ESP, EFLAGS, CS

(2)中断返回地址入栈:EIP

(3)要调用的函数地址入栈

(4)EAX的值与栈顶的值(要调用的函数的地址)交换

(5)其它寄存器入栈:EBX, ECX, EDX, EDI, ESI, EBP, DS, ES, FS

(6)出错号入栈:error_code。如果没有出错号,就0入栈

(7)EIP在栈中的地址入栈

(8)所有段寄存器转为内核代码段的段选择符:0x08

(9)调用相关C处理函数

(10)两次出栈(步骤6、步骤7入栈的内容)

(11)弹出除(步骤1、步骤2以外的所有内容)

(12)恢复上下文(硬件完成)


2.软中断:处理完要检测信号位图

硬件中断:处理前要发送EOI指令,如果是时钟中断,处理完也要检测信号位图

系统调用的中断:最多可带3个参数 ,通过EBX, ECX, EDX传入


3.系统调用过程

(1)保存寄存器原值:DS, FS, ES, EAX

(2)三个参数入栈:EDX, ECX, EBX

(3)DS和ES设置成内核数据段0x10,FS设置为用户数据段0x17

(4)测试EAX是否有效

(5)调用相应的C函数

(6)系统调用的返回值入栈

(7)查看执行本次调用的进程的状态,若非就绪或时间片用完,则schedule()(不管有没有schedule()都会进入第八步)

(8)返回到ret_from_sys_all继续执行

(9)若当前进程是进程0或是内核进程,则出栈,退出中断

(10)检查信号位图,调用do_signal()

(11)恢复寄存器,退出中断,返回调用程序


4.为什么用FS保存用户段?

用于执行内核数据空间和用户数据空间之间的数据复制工作。

优点:

(1)边界检查由CPU自动完成

(2)进入中断时,FS自动保存到内核堆栈,退出中断时自动弹出,不需要特殊处理

转载于:https://my.oschina.net/windmissing/blog/690478

### Linux 0.12 版本信息与源码解析 #### 版本背景 Linux 0.12Linux 操作系统的早期版本之一,它为研究操作系统的内部机制以及 Linux 内核的发展历程提供了宝贵的资源。通过分析这一时期的内核代码,可以深入了解诸如进程管理、内存分配、文件系统实现等核心概念[^1]。 #### 关键模块概述 以下是 Linux 0.12 中几个重要部分的功能描述: - **内核架构**: 赵炯在其著作《深入理解Linux内核》中提到,Linux 0.12 的设计体现了当时的操作系统设计理念,适合用于教学目的和基础研究。 - **启动过程 (head.s 和 main.c)**: 在内核加载过程中,`head.s` 文件负责初始化硬件环境并切换到保护模式;随后控制权被传递给 `main.c`,后者进一步完成 C 环境下的初始化工作[^3]。 - **进程管理**: 进程是操作系统的核心抽象单位,在 Linux 0.12 中已经实现了基本的多任务处理功能。例如下面展示了一个简单的用户空间程序如何打开文件并读取其内容: ```c #include <stdio.h> char buf[1024]; int main() { int fd = open("/home/hello.txt", O_RDWR, 0); read(fd, buf, 100); for (int i = 0; i < 1000000; i++) { } return 0; } ``` 此代码片段展示了如何利用系统调用来访问磁盘上的文件[^4]。 - **管道通信**: 另外一个重要特性就是 IPC(进程间通讯),其中最简单形式莫过于匿名管道。以下例子说明了父子进程之间通过共享标准输入/输出流来交换消息的方法[^5]: ```bash ./pipe ``` #### 学习建议 为了更好地掌握这些理论知识的实际应用价值,《x86裸机编程入门指南》推荐先熟悉目标平台的基础指令集结构及其运行时行为特点[^2]。之后再逐步探索更复杂的主题比如虚拟存储器布局或者中断服务例程的设计思路等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值