首页
学习
活动
专区
圈层
工具
发布

为什么 Linux 系统调用会消耗较多资源

+++ exited with 0 +++ strace 是 Linux 中用于监控和篡改进程与内核之间操作的工具,上述命令会打印出 hello 执行过程中触发系统调用、参数以及返回值等信息。...vDSO 虚拟动态共享对象(virtual dynamic shared object、vDSO)是 Linux 内核对用户空间暴露内核空间部分函数的一种机制[^16],简单来说,我们将 Linux 内核中不涉及安全的系统调用直接映射到用户空间...,这样用户空间中的应用程序在调用这些函数时就不需要切换到内核态以减少性能上的损失。...图 7 - 内核和用户控件的初始化 系统调用 gettimeofday 是一个非常好的例子,如上图所示,使用 vDSO 的系统调用 gettimeofday 会按照如下所示的步骤进行初始化[^17]:...AT_SYSINFO_EHDR,如果设置了该标签会链接 vDSO; libc 在初始化时会在 vDSO 中查找 __vdso_gettimeofday 符号并将符号链接到全局的函数指针上; 除了 gettimeofday

2.3K40

Golang又一个和RLock有关的小故事

我们从代码中可以发现得到时间用的的vdso方式的调用, 因为有些内核使用太频繁, 每次都内核调用开销太高, 就将用户态的一段内存映射到内核, 这样内核调用就转换成用户态函数调用和内存读取。...MOVQ $0, m_vdsoSP(BX) ... walltime涉及的vdso库的解析. var vdsoSymbolKeys = []vdsoSymbolKey{ {"__vdso_gettimeofday..., &vdsoClockgettimeSym}, } 当然上面代码阅读起来还是有点困难, 进行翻译以后就是下面的代码, vdso_clock_gettime的精度是纳秒而 vdso_gettimeofday..., int32(t.nsec) } t := &timeval{} __vdso_gettimeofday(t, nil) return t.sec, int32(...t.usec * 1000) } 在walltime确实涉及到GPM中G和M的调度m_curg, 但是这个只是使用线程M的调度器G0的栈而已, 只因为G0的栈比普通的栈大, 而vdso调用需要的栈比较大而已

2.1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Stringipc-从内存任意读写到权限提升

    我们可以通过调用 0x66(sys_getuid)系统调用并将其与0进行比较。...地址 vdso和vsyscall是内核通过映射方法与用户态共享的物理内存,从而加快执行效率,当在内核态修改内存时,用户态所访问到的数据同样会改变。...vdso在内核层的内存权限为rw,用户层的权限为rx,vdso的范围在0xffffffff80000000~0xffffffffffffefff。...通过匹配vdso中"gettimeofday"字符串(同时偏移要为0x2cd,因为内存中可能存在多个"gettimeofday"字符串),可以爆破得到vdso的内核层地址,用gdb附加,用dump memory...Exp 总体思路其实就是爆破得到gettimeofday系统调用在vdso中内核层地址,将其覆盖成shellcode,等到其他root进程调用到gettimeofday时就可以执行shellcode,fork

    1.3K50

    Linux内核之旅张凯捷——系统调用分析(1)

    2 《Linux操作系统原理与应用》解释: 陈莉君老师的《Linux操作系统原理与应用(第二版)》对Linux系统调用解释为: 系统调用的实质就是函数调用,只是调用的函数是系统函数,处于内核态而已...为了加快系统调用的速度,随后先后引入了两种机制——vsycalls和vDSO。...} 使用init_dso_image()函数来初始化vdso_image结构体,vdso_image_64和vdso_image_x32在arch/x86/entry/vdso/vdso-image-...64.c和arch/x86/entry/vdso/vdso-image-x32.c中进行定义,例如vdso_image_64 对vDOS系统调用的内存页面相关的结构体初始化后,使用从arch/x86/entry...上面说到的vsyscalls和vDSO都是从机制上对系统调用速度进行的优化,但是使用软中断来进行系统调用需要进行特权级的切换这一根本问题没有解决。

    1.9K30

    沉睡一年的“脏牛”又被攻击者利用,Android用户你们还好吗?

    还记得 2016 年那个著名的 Linux 内核级漏洞 Dirty Cow(脏牛)吗?...ZNIU 的实现机制 从技术层面来看,ZNIU 实际使用的“脏牛” exploit 其实与去年研究人员公布的 POC 代码并不相同。...ZNIU rootkit可以任意写入 vDSO(虚拟动态链接共享对象),该对象将一组内核空间函数导出到用户空间,便于应用程序更好地执行。...vDSO 代码可在以没有 SELinux 限制的内核环境中运行。 ZNIU 使用公开的 exploit 代码将 shellcode 写入 vDSO 并创建反向 shell。...因此,为了避免感染,用户只能从Google Play Store 或受信任的第三方应用商店下载应用程序,并使用合适的安全解决方案。用户还可以与设备制造商和/或电话运营商联系,获取漏洞的补丁。

    1.3K50

    “脏牛漏洞”恶意Root软件分析报告

    由于安卓操作系统基于早期的Linux内核,“脏牛”还可能被用来获取安卓设备的Root权限, Google于2016年11月发布对应的安卓补丁。...从我们收集的样本数据分析可知,此类恶意应用从4月份就开始出现,主要以色情小游戏为主,并一直保持着版本 变化与更新。 2.1.2 恶意样本执行流程 恶意样本伪装成色情应用和小游戏,运行时界面如下: ?...恶意应用的rootkit通过独立的广播接收器集成到恶意应用程序中,通过这种方式恶意软件可以轻松地将rootkit集成进来 ,而无需更改其他组件,有利于 rootkit大 范围植入。 ?...该exploit可以任意写入vDSO(虚拟动态链接共享对象),为了使应用程序更好的执行,该对象将一组内核空间函数导出到用户空间 ,vDSO代码在没有SELinux限制的内核上下文中运行 。...exploit使用漏洞利用代码将shellcode写入vDSO并创建反弹shell。然后,它修 改SELinux策略以解除限制并植入一个后门root shell。 ?

    2.3K100

    程序员的自我修养 - 系统调用及原理

    什么是系统调用 系统调用是应用程序(包含运行库)与操作系统内核的接口,它决定了应用程序如何与内核打交道。...系统调用原理 现代的CPU常常可以在多种不同的特权级下执行命令,在现在的操作系统中,通常有两种特权级,分为用户模式和内核模式,也称用户态和内核态。...由于多种模式的存在,操作系统可以让不同的代码运行在不同的模式上,提高稳定性和安全性。 系统调用时运行在内核态的,而应用程序一般是运行在用户态。用户态的程序如何运行内核态的代码呢?...在Linux中,用户态和内核态使用不同的栈,两者各自负责各自的函数调用,互不干扰。但是在程序调用 0x80号中断时,程序的执行流程从用户态切换到内核态,这时候程序的当前栈必须也从用户栈切换到内核栈。...分析过程: ldd获取共享库,找到linux-gate.so.1,也就是地址0xffffe0000被映射到vdso,可以把文件的这个段单独导出到一个文件里分析,vdso导出一系列函数,其中 _kernel_vsyscall

    64320

    【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

    ; -- 用户态 : 只允许使用部分硬件资源的部分功能, 只能访问内核分配的内存; (2)  系统调用 系统调用 : 应用程序 通过 系统调用 与内核通信; -- 调用过程 : 一般先调用 库函数, 在通过库函数...调用内核方法; 库函数与系统调用关系 :  -- 系统调用是库函数的一部份 : 有的库函数需要多个系统调用来完成; -- 一一对应 : 有的库函数 与 系统调用是一一对应的关系, 这种情况下, 相当与应用程序直接在内核运行..., 即陷入内核; (3) 硬件设备管理 和 中断 设备与内核通信过程 :  -- a....System.map 的对照表, 这份对照表是 内核中的符号 和 地址对应起来, 比如函数的地址, 变量的地址等; 00000000 A VDSO32_PRELINK 00000040 A VDSO32...使用 mknod 命令进行创建; -- 设备接口 : 设备文件是应用程序和设备驱动之间的接口, 应用程序通过操作设备文件使用设备驱动的功能; -- 与字符和块设备对应 : 字符设备 和 块设备 必定与一个设备文件对应

    3.2K51

    Kernel pwn 1

    介绍 对于linux kernel这块的pwn大体跟用户状态差不多,出题人一般都是自己编写了一个驱动模块,由内核进行加载该模块,在用户态可以打开该设备,采用ioctl来与驱动进行交互,若能成功pwn掉该驱动实现提权...exp一般都是c语言写的,需要编译为静态再上传至远程靶机运行,提升权限后即可查看远程flag。 编译内核 去官网下载一份kernel内核源码, 这里就采用2.6.32版本。...我采用docker 下的ubuntu16.04进行编译内核, 编译内核前需要拥有特定的版本的make和gcc, g++ 获取不同版本的内核: 获取 安装特定的编译器 sudo apt install gcc.../configure make 修改三处 2.6 源码文件 1.arch/x86/vdso/Makefile 中第 28 行的 -m elf_x86_64 改成 -m64,第 72 行的-m elf_i386.../bin/ash: can't access tty; job control turned off / # ls bin etc proc sbin usr 编写与打开内核驱动

    2.1K10

    Goroutine背后的系统知识

    操作系统与运行库 对于普通的电脑用户来说,能理解应用程序是运行在操作系统之上就足够了,可对于开发者,我们还需要了解我们写的程序是如何在操作系统之上运行起来的,操作系统如何为应用程序提供服务,这样我们才能分清楚哪些服务是操作系统提供的...,以及为了提高某些调用的效率(譬如__NR_ gettimeofday),Linux上还是对部分系统调用做了一层封装,就是VDSO (早期叫linux-gate.so)。...可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层的封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言的运行库,对于C语言,Linux上是glibc...我们先考虑单颗单核CPU,操作系统内核与应用程序其实是也是在共享同一个CPU,当EIP在应用程序代码段的时候,内核并没有控制权,内核并不是一个进程或线程,内核只是以实模式运行的,代码段权限为RING 0...的内存中的程序,只有当产生中断或是应用程序呼叫系统调用的时候,控制权才转移到内核,在内核里,所有代码都在同一个地址空间,为了给不同的线程提供服务,内核会为每一个线程建立一个内核堆栈,这是线程切换的关键。

    88760

    Linux启动引导参数grub

    内核引导参数大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数。...ACPI 高级配置与电源管理接口(Advanced Configuration and Power Interface)是提供操作系统与应用程序管理所有电源管理接口,包括了各种软件和硬件方面的规范。...(1)s3_bios和s3_mode与显卡有关。计算机从S3状态(挂起到内存)恢复时,硬件需要被正确的初始化。...vdso32={0|1|2} vdso32=0 禁用32位 VDSO(Virtual Dynamic Shared Object)映射 vdso32=1 启用32位 VDSO(Virtual Dynamic..."0"表示由内核强制执行检查保护(包括其中隐含的所有执行保护) "1"表示由应用程序自己主动请求执行检查保护 默认值由内核在编译时确定,也可以在运行时通过 /selinux/checkreqprot

    12.1K20

    OpenHarmony 轻内核M核源码分析系列二十 Newlib C

    LiteOS-M内核LibC实现有2种,可以根据需求进行二选一,分别是musl libC和newlibc。本文先学习下Newlib C的实现代码。...内核提供的posix接口与musl中的标准C库接口共同组成LiteOS-M的LibC。...1.1 函数mount、umount和umount2这些函数的用法,函数实现和musl c部分一致。...这种方法中,内存分配函数可以使用内核的。为了方便地根据业务进行内存分配算法调优和问题定位,推荐选择后者。...写在最后如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;关注小编,同时可以期待后续文章ing,不定期分享原创知识;想要获取更多完整鸿蒙最新学习知识点

    27320

    好多网友都不知道怎么阅读Linux内核源码,这篇让你快速理解

    /linux/v5.16/source 三、内核子系统 什么是内核: 在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的计算机程序,将这些要求转译为数据处理的指令并交由中央处理器(...它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。 内核和用户空间的应用程序使用的是不同的保护地址空间。...小编强烈推荐:source insight这款阅读代码神器! 也可以使用vscode或者vim+ctags的组合。不过小编十几年的从业经验,99%以上的开发人员都选择SI阅读内核代码。...但是,改代码与现在的代码差异巨大,阅读后可以理解基本思想,但对理解现有代码的帮助不是特别明显。 3.10版本之后的内核都支持设备树! 所以小编建议是尽量选择3.10版本之后的代码阅读学习。 4....,小编都会被那一行行枯燥的代码背后隐藏的设计思想所震撼,所折服!

    6.3K20

    使用了零拷贝技术的Kafka,当然很快

    第2、3步有个很大的问题:内核空间与用户空间的来回切换。这种切换很耗资源。...用户空间与内核空间 定义 内核空间:操作系统的核心就是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的权限。操作系统是不会让用户直接操作内核的。...内核所运行的空间就是内核空间。 用户空间:就是应用程序运行的空间。 用户空间如何访问内核空间 在实际场景中,有很多操作都需要在内核空间进行。比如磁盘数据的读取,网卡数据的读取,内存的分配回收等。...我们编写的应用程序是无法直接去操作的。应用程序只能通过内核提供的接口去操作,这就是常说的系统调用。通过系统调用,进程从用户空间进入到了内核空间(用户态 -> 内核态)。...零拷贝并不是真的就没有拷贝了,它是去掉了用户空间与内核空间的来回拷贝。对于用户空间来讲,我并没有拷贝,所以相对的来说就是零拷贝。

    63110

    goroutine背后的系统知识

    操作系统与运行库 对于普通的电脑用户来说,能理解应用程序是运行在操作系统之上就足够了,可对于开发者,我们还需要了解我们写的程序是如何在操作系统之上运行起来的,操作系统如何为应用程序提供服务,这样我们才能分清楚哪些服务是操作系统提供的...,以及为了提高某些调用的效率(譬如__NR_ gettimeofday),Linux上还是对部分系统调用做了一层封装,就是VDSO (早期叫linux-gate.so)。...可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层的封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言的运行库,对于C语言,Linux上是glibc...我们先考虑单颗单核CPU,操作系统内核与应用程序其实是也是在共享同一个CPU,当EIP在应用程序代码段的时候,内核并没有控制权,内核并不是一个进程或线程,内核只是以实模式运行的,代码段权限为RING 0...的内存中的程序,只有当产生中断或是应用程序呼叫系统调用的时候,控制权才转移到内核,在内核里,所有代码都在同一个地址空间,为了给不同的线程提供服务,内核会为每一个线程建立一个内核堆栈,这是线程切换的关键。

    76480

    绝对干货!初学者也能看懂的DPDK解析

    但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万并发能力。...数据从 网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务 用户态的好处是易用开发和维护,灵活性好。并且Crash也不影响内核运行,鲁棒性强。...要开发用户态驱动有几个步骤: 1.开发运行在内核的UIO模块,因为硬中断只能在内核处理 2.通过/dev/uioX读取中断 3.通过mmap和外设共享内存 五、DPDK核心优化:PMD DPDK的UIO...不使用慢速API 这里需要重新定义一下慢速API,比如说gettimeofday,虽然在64位下通过vDSO已经不需要陷入内核态,只是一个纯内存访问,每秒也能达到几千万的级别。...所以即使是gettimeofday也属于慢速API。DPDK提供Cycles接口,例如rte_get_tsc_cycles接口,基于HPET或TSC实现。

    2.5K21

    goroutine背后的系统知识

    操作系统与运行库 对于普通的电脑用户来说,能理解应用程序是运行在操作系统之上就足够了,可对于开发者,我们还需要了解我们写的程序是如何在操作系统之上运行起来的,操作系统如何为应用程序提供服务,这样我们才能分清楚哪些服务是操作系统提供的...,以及为了提高某些调用的效率(譬如__NR_ gettimeofday),Linux上还是对部分系统调用做了一层封装,就是VDSO (早期叫linux-gate.so)。...可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层的封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言的运行库,对于C语言,Linux上是glibc...我们先考虑单颗单核CPU,操作系统内核与应用程序其实是也是在共享同一个CPU,当EIP在应用程序代码段的时候,内核并没有控制权,内核并不是一个进程或线程,内核只是以实模式运行的,代码段权限为RING 0...的内存中的程序,只有当产生中断或是应用程序呼叫系统调用的时候,控制权才转移到内核,在内核里,所有代码都在同一个地址空间,为了给不同的线程提供服务,内核会为每一个线程建立一个内核堆栈,这是线程切换的关键。

    97840

    goroutine背后的系统知识

    操作系统与运行库 对于普通的电脑用户来说,能理解应用程序是运行在操作系统之上就足够了,可对于开发者,我们还需要了解我们写的程序是如何在操作系统之上运行起来的,操作系统如何为应用程序提供服务,这样我们才能分清楚哪些服务是操作系统提供的...,以及为了提高某些调用的效率(譬如__NR_ gettimeofday),Linux上还是对部分系统调用做了一层封装,就是VDSO(早期叫linux-gate.so)。...可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层的封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言的运行库,对于C语言,Linux上是glibc...我们先考虑单颗单核CPU,操作系统内核与应用程序其实是也是在共享同一个CPU,当EIP在应用程序代码段的时候,内核并没有控制权,内核并不是一个进程或线程,内核只是以实模式运行的,代码段权限为RING 0...的内存中的程序,只有当产生中断或是应用程序呼叫系统调用的时候,控制权才转移到内核,在内核里,所有代码都在同一个地址空间,为了给不同的线程提供服务,内核会为每一个线程建立一个内核堆栈,这是线程切换的关键。

    87150

    含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(中)

    Linux内核去寻找答案 (内核实际处理过程涉及更多的过程,我们这里主要关注和ELF文件处理相关的代码)。...下图是Linux内核代码中与ELF文件的装载相关的一些代码: /fs/binfmt_elf.c中 Load_elf_binary的代码走读: 检查ELF文件头部信息(一致性检查) 加载程序头表(可以看到一个可执行程序必须至少有一个段...操作系统在execve时完成: 操作系统在内核态调用mmap 进程还未准备好时,由内核直接执行 ”系统调用“ 映射好 a.out 的代码、数据、堆区、堆栈、vvar、vdso、vsyscall 更简单的实现...那个时候其实属于链接时的重定位,现在我们需要装载时的重定位 ,主要使用了以下关键技术: PIC位置无关代码 GOT全局偏移表 GOT配合PLT实现的延迟绑定技术 引入动态链接之后,实际上在操作系统开始运行我们的应用程序之前...,首先会把控制权交给动态链接器,它完成了动态链接的工作之后再把控制权交给应用程序。

    4K22
    领券