linux下的dump时机

  ulimit 这个命令入手,这个是shell的内置命令

    现在看一下ulimits的实现

Ulimit –a 的时候直接调用系统函数

 

功能描述:
获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。


用法:
include <sys/time.h>
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);


参数:
resource:可能的选择有

RLIMIT_AS //进程的最大虚内存空间,字节为单位。
RLIMIT_CORE //内核转存文件的最大长度。
RLIMIT_CPU //最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。
RLIMIT_DATA //进程数据段的最大值。
RLIMIT_FSIZE //进程可建立的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。
RLIMIT_LOCKS //进程可建立的锁和租赁的最大值。
RLIMIT_MEMLOCK //进程可锁定在内存中的最大数据量,字节为单位。
RLIMIT_MSGQUEUE //进程可为POSIX消息队列分配的最大字节数。
RLIMIT_NICE //进程可通过setpriority() nice()调用设置的最大完美值。
RLIMIT_NOFILE //指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。
RLIMIT_NPROC //用户可拥有的最大进程数。
RLIMIT_RTPRIO //进程可通过sched_setscheduler sched_setparam设置的最大实时优先级。
RLIMIT_SIGPENDING //用户可拥有的最大挂起信号数。
RLIMIT_STACK //最大的进程堆栈,以字节为单位。

rlim:描述资源软硬限制的结构体,原型如下

struct rlimit {
    rlim_t rlim_cur; /* Soft limit */
    rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};

返回说明:
成功执行时,返回0。失败返回-1errno被设为以下的某个值
EFAULTrlim指针指向的空间不可访问
EINVAL:参数无效
EPERM:增加资源限制值时,权能不允许

ash.c  这样一个结构体数组 static const struct limits limits[]

逐一的从这个数组中取元素,逐一getrlimit 来获取系统资源限制

 

在内核中,每个进程的task_struct 都有这样一个结构体数组

current->signal->rlim

这个结构存放了所有的资源限制

也就是说程序在发生异常需要关闭的时候检测了相关的限制值

现在顺这这条线找到了生存dump的函数

Binfmt_elf.c 中的elf_core_dump

Binfmt_elf_fdpic.c 中的elf_fpdic_core_dump

 

static struct linux_binfmt elf_fdpic_format = {

               .module                              = THIS_MODULE,

               .load_binary       = load_elf_fdpic_binary,

#if defined(USE_ELF_CORE_DUMP) && defined(CONFIG_ELF_CORE)

               .core_dump        = elf_fdpic_core_dump,

#endif

               .min_coredump = ELF_EXEC_PAGESIZE,

};

 

static int __init init_elf_fdpic_binfmt(void)

{

               return register_binfmt(&elf_fdpic_format);

}

注册了一种称为fdpic elf 格式的二进制文件  

在注册结构体中设置了二进制文件的加载方法 dump方法

该方法的调用可以追溯到信号处理函数里。

 

因此linux上,当进程在运行过程中,出现了异常,产生了一个信号,

在信号处理过程中,如果发现该信号需要生存core文件就调用对应的二进制文件

dump生成函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值