system_call中断处理过程分析

分析system_call中断处理过程 阅读详情

</pre><p></p><p><span style="color:rgb(51,51,51); font-family:'Microsoft YaHei'; font-size:14px; line-height:26px">张磊 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程</span><a target=_blank target="_blank" href="http://mooc.study.163.com/course/USTC-1000029000" style="color:rgb(51,102,153); text-decoration:none; font-family:'Microsoft YaHei'; font-size:14px; line-height:26px">http://mooc.study.163.com/course/USTC-1000029000</a></p><p><span style="font-family:Microsoft YaHei; color:#333333"><span style="font-size:14px; line-height:26px">课程调用测试代码如下:</span></span></p><p><span style="font-family:Microsoft YaHei; color:#333333"><span style="font-size:14px; line-height:26px"></span></span></p><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "menu.h"

#define FONTSIZE 10
int PrintMenuOS()
{
    int i, j;
    char data_M[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "  *    *  ",
        " ***  *** ",
        " * *  * * ",
        " * *  * * ",
        " *  **  * ",
        " *      * ",
        " *      * ",
        " *      * ",
        "          "
    };
    char data_e[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "          ",
        "    **    ",
        "   *  *   ",
        "  *    *  ",
        "  ******  ",
        "  *       ",
        "   *      ",
        "    ***   ",
        "          "
    };
    char data_n[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "          ",
        "    **    ",
        "   *  *   ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "          "
    };
    char data_u[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "          ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "  *    *  ",
        "   *  **  ",
        "    **  * ",
        "          "
    };
    char data_O[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "   ****   ",
        "  *    *  ",
        " *      * ",
        " *      * ",
        " *      * ",
        " *      * ",
        "  *    *  ",
        "   ****   ",
        "          "
    };
    char data_S[FONTSIZE][FONTSIZE] =
    {
        "          ",
        "    ****  ",
        "   **     ",
        "  **      ",
        "   ***    ",
        "     **   ",
        "      **  ",
        "     **   ",
        "  ****    ",
        "          "
    };

    for(i=0; i<FONTSIZE; i++)
    {
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_M[i][j]);
        }
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_e[i][j]);
        }
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_n[i][j]);
        }
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_u[i][j]);
        }
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_O[i][j]);
        }
        for(j=0; j<FONTSIZE; j++)
        {
            printf("%c", data_S[i][j]);
        }
        printf("\n");
    }
    return 0;
}

int Quit(int argc, char *argv[])
{
    /* add XXX clean ops */
}

int Time(int argc, char *argv[])
{
    time_t tt;
    struct tm *t;
    tt = time(NULL);
    t = localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;
}

int TimeAsm(int argc, char *argv[])
{
    time_t tt;
    struct tm *t;
    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0xd,%%eax\n\t" 
        "int $0x80\n\t" 
        "mov %%eax,%0\n\t"  
        : "=m" (tt) 
    );
    t = localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;
}
int main()
{
    PrintMenuOS();
    SetPrompt("MenuOS>>");
    MenuConfig("version","MenuOS V1.0(Based on Linux 3.18.6)",NULL);
    MenuConfig("quit","Quit from MenuOS",Quit);
    MenuConfig("time","Show System Time",Time);
    MenuConfig("time-asm","Show System Time(asm)",TimeAsm);
    ExecuteMenu();
}

实验楼编译运行 gdb 调试程序:

1.rm menu -rf

2.git  clone https://github.com/mengning/menu.git

3.cd menu

4.make rootfs



库函数触发中断后,会进入一个ENTRY(system_call)函数中

ENTRY(system_call)
RING0_INT_FRAME			# can't unwind into user space anyway
ASM_CLAC
pushl_cfi %eax			# save orig_eax
SAVE_ALL
GET_THREAD_INFO(%ebp)
# system call tracing in operation / emulation
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
jnz syscall_trace_entry
cmpl $(NR_syscalls), %eax
jae syscall_badsys
syscall_call:
call *sys_call_table(,%eax,4)
syscall_after_call:
movl %eax,PT_EAX(%esp)		# store the return value
syscall_exit:
LOCKDEP_SYS_EXIT
DISABLE_INTERRUPTS(CLBR_ANY)	# make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx	# current->work
jne syscall_exit_work

