首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux Kdump 机制详解

核心分为两部分: kexec_file_load()/kexec_load() 负责起始时就把备份 kernel 和 initrd 加载好到内存。...以下是 elf core 文件大致格式: 可以看到 elf core 文件只关注运行时状态,所以它只有 segment 信息,没有 section 信息。...准备 elf header (运行在 normal kernel) 系统发生故障时状态是很不稳定,时间也是很紧急,所以我们 normal kernel 中就尽可能早把 /proc/vomcore... kexec_tools 使用 kexec_file_load() 系统调用加载 crash kernel 时,就顺带把 /proc/vmcore elf header 需要大部分数据准备好了:...) 接收 elfheadr (运行在 crash kernel) carsh kernel 中首先会接收到 normal kernel cmdline 中传递过来 vmcore 文件 elf

5.8K20

MIT 6.S081 (BOOK-RISCV-REV1)教材第三章内容 --

---- 代码:exec ELF文件格式 本节内容参考: 程序员自我修养,装载,链接与库一书 ELF文件格式: 计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件...ELF文件段结构就是由段表决定,编译器、链接器和装载器都是依靠段来定位和访问各个段属性。 段ELF文件位置由ELF文件“ e_shoff ”成员决定。...exec函数执行步骤: 第一步是快速检查文件可能包含ELF二进制文件。...ELF二进制文件以四个字节“幻数”0x7F、“E”、“L”、“F”或ELF_MAGIC开始(*kernel/elf.h*:3)。如果ELF头有正确幻数,exec假设二进制文件格式良好。...xv6旧版本中,用户地址空间也包含内核(但在用户模式下不可读写),用户可以选择一个与内核内存相对应地址,从而将ELF二进制文件数据复制到内核中。

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

【Linux】动态库与静态库底层比较

但是对应方法并没有可执行程序中,所以动态库是怎样被调用呢?又是什么时候被调用呢? 动态库也会写入到内存中,并通过映射到地址空间中共享区。让调用时候通过共享区来找到对应方法实现。...其他可执行文件相要调用动态库中方法是,也可以通过来映射就可以。所以动态库只需要在内存中存在一份 有个问题:我们可执行程序,编译成功之后,如果没有加载运行,二进制代码中有没有对应“地址”?...我们之间看源代码不用加载运行,就可以想象着一步一步运行我们程序! 我们介绍一下ELF格式程序,二进制是有自己固定格式elf可执行程序头部储存这可执行程序属性!...可执行程序会变成无数条汇编语句,每条汇编语句都有对应地址!那这个地址是什么地址,又是如何进行编址呢?当前环境当中就是从000000... 到 ffffff......所以同样,与加载可执行程序类似,会把动态库读入内存中,并建立对应映射,**动态库虚拟地址进程地址空间里是共享区里

18310

Linux crash分析简明参考

kdump上,并由其将崩溃前一刻内存镜像保存到本地或者远程文件中(根据设置不同).我们拿到这个文件,可以将其拷贝到分析机上.分析机环境包括操作系统版本,可以与生产系统不同.但是分析机上,我们要安装上与...linux-crashdump 安装过程中会有一些选项要你确认.2) 修改配置文件修改 /etc/default/kexec,设置LOAD_KEXEC=true修改/etc/default/kdump-tools...文件,这种情况建议客户保留当前状态,提单给后台.腾讯云平台软件可以通过给CVM发送命令触发panic尝试生成coredump.但是在这种情况下,需要确保sysrq配置是打开.可以运行如下命令设置:echo.../crash-7.3.2makemake installcrash依赖于gdb,安装过程中会自动下载对应版本gdb进行安装.有了crash工具,我们要做第一步就是确定vmcore中OS所用内核具体版本号...用rpm -ivh *.rpm命令先安装kernel-debuginfo-common这个软件包,安装kernel-debuginfo软件包.安装完毕后会有一个vmlinux文件,例如我们这里如下位置可以找到

1.5K00

“垫底”逆袭!从一次错误中转换思路迎来破局

