zoukankan      html  css  js  c++  java
  • 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自动保存到内核堆栈,退出中断时自动弹出,不需要特殊处理

  • 相关阅读:
    proc文件系统
    sysfs文件系统
    linux 下 进程和线程的区别
    Linux内核中常见内存分配函数
    内核空间与用户空间的通信方式
    DoDataExchange函数,UpdateData(TRUE)和UpdateData(FALSE)的区别
    C# 获取文件路径
    C# WinForm 中 MessageBox的使用详解
    C#对于文件操作
    线程间操作无效: 从不是创建控件的线程访问它。
  • 原文地址:https://www.cnblogs.com/windmissing/p/2559849.html
Copyright © 2011-2022 走看看