restore_all:
TRACE_IRQS_IRET
restore_all_notrace:
#ifdef CONFIG_X86_ESPFIX32
movl PT_EFLAGS(%esp), %eax	# mix EFLAGS, SS and CS
# Warning: PT_OLDSS(%esp) contains the wrong/random values if we
# are returning to the kernel.
# See comments in process.c:copy_thread() for details.
movb PT_OLDSS(%esp), %ah
movb PT_CS(%esp), %al
andl $(X86_EFLAGS_VM | (SEGMENT_TI_MASK << 8) | SEGMENT_RPL_MASK), %eax
cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax
CFI_REMEMBER_STATE
je ldt_ss			# returning to user-space with LDT SS
#endif
restore_nocheck:
RESTORE_REGS 4			# skip orig_eax/error_code
irq_return:
INTERRUPT_RETURN
.section .fixup,"ax"
挑几个重要的分析下:
<pre name="code" class="cpp" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 26px;">SAVE_ALL   //保存中断现场

 
movl %eax,PT_EAX(%esp)		# store the return value //调用系统函数
syscall_exit_work    //退出前返回状态
irq_return     //结束整个系统调用函数 返回。



【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册 阅读详情

相关推荐

VSCode下载、安装+C语言环境配置(超详细)

ps:我的更改部分:"D:/BaiduNetdiskDownload/x86_64-8.1.0-release-win32-seh-rt_v6-rev0/mingw64。③ 找到【系统变量】中的【Path】变量 ---- 双击打开后,将刚刚复制的地址添加进去 ---- 点击【确定】;① 双击【此电脑】---- 点击【属性】---- 进入到下面这个界面,单击【高级系统设置】;② 进入到 系统属性界面 ---- 点击【环境变量】,进入环境变量页面;并进行安装,安装成功后,打开VSCode;

weixin_48820458的博客 1万+

Windows系统一些计数器

 Windows系统Windows -Processor 指标名称 指标描述 指标范围

探索软件测试之道 3853

Ansys Zemax|无焦系统设计中的角度单位优化技巧

本文详细介绍了在Ansys Zemax OpticStudio中进行无焦系统设计的核心技巧。重点阐述了从聚焦思维到角度思维的转换,并演示了如何通过开启‘无焦像空间’模式、构建以波前和光束尺寸为目标的评价函数来优化激光扩束镜等系统。文章还分享了使用IMSF操作数处理混合系统以及常见误区避坑的实用指南,旨在帮助光学设计者高效完成无焦系统的设计与分析。

weixin_29231027的博客 360

system call——系统调用

博客地址转至https://xisynotz.xyz 1. 系统调用 系统调用是操作系统提供的有效服务界面,一般使用高级语言编写,如c和c++,对于特定的较为底层的任务,则使用汇编语言指令。 2. API和系统调用 API,应用程序接口,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力。 使用API而不直接调用系统调用的原因主要由以下两点:1)由于API隐藏了绝大多数...

saber_jk的博客 1万+

Word标题样式基准重置:彻底解决重新打开后自动缩进问题

本文深入剖析了Word文档中标题样式在重新打开后自动缩进问题的根源,并提供了两种根治方案。通过调整标题样式基准或将其设为“无样式”,并配合检查修正多级列表设置,可彻底解决这一常见格式顽疾,确保文档格式的稳定性与专业性。

weixin_29266647的博客 528

大疆Livox Mid-70雷达的使用

一、前期准备 (一)、使用Livox Viewer测试雷达 1、设置静态IP sudo ifconfig enx081f7152092a 192.168.1.50 查看IP是否设置成功 lacyexsale@lacyexsale-KLV-WX9:~$ ifconfig enx081f7152092a Link encap:以太网 硬件地址 08:1f:71:52:09:2a inet 地址:192.168.1.50 广播:192.168.1.255 掩码:255.255.25

LacyExsale的博客 1万+

浅谈系统调用(systemcall)

操作系统

weixin_50935486的博客 3520

Linux-VMware安装后没有虚拟网卡VMnet1和VMnet8(亲测有效,一步一步跟着绝对成功)