手写汇编 + 手动构造 ELF 文件头拼接可执行文件,大家也懂 ELF e_ident 末尾和 p_paddr 都可以随意塞数据,这里我塞进了一个常数 PI 。...最后一个块需要进行一些处理,可以 ELF 头中设定可写,然后代码段直接写。 MD5 内部状态直接预处理前 n-1 个块,塞进程序末尾;程序只需要求最后一个块即可。...,此时覆盖了 case0 结果 看看是否符合 case1 条件,是的话跳出 ...同理这样可以把比较+跳入+跳出变成只有比较+跳出。... 2 中我们读进了两个 64bit 状态,但 MD5 计算都是 32bit 呀,怎么办?没关系,几乎所有计算指令都支持给一个操作数先移位再计算。...不过赛后看了别人思路发现这里其实是可以通过碰撞成只有数字来减少更多代码。 剩下还有些微优化,比如反着输出来少两次 write 传参,加法不考虑进位通过随机调整程序来撞出一个正确答案等等。

51220

从创建进程到进入main函数,发生了什么?

操作系统内核将负责进程创建,主要有下面几个工作要做: 创建内核中用于描述进程数据结构,Linux上是task_struct 创建新进程目录、,用于构建新进程内存地址空间 Linux内核中...我们使用C、C++等高级语言编写代码,最终通过编译器会编译生成可执行文件Linux上,是ELF格式,Windows上,称之为PE文件。...前面提到,子进程是通过sys_execve系统调用进入到内核中,在后面完成可执行文件分析,拿到了ELF文件入口地址,将会去修改原来保存在堆栈上上下文信息,将EIP指向ELF文件入口地址。...另外需要提一下是,Linux上,除了ELF文件,还支持一些其他格式可执行文件,如MS-DOS、COFF 除了二进制可执行文件,还支持shell脚本,这个情况下将会将脚本解释器程序作为入口来启动...\n"); return 0; } 通过gcc编译,生成了一个ELF可执行文件,通过readelf指令,可以实现对ELF文件分析,这里可以看到ELF文件入口地址是0x400430: ?

1.4K30

linux进程虚拟空间布局

linuxx86_64经典布局如下图                     x86_64 64位处理器进程地址空间布局 用户空间分区一致,区别就是地址空间变大了,内核空间取消了高端内存,因为内核空间地址空间完全可以访问全部物理内存...下面以32位处理器为例看linux内核如何建立用户进程空间内存布局,fork调用是复制父进程struct mm_struct内存描述符不需要重新建立布局,而建立新内存布局是通过加载二进制可执行文件...execve函数族加载可执行文件是将当前进程镜像替换为新进程映像,我们看一下linux加载二进制文件建立布局流程,只分析内存布局代码,其它会专门写一篇二进制文件加载分析。    ...段结束地址 if (k > elf_brk) elf_brk = k; //堆起始地址 } //确定最终各段地址,load_bias动态链接时有用到,暂不分析...文件加载写不详细,会单独写一篇elf文件加载详细过程。

2.3K20

eBPF 概述:第 4 部分:嵌入式系统运行

/Makefile open-example.go:这是建立 gobpf/elf 之上 eBPF ELF 加载器。...它只依赖于 libc 并且可以被复用来加载多个 eBPF ELF 文件运行多个跟踪。 open-example.o:这是编译 eBPF 字节码,将在内核中加载。...“open-example” 和 “open-example.o” ELF 二进制文件可以进一步合并成一个;加载器可以包括 eBPF 二进制文件作为资产,也可以像 tcptracer 那样在其源代码中直接存储为字节数...加载器:这是编译过 open-example 二进制文件,包含 gobpf/elf 加载器模块。只要它运行,数据就会被添加到跟踪缓冲区中。...makefile,并验证产生二进制文件已经被正确地交叉编译: [adi@iwork]$ file open-example* open-example: ELF 32-bit LSB executable

37710

详解共享库动态加载

写这篇文章是为了消除我该主题上知识欠缺,以便成为一名更好程序员。我希望它也能帮助您变得更好。 什么是共享库 库是一个包含编译代码和数据文件。...要回答这些问题,我们将不得不更深入地研究这些文件结构。 ELF - 可执行和可链接格式 共享库和可执行文件格式称为ELF(可执行和可链接格式)。...总之,ELF文件包含: ELF Header 文件数据,可能包含: 程序header(段头列表) 段头(列表章节标题) 以上两个标题指向数据 ELF标头指定程序标头中段大小和数量,以及节标头中段大小和数量...每个这样都由固定大小条目组成(我使用该条目适当中描述段标题或节标题)。条目是标题,并且包含指向该段或节实际主体位置指针(文件偏移量)。该主体存在于文件数据部分中。...在他们:因为我们感兴趣是这个文件特定部分,我解释这个程序头ELF文件可以有(和共享特别库必须具有)段头一个描述段型PT_DYNAMIC。

