在前一篇文章《Linux内核跟踪:ftrace hook入门手册(上)》中,我们对部分ftrace hook经典方案中的实现细节进行了优化。本文会深入说明这些优化的原理和目的。
之前我们说过ret2text漏洞是依赖于程序中存在执行 system("/bin/sh")的函数,那么如何解决ret2text的局限性
描述:官方介绍 strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。其底层的实现方式是基于ptrace特性;
调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ;
题图来自 My second impression of Rust and why I think it's a great general-purpose language![1]
Linux系统中,应用程序访问外设是通过文件的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下。
在Linux下开发应用程序可以调用两种接口来实现,一种是直接调用系统调用接口,另一种是调用库函数来实现。
Linux开发者越来越多,但是仍然有很多人整不明白POSIX是什么。本文就带着大家来了解一下到底什么是POSIX,了解他的历史和重要性。
既然主流 IT 工业都在采用基于容器的基础设施(云原生方案),那么了解这一技术的短板就很重要了。Docker、LXC 以及 RKT 等传统容器都是共享主机操作系统核心的,因此不能称之为真正的沙箱。这些技术的资源利用率很高,但是受攻击面积和潜在的攻击影响都很大,在多租户的云环境中,不同客户的容器会被同样的进行编排,这种威胁就尤其明显。主机操作系统在为每个容器创建虚拟的用户空间时,不同容器之间的隔离是很薄弱的,这是造成上述问题的根本原因。基于这样的现状,真正的沙箱式容器,成为很多研发工作的焦点。多数方案都对容器之间的边界进行了重新架构,以增强隔离。本文覆盖了四个项目,分别来自于 IBM、Google、Amazon 以及 OpenStack,几个方案的目标是一致的:为容器提供更强的隔离。IBM Nabla 在 Unikernel 的基础上构建容器;Google 的 gVisor 为运行的容器创建一个特定的内核;Amazon 的 Firecracker 是一个超轻量级的沙箱应用管理程序;OpenStack 将容器置入特定的为容器编排平台优化的虚拟机之中。下面对几个方案的概述,有助于读者应对即将到来的转型机会。
前言:在了解完冯诺依曼体系结构和操作系统之后,我们进入了Linux的下一篇章Linux进程,但在学习Linux进程之前,一定要阅读理解上一篇内容,理解“先描述,再组织”才能更好的理解进程的含义。
OS的正常工作依赖于存储程序原理、堆栈、中断三个部分。 linux内核从一个初始化上下文环境的函数开始执行,即start_kernel函数,创建多个进程或者fork(创建一个与原来进程几乎完全相同的进程)若干进程,我们为每个进程维护一个进程描述和以及进程间的关系PCB。 当中断发生的时候,如mykernel中就是时钟中断发生之后,接下来OS就会为各进程进行调度,利用Swich_to函数在调度队列中选取出一个适合的进程(系统会根据中断向量号来调用相应的中断异常程序)。由CPU和内核堆栈保存当前进程的各寄存器信息(CPU要做两件工作,一是将当前的eip和esp压入到当前进程的内核栈,二是将esp指向当前进程的内核栈,并将eip指向中断处理入口,进入到内核态。),将eip指向要调度的进程执行的代码区,开始执行。
入参timeoutNanos设置执行任务的超时时间. 一旦超过这个设定的时间,则停止执行任务.
Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。
WebAssembly(Wasm)[1]是一种二进制软件格式,所有浏览器都可以在任何操作系统(OS)上直接、安全地[2]以接近原生的速度运行。然而,它最大的承诺是最终以同样的方式在任何地方[3]工作,从物联网设备和边缘服务器,到移动设备和传统桌面。这篇文章介绍了实现这一目标的主界面。本系列的下一篇文章将描述一些已经可用的、真实世界的相同接口的实现和应用程序。
本篇聊一聊 新的主题:《反弹shell-逃逸基于execve的命令监控》,打算写一个专题,预估可以写三篇,内容确实有点多,也是最近研究了一些有意思的东西,想给大家分享一下。喜欢的话,请大家一定点在看,并分享出去,算是对我原创最大的支持了。
Steve Kleiman 在 1986 年撰写了《Vnodes: An Architecture for Multiple File System Types in Sun UNIX》一文。这篇论文幅较短,大部分内容是数据结构的列举,以及 C 语言结构之间相互指向的图表。
按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让他重新引起了大家的注意。
在上一篇文章《系统调用分析(2)》中介绍和分析了32位和64位的快速系统调用指令——sysenter/sysexit和syscall/sysret,以及内核对快速系统调用部分的相关代码,并追踪了一个用户态下的系统调用程序运行过程。
系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。 Linux操作系统作为自由软件的代表,它优良的性能使得它的应用日益广泛,不仅得到专业人士的肯定,而且商业化的应用也是如火如荼。在Linux中,大 部分的系统调用包含在Linux的libc库中,通过标准的C函数调用方法可以调用这些系统
Linux应用编程涉及到在Linux环境下开发和运行应用程序的一系列概念。以下是一些涵盖Linux应用编程的基本概念:
进一步讲,进程是在用户空间中,加载器根据程序头提供的信息,将程序加载到内存并运行的实体。
本篇聊一聊 新的主题:《反弹shell-逃逸基于execve的命令监控》,打算写一个专题,预估可以写三篇,内容确实有点多,也是最近研究了一些有意思的东西,想给大家分享一下。喜欢的话,请大家一定点在看,并分享出去,算是对我原创最大的支持了。如何想看新方法,直接到最后。
Kubernetes在2017年赢得了容器编排之战,使得基于容器+Kubernetes来构建PaaS平台成为了云计算的主流方式。在人们把关注的目光都聚焦在Kubernetes上时,容器技术领域在2018年也发生了很多创新,包括amazon最近开源的轻量级虚拟机管理器 Firecracker,Google在今年5月份开源的基于用户态操作系统内核的 gVisor 容器,还有更早开源的虚拟化容器项目 KataContainers,可谓百花齐放。一般的开发者可能认为容器就等于Docker,没想到容器领域还在发生着这么多创新。我在了解这些项目时,发现如果没有一些背景知识,很难get到它们的创新点。我试着通过这篇文章进行一次背景知识的梳理。让我们先从最基本的问题开始:操作系统是怎么工作的?
epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,于 2002 年在 Linux kernel 2.5.44 中被引入。在 epoll 之前,Unix/Linux 平台下的 I/O 复用模型包含 select 和 poll 两个系统调用。随着因特网的发展,因特网的用户量越来越大,C10K 问题出现。基于 select 和 poll 编写的网络服务已经不能满足不能满足用户的需求了,业界迫切希望更高效的系统调用出现。在此背景下,FreeBSD 的 kqueue 和 Linux 的 epoll 被研发了出来。kqueue 和 epoll 的出现,终结了 C10K 问题,C10K 问题就此作古。
zabbix_agentd [10555]: cannot create Semaphore: [28] No space left on device
对于一些新的或者不常用的命令和函数,我们常常需要查询使用方法或者参数详情,在linux下我们不需要去网上查询,完全可以利用linux自带的手册查看帮助信息。这就是我们今天要介绍的man命令。
RustyHermit,是一个 Unikernel 应用,它完全是由 Rust 开发的。Unikernels 是直接将内核作为库方式包含的应用程序映像,因此不需要安装操作系统(OS)。它们通常用于构建典型云应用,或者基础设施建设的核心虚拟化环境。
exit是c语言的库函数,他最终调用_exit。在此之前,先清洗标准输出的缓存,调用用atexit注册的函数等, 在c语言的main函数中调用return就等价于调用exit。
Linux 3.8 合并窗口接受了 Eric Biederman 的大量用户命名空间及相关的补丁。尽管仍有一些细节待完成,例如,许多 Linux 文件系统还不知道用户命名空间,但用户命名空间的实现已经在功能上完成了。
公众号《鲁大猿》 ,寻精品资料,帮你构建Java全栈知识体系 http://www.jiagoujishu.cn
系统调用就是调用操作系统提供的一系列内核功能函数,因为内核总是对用户程序持不信任的态度,一些核心功能不能直接交由用户程序来实现执行。用户程序只能发出请求,然后内核调用相应的内核函数来帮着处理,将结果返回给应用程序。如此才能保证系统的稳定和安全。本节采用 $xv6$ 的实例来讲解系统调用具体是如何实现的。
Linux 提供了丰富的库函数,涵盖了各种领域,从文件操作到网络编程、图形界面、数学运算等。这些库函数大多数都是标准的 C 库函数,同时也包括一些特定于 Linux 系统的库。
JVM本质就是一个进程,因此其内存空间(也称之为运行时数据区,注意与JMM的区别)也有进程的一般特点。深入浅出 Java 中 JVM 内存管理,这篇参考下。
在开发应用程序时 , 进行 " 进程创建 " , 调用的 fork() , vfork() , clone() 等函数 , 就是 " 系统调用 " ;
如果出现了很多的客户端连接,比如1000个,那么应用程序就会启用1000个进程或线程阻塞等待。此时会出现性能问题:
linux系统下一切皆文件,我们几乎无时无刻不在跟文件打交道。内核对文件I/O做了很好的封装,使得开发人员便捷地操作文件,但也因此隐藏了很多细节。如果对其不求甚解,在实际开发中可能会碰到一些意想不到的问题。这次,让我们手拿放大镜,一起窥探文件I/O的全貌。
希望本文有助于展示您的Redis实例可以解锁的潜力。EQ Alpha与此模块和KeyDB项目的目标之一是帮助驱动选项,以实现更大,更强大的实例,从而通过能够处理更多负载来最小化分片和群集的需求。该模块采用独立模块形式,非常有用,因为无论Redis基本代码的下一步版本和未来版本如何,它都可能提供性能提升。
IO模型 只关注IO,不关注IO读写完成后的事情。 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING,一直等待着方法有效的返回结果 非阻塞:NONBLOCKING,调用方法的时候就返回是否读取到,(java中要么返回null,要么返回具体的对象) 所以IO模型有: 同步阻塞:程序(APP)自己读取,调用了方法后一直等待着有效的返回结果 同步非阻塞:程序(APP)自己读取,调用方法的瞬间就给出是否读取到的返回结
Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级分为4个,Linux 使用 Ring 0 和 Ring 3。
当谈到系统调用(system call)时,我们首先映入脑海的差不多就是软中断、内核态、用户态。开宗明义第一章,我想让大家先要重新认识一下『系统调用』这个词。
相信不少的网友,在很多的博客文章里面,已经见到过零拷贝这个词,会不禁的发出一些疑问,什么是零拷贝?
Go 语言中的 syscall 库用于提供程序与操作系统间的接口,使得程序能够执行系统调用。不同的操作系统具有不同的系统调用接口和机制,这导致 syscall 库在 Linux 和 Windows 系统上的表现和用法存在显著差异。以下是这两个平台之间的主要差异:
本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看
在这篇文章中,我将使用一个简单的 HTTP 基准测试在 Linux 内核的网络堆栈和由 DPDK 提供支持的内核旁路堆栈之间进行正面性能比较。 我将使用 Seastar 运行我的测试,Seastar 是一个用于构建高性能服务器应用程序的 C++ 框架。 Seastar 支持构建使用 Linux 内核或 DPDK 进行网络连接的应用程序,因此它是进行此比较的完美框架。
原创作品转载请注明出处https://github.com/mengning/linuxkernel/
前几天,读者群里有小伙伴提问:从进程创建后,到底是怎么进入我写的main函数的?
作者简介: 王建峰,对于技术方向(主要是嵌入式领域的OS方向的系统应用)感兴趣,最近在学习操作系统基础。同时也是某芯原厂的驱动工程师,主要是gpu领域的驱动软件。https://gitee.com/hinzer/blog 1 概念介绍 1.1 什么是操作系统? 1.2 如何理解中断机制? 1.3 如何理解系统定时? 1.4 如何理解进程控制? 1.5 如何理解内存管理? 1.6 如何理解堆栈概念? 1.7 内核在源码中的体现? 1.8 如何理解系统调用? 1.9 如何理解特权级? 2 流程分析 2.1 引导
领取专属 10元无门槛券
手把手带您无忧上云