VMware-安装后没有虚拟网卡VMnet1和VMnet8 就这个破东西我昨天弄了一天,网上什么VMware卸载重装,用CCleaner清理注册表什么的操作我全用了,但是昨天就是弄不好,同样的操作我昨天试了无数遍一直觉得可能是 持续更新中… 文章参考学习地址:https://blog.youkuaiyun.com/qq_42445139/article/details/87872130 ...

杨的博客 8851

系统调用入口函数源码分析system_call——X86_64

在实验中用到这一块,就去看源码分析整理了一下,全部为个人理解。有错误的地方,希望和大牛交流。 首先解释一下,我实验的目的是获得系统调用入口函数system_entry的起始地址和函数大小。 在linux-3.10.1, x86 64位的系统下,系统调用的入口地址保存在MSR寄存器中,通过rdmsrl(MSR_LSTAR,ksystem_call);便可获得系统调用的入口地址,然后对该入口地址进

zdd_11111的博客 8357

STM32驱动AS5600磁性旋转位置传感器模块

文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料 简介 AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。 引脚定义 I2C接口 7位设备地址为0x36(二进制表示为0110110) 支持标准模式和

ApexYuan 1万+

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2479

Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)

Windows 性能监视器的基本指标(CPU,内存,硬盘参数)        作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题。我是在运维过程中要用到的。因此,今天给出Windows 性能监视器的一些基本指标(CPU,内存,硬盘参数),希望对大家将来优化和分析问题提供帮忙。 直接在window系统中点击win键输入“性能监视器”就可以看到,参数设置类似这样: W

狮子座明仔知识集散场 3万+

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力

文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实

2601_95807009的博客 226

Linux内核分析之简析system_call中断处理过程

SA16225055冯金明 原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容

Kimi_ming的博客 833

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

5、分析system_call中断处理过程

姓名:周毅原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、Fork调用 我们把fork调用添加到menu系统中去: 然后启动menu,发现有了fork命令,执行后: 对fork命令进行跟踪调试,我们在sys_fork处设置断点:   发现无法对sys

u011301547的博客 568

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux内核分析:分析system_call中断处理过程

张家骥 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000第一部分:调试系统调用内核函数实验实验内容:使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见 http://codelab.shiyanlou.com/xref/linux-3.18.6/arc

标题获取失败 1221

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

20252820_分析 system_call 中断处理过程

从零实际跑了内核 3.18.6,用 QEMU 当虚拟机,用 gdb 远程断点调试。手动构建了一个最小 rootfs,把init(MenuOS) 作为 PID 1 跑起来;并确认能调用getpidtime等系统调用。把系统调用路径(int 0x80→→sys_xxx→→iret)画成图,而且用真实断点 (b sys_time) 观察到现场。验证了:系统调用返回值通过%eax带回用户态,iret负责恢复用户态执行现场并切回 ring3。

m0_63863049的博客 708

分析system_call中断处理过程(Linux)

----------------分析system_call中断处理过程-----------------        这次的实验是要跟踪一下系统调用的中断过程。本人上周的实验其实已经完成过了这个跟踪的过程,没想到这次下半部分就是让跟踪,那我们这次就再来跟踪一下。为了更加明显,这次选择为menu加上上次使用的系统调用的功能,然后对menu的这一系统调用的过程进行跟踪。但是,这次因为在menu

NaiveOrange的博客 835

分析system_call中断处理过程(基于实验楼平台)

分析system_call中断处理过程前言给MenuOS增加命令使用gdb跟踪调用内核函数sys_getpidgdb调试查找sys_getpid和system_call代码画出流程图总结 前言 之前我们使用了两种方法进行了系统调用,一种是使用库函数(调用API),第二种是C语言嵌入内嵌汇编。详见博客 给MenuOS增加命令 首先可以删除实验楼自带的系统,然后再git clone一个新的,这样减少了编译过程,一个make搞定 我们进入menu中的test.c,新增我上一次博客中的两个功能的代码(一个API,

weixin_44240981的博客 662
上一篇: 库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
下一篇: Linux内核创建一个新进程的过程
头发吹乱了
博客等级 码龄14年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值