3K20

Linux上一个恶意程序分析实例:一步一步揭开病毒程序面纱

因此面对这种没有后缀二进制文件,我们首先要做是搞清楚它是什么文件。...最常用方法是读取文件开头一定数量数据,然后检验这些数据是否满足特定文件格式,例如ELF文件头64字节是ELF头,是一种固定格式二进制数据,特别是如果我们读取前64字节后发现它包含ELF对应magic...这回不难看到ctf文件其实就是一个ELF类型可执行文件,注意到输出内容最后有一个stripped,这表明该执行文件符号被专门剥离了,其目的很明确,如果它包含符号,那么代码就很容易被别人通过符号进行调试解析从而完全掌握该程序运行机制...这就需要我们读取67b8601里面的二进制数据,同时查看过程中要注意从哪里开始,数据模式能够与ELF头部64字节数据结构匹配上。...上读取文件数据工具,count表示要读取数据长度,if对应要读取文件名,of对应数据读取写出文件名,bs对应读取单位,当前表示单位为1字节,上面代码运行本地目录就会多出一个叫elf_header

1K10

内核级木马与病毒攻防:Linux可执行文件ELF格式描述

ELF文件主要有以下几种类型,ET_NONE表示该文件作用未知;ET_REL表示重定向文件或叫目标文件,它们将会被链接并加装到某个指定虚拟内存位置,常见以.o结尾二进制文件就属于这种类型。...通过程序表头中e_phoff可以获得该表头ELF文件偏移,其二进制数据结构如下: typedef struct { uint32_t p_type; (segment type) Elf32...ELF格式可执行文件概念上由各种”段“组成,例如用于存储代码文本段,用于存储数据数据段等,这些段数量和相关信息就由程序表头来描述,加载运行ELF可执行文件时,系统会读取程序表头,获得各个段信息...,将段对应内容加载到内存,这样可执行文件才能变成可以运行进程,我们可以使用命令readelf -l 来读取程序表头内容,具体情况如下: ?...首先是.text段,它包含代码经过编译可执行二进制指令,.rodata段包含只读数据,代码中写死字符串,例如printf(“hello world”)中”hello world”就包含在该段。

1.5K10

鸿蒙轻内核四大基础功能介绍

- exec execl 执行指定elf格式用户程序文件。 - execle 执行指定elf格式用户程序文件。 - execlp 执行指定elf格式用户程序文件。...- execv 执行指定elf格式用户程序文件。 - execve 执行指定elf格式用户程序文件。 - execvp 执行指定elf格式用户程序文件。...- execexecl执行指定elf格式用户程序文件。-execle执行指定elf格式用户程序文件。- execlp执行指定elf格式用户程序文件。...- execv执行指定elf格式用户程序文件。- execve执行指定elf格式用户程序文件。- execvp执行指定elf格式用户程序文件。...MREMAP_FIXED:mremap()接受第五个参数,void *new_address,该参数指定映射地址必须对齐;new_address和new_size指定地址范围内所有先前映射都被解除映射

87742

Metasploit PayloadLinux平台免杀

shell脚本生成器包含可以更改变量名称,以使用喜欢组合和自动生成二进制文件进程。 确保将以下脚本放置metasploit-framework路径中,并使其可执行。...第一个测试场景中,我们将在Ubuntu 18.04(x86_64)上使用Eset NOD32 4.0.90: ?...接着,我们将有一个生成测试payloads列表,我们将通过SCP向带有LinuxAV远程机器提供这些payloads。我们测试中,我们生成了47个可执行文件。...执行完成,我们会看到有一些文件被完整地保留了下来,其中一些文件将无法正常工作,还有一些文件则仍可以正常工作,我们将在下一步进行测试……我们有27个文件被保留了下来。 ?...因为我们VM运行系统是64位,所以让我们来看看那些x86_64payloads。

1.3K30

MIT 6.828 操作系统工程 lab3A:用户环境和异常处理

线程主要由保存寄存器(env_tf字段)定义,地址空间由 env_pgdir 指向目录和定义。要运行环境,内核必须设置CPU、保存寄存器和相应地址空间。...因为我们还没有文件系统,所以我们将设置内核以加载嵌入在内核本身中静态二进制映像。JOS将此二进制文件作为ELF可执行映像嵌入内核。...env_create() 使用 env_alloc 分配环境,然后调用load_icode将ELF二进制文件加载到其中。 env_run() 启动以用户模式运行给定环境。...hello二进制文件,直到使用该int指令进行系统调用为止。...x86上,两种机制可以共同提供这种保护: 中断描述符 任务状态段 异常和中断类型 x86处理器可以在内部生成所有同步异常都使用0到31之间中断向量,因此映射到IDT条目0-31。

64820

Linux可执行文件与进程虚拟地址空间

一个可执行文件包含可被CPU执行指令和待处理数据,上CPU之前,指令和数据全部被翻译成成二进制形式。可执行文件内部,划分出了一些专门段,如代码段,数据段,BSS段等。...通过readelf -S name.elf可以查看ELF可执行文件节头,这里面有所有节信息 ? 将目标文件链接成可执行文件时候,链接器会尽量把相同权限属性段分配在同一空间。...可以使用命令 readelf -l name.elf来查看ELF段。ELF程序头,保存着segment信息 ? 最下面是是段与节归属关系: ?...所以将目标文件链接成可执行文件时候,链接器会尽量把相同或相似权限属性section分配在同一空间,程序头中,将一个或多个属性类似的section合并为一个segment,然后在装载时候,将这个...FileSiz表示segmentELF文件中所占大小,MemSiz表示segment进程虚拟地址空间中所占大小。

4.2K30

手把手撸PHP扩展 0x00: 编写config.m4文件

编写config.m4文件 这是一个系列文章,会逐步带大家去实现一个PHP协程扩展。我们把这个扩展叫做study。 首先,我们需要去生成扩展基本目录。...我们可以PHP源码里面找到一个工具叫做ext_skel(extension skeleton缩写,生成扩展骨架意思)。它可以帮我们生成扩展目录。这里不进行介绍。...生成扩展目录,我们需要去复制一份Swoole扩展目录下thirdparty/boost。...boost/asm) fi 内容很长,我们慢慢来看: AS_CASE([$host_os], [linux*], [STUDY_OS="LINUX"], [] ) 这段是用来判断我们机器所使用操作系统是什么类型...这个是执行make install时候会进行复制。我们待会会看到。 PHP_REQUIRE_CXX() 因为,我们使用了C++,所以我们需要指明一下。

