Linux信号中断

进程怎么知道键盘输入数据?

按照以前的说法,键盘是硬件,操作系统就要管理这个键盘,然后定期去检查键盘是否有输入数据,有的话就把数据搬到内存里,然后放到键盘所对应的缓冲区里,struct file结构体指向缓冲区,唤醒进程,进程通过文件描述符就能把数据拿到用户空间。但是在计算机里键盘只是其中一种,如果是定期去检查硬件那么操作系统会很忙。

所以,外设在硬件上直接和CPU对应的针脚进行间接的连接,当外部设备有数据传输,就会向CPU发送硬件中断的东西。外设与CPU之间有个叫中断控制器的东西,当外设向中断控制器发送高电平时,中断控制器可以识别出信号来自哪个针脚,就在内部的寄存器里记录该针脚对应的中断号。比如0号针脚被点亮,就把0写入寄存器里。再由中断控制器往CPU的特定针脚发送高电平,这样CPU就知道哪个外设准备好了,CPU就访问中断控制器,就从里面的寄存器中读取对应的中断号。

接下来操作系统提供一个叫中断向量表IDT的东西,类似一个函数指针数组,里面指向一堆方法,数组的下标就是中断号。CPU拿到中断号后,就会执行操作系统的代码,拿着中断号去查表,看看是调用哪个方法。

所以以后外设准备好了就会向CPU发中断,CPU就会自动执行对应的方法。

类比一下信号机制:发中断相当于发信号,保存中断相当于保存信号,中断号相当于信号编号,处理中断相当于处理信号。总而言之,信号是用软件来模拟硬件的信号中断的。

但是当没有中断来的时候,操作系统是暂停的,如果一直没有外部设备响应的话,操作系统就会一直暂停,于是在向量中断表当中注册一个进程调度的方法schedule,在硬件上引入时钟源,它会以特定频率向CPU发送特定的中断。假如每隔1ns发送一次中断,,CPU就会每隔1ns去调用schedule。从此以后,操作系统就在硬件时钟中断的驱动下进行调度了。操作系统就是基于中断进行工作的软件。后来人们觉得把时钟源放在外部和其他外设竞争中断还有传递给CPU效率太低,于是就把时钟源集成在了CPU内部,外设没有中断时,CPU自己就向自己触发中断,调用schedule方法。操作系统就是一个死循环。

CPU在自己的指令集当中引入新的汇编指令syscall,用它来触发让CPU主动进入中断,也就是说如果在代码里写这个接口,CPU就会自动进行一次中断。

进行系统调用,有一个系统调用表,函数指针数组,每一个系统调用都有一个唯一的下标,这个下标就叫做系统调用号,这是在内核当中。在中断表里注册一个方法callsystem,1.它想办法获取系统调用号。2.调用系统调用的方法。

用户层面:系统调用接口底层用汇编语言写,比如move eax X,编号为X移动到寄存器中,然后int 0x80,这个0x80是callsystem在中断表里的地址。然后callsystem里就有mov n eax,当用户层调用系统调用接口时就会被callsystem获取,然后调用sys_call_table[n]调用底层的方法。

操作系统不提供任何系统调用接口,只提供系统调用号。我们用的接口都是glibc封装的。

用户态和内核态:在虚拟地址当中,用户区0-3GB,内核区3-4GB,操作系统也是软件,也在物理内存里。

内核页表和用户页表:都是用来对虚拟地址到物理地址的映射。一个进程一个用户页表,内核页表只有一份。内核页表是所有进程公共的,所以不管进程如何调度,都能找到操作系统。用户和内核都在0-4GB的区间。为了能够既保证操作系统本身的安全性,又保证用户能访问到操作系统,所以引入用户态和内核态。处于哪个态是硬件决定的,cs寄存器记录用户态还是内核态的信息。int 0x80让cs段寄存器转而指向操作系统,同时将权限标志位由11设置为0。

相关推荐
jimy14 小时前
安卓里运行Linux
linux·运维·服务器
爱凤的小光5 小时前
Linux清理磁盘技巧---个人笔记
linux·运维
耗同学一米八6 小时前
2026年河北省职业院校技能大赛中职组“网络建设与运维”赛项答案解析 1.系统安装
linux·服务器·centos
知星小度S7 小时前
系统核心解析:深入文件系统底层机制——Ext系列探秘:从磁盘结构到挂载链接的全链路解析
linux
2401_890443027 小时前
Linux 基础IO
linux·c语言
智慧地球(AI·Earth)8 小时前
在Linux上使用Claude Code 并使用本地VS Code SSH远程访问的完整指南
linux·ssh·ai编程
老王熬夜敲代码9 小时前
解决IP不够用的问题
linux·网络·笔记
zly35009 小时前
linux查看正在运行的nginx的当前工作目录(webroot)
linux·运维·nginx
QT 小鲜肉9 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
问道飞鱼10 小时前
【Linux知识】Linux 虚拟机磁盘扩缩容操作指南(按文件系统分类)
linux·运维·服务器·磁盘扩缩容