
linux只占用一个中断向量号,即:0x80。
系统调用前,linux在eax寄存器中写入子功能号,中断处理程序根据eax寄存器的值来判断用户进程申请哪种系统调用。
syscall 是一个库函数
man syscall
调用glibc中不提供的函数,如获取线程内核id
gettid函数文档如下,文档明确指出Glibc不提供该函数封装,所以我们需要自己通过syscall封装该函数。
man gettid
通过syscall实现gettid函数如下:
该函数输出的线程id与top -H -p <pid>命令查看的id一致
系统中断分两种:硬件中断和软中断
硬件中断:来自于硬件异常或事件发生,如键盘按下。
软中断:一条指令,带一个中断号,如Linux下int 0x80为系统调用中断。
中断类型号是系统为每一个中断源分配的代号,它是8位的,与系统的中断源一一对应。
中断类型号负责引导CPU找到中断服务程序的入口点。
通过中断类型号查中断向量表可得到中断向量(中断服务程序入口地址),其中:物理地址为4*n的单元是中断服务程序入口点的偏移地址;物理地址为4*n+2的单元是中断服务程序的段首址。
扩展资料
一般来说,外部中断主要有以下几种:
(1)I/O设备:如显示器、键盘、打印机等;
(2)数据通道:软盘、硬盘、光盘等;
(3)实时时钟:如外部的定时电路等;
(4)用户故障源:如掉电、奇偶校验错误等。
产生于CPU内部的中断源有几种:
(1)由CPU得运行结果产生:如除数为0、结果溢出、单步执行等;
(2)执行中断指令INT:INT3;
(3)非法 *** 作或指令引起异常处理。
参考资料来源:百度百科--中断类型码
参考资料来源:百度百科--中断向量表
中断向量表,和 DOS 等 *** 作系统无关,只是和 CPU 有关。80x86 CPU 是 Intel 公司设计的。
它支持这样一种指令:INT xxH, 这些指令,称为中断调用指令。
当 CPU 执行中断调用指令的时候,CPU 会到内存 00000H ~ 003FFH 中去找对应的入口地址。
这些,都是 Intel 公司设计好的。
我们(或微软公司)编写程序的时候,可以编写 256 个子程序。
这些子程序,可以放在 1M 的内存中的其它地址,
但是要把它们的入口地址,写入 00000H ~ 003FFH 中,便于 CPU 去找。
子程序,也可以用 CALL 指令调用,但是不如用 INT xxH 快捷、规范。
早年,曾有人用 8086 制作控制板,完全不用 DOS,但是,其中也有中断向量表,因为这是 80x86 CPU 特有的方法。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)