linux查看进程的方法
从C语言代码分析Linux系统是如何创建进程的?
从C语言代码分析Linux系统是如何创建进程的?
加载的具体过程
1. 打开文件 open_library(char* filename)
系统调用 open(): 创建 File 结构体 , 放入进程打开文件表 , 返回 ( 打开文件表 ) 下标
2. 读出文件头和程序头表 IsElfFormat(FILE)
读出 ELF 文件头 ( 同时读出了程序头表 Program Header Table), 判断 ELF 格式根据文件头中的e_ident 来比较判断 .
3. 加载文件 load_library(char * filename,int fd)
(1) 计算所有 segment 占用内存大小 get_lib_extents()
通过遍历程序头表 (Program Header Table), 算出所有 segment 将占用的内存大小extents_size
(2) 分配内存 alloc_mem_region(extents_size)
匿名映射一块非共享的私有内存 ( 不涉及文件 )
(3) 分配 soinfo 结构体 alloc_info(char *filename)
从全局静态 soinfo 结构体数组中分配 soinfo 结构体 ( 描述整个 ELF 文件 )
(4) 加载 segment
load_segment(int fd,void* header,soinfo*si)
(1) 可加载段 (PT_LOAD): 映射到内存
mmap(void * start,size_t len, int prot,int flags,int fd,off_t offsize)
把 ELF 文件 offsize 处的 segment 映射到已分配内存的 start 处
(2) 动态链接段
由动态链接节设置 soinfo 中的动态链接信息
(5) 设置 soinfo 结构体
4. 加载依赖的动态链接库
5.重定位(自身符号)
重定位表项: Elf32_Addr r_offset (重定位)内存地址(offset of relocation)
Elf32_Word r_info 符号表下标和类型(symbol table index and type)
符号表项: Elf32_Word st_name 符号名(name - index into string table)
Elf32_Addr st_value 符号值(symbol value)
Elf32_Word st_size symbol size
unsigned char st_info type and binding
unsigned char st_other 0 - no defined meaning
Elf32_Half st_shndx; section header index
根据重定位表(表项)查符号表,得到符号内存地址,修改(重定位)内存值
最后得到soinfo结构体数组描述了所有加载的文件
6.如果入口地址不为零,调用入口函数
在Linux中如何查找一个命令或进程的执行时间?
在Linux查找进程运行时间的方法,也很方便快捷,还是ps命令,和之前虫虫一个问答如何显示进程号类似。
top中的TIME
首先做为知识扩展说下top中的TIME 信息,上一个问答中说过通过top查看进程号的,那么可不可以也通过top显示进程时间。top命令中有个TIME 项是进程运行时间么?
回答是否定的,top进程现实中的TIME 项并不是进程运行时间,而是进程占用CPU的时间,多核的话,互相累加。所以这是参数不是进程运行时间,而是一个性能指标,占用CPU的时间,占用时间越久,处理的越久,说明进程越耗CPU,越系统资源。
ps 中的时间选项lstart,etime我们先看一下ps的帮助,man ps
其中和进程运行时间相关的两个参数有tart(start, start_time,lsstart)和etime(etimes),分别表示进程开始时间和持续运行的时间。
比如,我们对上面占用cpu时间很长的进程qemu-kvm,进程 2847查询这些时间,注意这些格式要以-o (output输出格式)来开头引出:
time命令,测试一个进程的运行时间在性能测试中还有常用的命令time,在time后紧跟着执行的命令,执行完后显示这次任务的执行时间cpu时间(包括总用户,用户态时间,内核态时间)
所以答案就是用ps ,好了今天回答就到这里,喜欢虫虫的回答,请给虫虫点赞。
关注虫虫有更精彩的技术文章和回答会奉上。