1.5K30

xv6(17) 进程三:代码部分

$ 时此步骤无用) 复制父进程数据、创建“新” 复制文件描述符 修改进程结构体属性。...ELF 文件讲述了一定 $elf$ 文件,本文就不赘述了。...用户级上下文 $trapframe$ $eip$ 已经修改为 $elf$ 入口点 用户栈指针已经修改为新用户栈顶 切换到了新页,旧已经释放,就可以看作虚拟地址空间。...0-4KB } $inituvm$ 所做事情具体如下: 分配一物理内存清零 将这物理内存映射到虚拟地址空间 $0-4KB$ 将二进制初始化程序加载到 $0-4KB$ 这个区域 $exec$...里面我们是加载 $elf$ 文件可装载段,这里初始化 $initcode$ 程序在编译时候没有编译成 $elf$ 可执行文件,而是编译成了只有机器码二进制文件,没有多余信息,可以直接加载到内存运行

33710

听GPT 讲Rust源代码--compiler(23)

文件针对x86_64架构Windows操作系统上运行gnullvm编译器进行配置。 它涵盖了目标平台各种特性和属性,以便Rust编译器可以针对该平台正确地生成二进制文件。...通过这些目标规范,Rust编译器可以特定目标环境下生成与之匹配目标代码,以保证编译程序该环境下能够正确运行。...定义链接选项:通过定义目标二进制文件格式、入口点、链接脚本等选项,将编译生成目标文件链接为可执行 ELF 二进制文件。同时,还可以指定链接器需要链接系统库、C 运行时库以及其他必要依赖项。...,定义了编译器和链接器选项,并为 Rust 程序特定 RISC-V 平台上生成适用 ELF 二进制文件提供支持。...这个文件确保Rust编译器生成代码符合Fuchsia操作系统ABI规范,以便正确地与Fuchsia库和系统进行交互。 配置链接器:链接器是将编译代码和库组装成可执行文件工具。

5910
领券