作者简介:冬之焱,杭州某公司linux内核工程师,4年开发经验,对运用linux内核的某些原理解决实际问题很感兴趣。
段是程序的组成元素。将整个程序分成一个一个段,并且给每个段起一个名字,然后在链接时就可以用这个名字来指示这些段,使得这些段排布在合适的位置。
https://juejin.im/post/5c7e72cd6fb9a049fc044519”
在ANSI C(美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准)的任何一种实现中,程序都存在两个不同的环境。
遥想当年上小学的时候,语文是先学 人口手 上中下;数学就是先数数,然后加减乘除了。
当异常发生时,Linux内核给造成异常的进程发送一个信号,告知其发生了异常。比如,如果一个进程尝试除零操作,CPU会产生除法错误异常,相应的异常处理程序发送SIGFPE信号给当前进程,然后由其采取必要的步骤,恢复还是中止(如果该信号没有对应的处理程序,则中止)。
协程被称为“轻量级线程”或者“用户态线程”。最近协程在高并发编程领域大放异彩,如Golang天生就支持协程,Lua和Python也支持协程。但其实协程并不是最近才出现的新技术,恰恰相反,协程是一项古老的技术。早期版本的Linux并不支持线程,这时就出现代替线程的轻量级线程--协程。比较有名的有: GNU Pth 和 Libtask(Go语言的作者之一Russ Cox的作品)。下面我们会以Libtask作为分析案例来解释协程的原理。
作者卢子填, 腾讯移动互联网 高级开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法。 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册)、安全(骚扰拦截、短信过滤)、工具(网络检测、照片清理、极简提醒等)等等各个方面,为千万用户提供安全专业的服务。但与此同时,工程代码也越来越庞大(近30万行),一丁点的问题都会影响大量的用户,所以手管一
简介:Intel SGX是一个把应用与OS完全隔离的可信执行环境,应用无法直接访问OS提供的资源。我们采用的Teaclave-SGX-SDK只提供了no_std环境,导致crates生态下大量的库都无法被使用。我们通过添加libc函数模拟linux平台特性,实现依赖std的Rust生态库无需修改即可在SGX环境使用。为了保证尽可能小的安全边界,我们对每个增补的libc函数做了权限控制。同时引入了二进制分析,确保程序不会出现SGX非法指令。
Inline Hook技术能够帮助我们完成函数的动态拦截和跳转,但要实现缺陷函数的自动化热修复则会面临更加复杂的挑战。本文从一个实际例子出发,阐述了在对二进制形式的Linux固件做自动化安全加固的时遇到的技术难题和解决办法。
《CSAPP》是指计算机系统基础课程的经典教材《Computer Systems: A Programmer's Perspective》,由Randal E. Bryant和David R. O'Hallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理,包括硬件和软件的相互关系,其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题,旨在培养学生系统级编程和分析的能力。
前言 《编译与链接过程的思考》 《静态库与动态库的思考》 在写完上面两篇思考之后,仔细研读《程序员的自我修养—链接、装载与库》,对编译、链接、装载、静态库和动态库有连贯的认知。 这种知识先在学校学习一遍,然后遗忘; 工作用到,百思不得其解; 然后再看书,才能深深记住和理解。 正文 机器指令 最初的机器指令,是使用纸带来记录; 当变更指令的时候,需要程序员重新计算每个子程序的跳转地址。这个操作就是重定位。 但是,如果有多条纸带,跳转更为复杂。 汇编语言 为了解决上面复杂的机器指令跳转,先驱者
栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需要取出元素时也只能从最上面开始取,通常我们称添加元素为入栈(push),取出元素为出栈(pop)。
今天我们正式开始C++语言的学习,和C语言一样,我们与C++的第一缕羁绊从打印 “hello world” 开始:
其实我是一个根本不懂技术的人,二进制我也是随便鼓捣的,大概能理解一些这样子。最近一直在试着挖皮卡丘,因为皮卡丘核心的东西都在二进制里,所以也不得不搞起了逆向。搞了段时间有点心得了想分享一下我的一些想法。简单的说,我目前认为,抛开复杂的pwn不讲,大部分时候逆向一个没有过度反调试和混淆的二进制文件整体思路和操作上是和代码审计一样的。所以我觉得对于大部分人来说简单学一学,也能挖到不少rce。由于我比较菜,所以有些东西可能讲错了或者是讲的皮毛,别太深究。这篇文章主要是给不太懂但是又想挖一挖的人看的。
要深入理解Linux内核中的同步与互斥的实现,需要先了解一下内联汇编:在C函数中使用汇编代码。
理解链接器将帮助你构造大型程序。构造大型程序的程序员经常会遇到由于缺少模块、缺少库或者不兼容的库版本引起的链接器错误。除非你理解链接器是如何解析引用、什么是库以及链接器是如何使用库来解析引用的,否则这类错误将令你感到迷惑和挫败。
本文主要分析Go语言的panic/recover在AMD64 Linux平台下的实现,包括:
S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SDRAM发送命令,但是不能直接给Nand Flsh发送命令
目前,当Go需要和C/C++代码集成的时候,大家最先想到的肯定是CGO。毕竟是官方的解决方案,而且简单。 但是CGO是非常慢的。因为CGO其实一个桥接器,通过自动生成代码,CGO在保留了C/C++运行时的情况下,搭建了一个桥来沟通C/C++世界和Go的世界。这就意味着,兼容性很好,但是对C的函数的调用,必须先把当前的goroutine挂起,并切换执行栈到当前的线程M的主栈(大小2MB)。如果不做这个操作,那么只能在goroutine的栈上执行C函数调用,可是,goroutine的栈一般都很小,很容易就导致了
现在我们知道了程序的编译链接是在翻译环境中进行的,接下来我们来探讨程序编译链接的具体过程。首先,我们来探讨编译,编译其实分为三个阶段,分别是:预处理(预编译)、编译、汇编。这三个阶段所执行的具体操作如下。
最近在做一个东西,有少部分的代码需要用汇编写,大部分都是c语言实现,而且还是x64的程序。配置单独的masm开发环境,独立编译然后链接过来,真实太费劲了,所以就想直接用visual studio吧。 vs上64位的编译器不支持内敛汇编了,只能写成单独的asm文件,然后独立编译。下面就介绍怎么让让vs2015上让项目支持对asm文件进行编译。
一.函数默认值 c++支持给函数的形式参数进行默认初始化,其规则为从右向左依此初始化。
链接是将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存中执行。
在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于plan9,此方面的 介绍很多,就不进行展开了。我们WHY和HOW开始讲起。
本文梳理了ios或osx中可以用于hook的框架及其使用,对于C/C++方法,进行了私有和系统方法的区分阐述,本文仅针对hook框架做讨论,对于实验中用到的注入、签名等不作阐述。
现代的开发工作中,相信绝大部分的同学手头的项目都不是从第零行代码开始搭建的。各个语言都有自己流行的代码框架,如PHP的有Laravel、CodeIgniter、ThinkPHP等等。大家都是在自己的框架的基础上添加自己的业务代码逻辑,开启开发工作。还记得我们团队有位开发同学当时问过我一个问题,我们用xx框架这么重,一个用户请求过来即使什么也不干,都已经进行了那么多次的函数调用了,适合用来做接口开发吗?
去年学习Go语言时,有位同学说了一句让我至今仍深刻记忆的话:“我们有足够多的工具来进行性能分析,以找出性能问题的根源”。
当广告推荐业务峰值QPS已经达到10万以上,向量检索QPS峰值就会就会达到30万以上,召回服务的向量检索P99时延和平均时延已经超出了能接受的正常范围,导致召回服务整体时延达到上限,很多请求超时以至于没有广告返回给上游服务。同时粗排服务对召回服务返回的广告列表进行自定义向量相似度计算过滤,传统的数学公式计算非常耗时和耗资源,导致粗排服务压力很大,上游召回服务又想召回更多广告给到粗排服务进行再次过滤以提高召回精度。因此关于向量相关的检索和计算需要进行优化以缓解线上服务压力,助力业务发展。
在上面的例子中,使用 for 循环将字符串 Naveen进行遍历后调用 defer,这些 defer调用仿佛就像被压栈一样,最后被推入堆栈的defer调用将被拉出并首先执行。
| 导语 ABI(Application Binary Interface)描述了应用程序和OS之间的底层接口。其中,通过查阅调用约定(Calling Convention),我们可以了解到子过程调用是如何传递参数及返回值的,其中的细节包括有参数或返回值传递的位置(寄存器/栈)和使用细节、传参的顺序、调用前后的清理工作等。 目前,主流移动设备CPU主要采用ARM处理器。在做移动客户端开发时,难免遇到需要分析汇编代码的情况,牵涉到过程调用的部分就必须要了解相应平台的ABI。 本文从实际开发中遇到的一个平台
今天我们要来探究的内容是一个或者多个源文件(.c)是如何变成一个可执行程序(.exe)的,博主将在Linux环境gcc编译器中进行分步演示,让你深入理解程序环境。
在正式开启对fishhook的讲解之前,我先对之前的dyld的内容(应用程序的加载——dyld动态链接器的工作流程)做个回顾。
Objective-C是本人用过的最佳类C、面向对象的编程语言。Objective-C与标准C完美兼容,而在此基础上又加上了将面向对象的基础概念诠释得最好的SmallTalk元素,使得它既简洁、又灵活,绝对是做商业化项目的首先编程语言工具。它跟Java相比更接近底层,你可以直接在里面写内联汇编或直接与汇编文件一起连接(因为它就是C语言,在C语言基础上扩展了SmallTalk的消息机制与OO机制)。与C++相比,它显然又简洁许多,C++里的神马多继承了、虚拟继承了,坑之多数不尽。Objective-C非常容易上手,而且语法也不复杂,所以不会导致程序员出现过于良莠不齐的现象,整个项目维护起来也十分容易。
---- 概述 实现一个基于Intel x86的32位操作系统。 ---- 环境搭建 Ubuntu虚拟机。 Ubuntu - 汇编编译器NASM - C编译器GCC - 软盘绝对扇区读写工具dd - qemu虚拟机 - Bochs模拟器 - 磁盘映像工具bximage $ sudo apt-get install build-essential nasm 这里的build-essential软件包中包含GCC和GNU Make。 一些常用指令 汇编命令 $ nasm boot.asm
函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC 6.0环境下进行演示。分析不到位或者存在错误的地方请批评指正,请与作者联系。
导语 | 在任意一门编程语言中,函数调用基本上都是非常常见的操作;我们都知道,函数是由调用栈实现的,不同的函数调用会切换上下文;但是,你是否好奇,对于一个函数调用而言,其底层到底是如何实现的呢?本文讲解了函数调用的底层逻辑实现。 一、汇编概述 既然要讲解函数调用的底层逻辑实现,那么汇编语言我们是绕不过的。 因此,首先来复习一下汇编相关的知识。 我们都知道,计算机只能读懂二进制指令,而汇编就是一组特定的字符,汇编的每一条语句都直接对应CPU的二进制指令,比如:mov rax,rdx就是我们常见的汇编指令。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/50644876
前言: 这里作者再次自不量力了,以一点微末的道行分析一下KVM的CPU虚拟化部分的代码。 分析: 1,分析具体代码逻辑之前,可以先使用strace大致看一下qemu启动的时候,和kernel的交互。 在正常启动qemu的命令之前加入strace即可:strace qemu-system-x86_64 -enable-kvm -m 2048 -drive if=virtio,file=/home/ubuntu-server-1604.qcow2,cache=none -redir :8090::80 -r
通过之前《Go语言编译链接过程》我们知道Go程序需要经过编译链接成可执行程序才能到指定平台上运行,经过 ‘go build main.go’ 会在比如在windows下是.exe可执行程序,在 linux 平台上是 ELF 格式的可执行文件。
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM、nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40
系统调用,我们可以理解是操作系统为用户提供的一系列操作的接口(API),这些接口提供了对系统硬件设备功能的操作。这么说可能会比较抽象,举个例子,我们最熟悉的 hello world 程序会在屏幕上打印出信息。程序中调用了 printf() 函数,而库函数 printf 本质上是调用了系统调用 write() 函数,实现了终端信息的打印功能。
上一篇文章中,我们通过源码跟踪了整个Trap的执行流程,本文追踪我们通过Debug的方式,来验证上一篇文章的说法。
进程切换,又称为任务切换、上下文切换、或者任务调度。本文就研究Linux内核的进程切换。我们首先理解几个概念。
在Linux操作系统中,一段C程序从被写下到最终被CPU执行,要经过一段漫长而又复杂的过程。下图展示了这个过程
最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。
libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上,使得微信后端服务能同时hold大量请求,被誉为微信服务器稳定性的基石。libco在2013年的时候作为腾讯六大开源项目首次开源。libco源码地址。
本文希望能讲清楚一个Go程序从开始写下第一行代码到程序完全退出这期间都发生了什么事情,当然每个程序的执行逻辑千差万别,但这里想讲清楚的事情是所有程序都共通的事情,所有程序都需要经历的处理逻辑。
Kdump是在系统崩溃、死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。在第一kernel在运行的时候,系统内部在内存中就已经留存好了给第二kernel(捕获内核)的预留空间(这个预留空间的大小可以自己设定)。在第一kernelcrash的时候,就会进入第二kernel,在第二kernel中执行用户态程序makedumpfile对第一kernel的内存镜像进行裁剪和压缩,最后将第一kernel的vmcore保留在磁盘中并重启。
领取专属 10元无门槛券
手把手带您无忧上云