首页 >

从C语言代码分析Linux系统是如何创建进程的? – 网络|

键盘桌面怎么设置,office慧办公怎么样,网上自己开商城怎么样从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.如果入口地址不为零,调用入口函数


从C语言代码分析Linux系统是如何创建进程的? - 网络|
  • 网传腾讯HC全部关闭,pcg缩减人数,真实性如何?如属实,这表明了,今年腾讯招聘的哪些情况? - 网络|
  • 网传腾讯HC全部关闭,pcg缩减人数,真实性如何?如属实,这表明了,今年腾讯招聘的哪些情况? - 网络| | 网传腾讯HC全部关闭,pcg缩减人数,真实性如何?如属实,这表明了,今年腾讯招聘的哪些情况? - 网络| ...

    从C语言代码分析Linux系统是如何创建进程的? - 网络|
  • 怎样把时间和日历放在屏幕上? - 网络|
  • 怎样把时间和日历放在屏幕上? - 网络| | 怎样把时间和日历放在屏幕上? - 网络| ...

    从C语言代码分析Linux系统是如何创建进程的? - 网络|
  • 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? - 网络|
  • 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? - 网络| | 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? - 网络| ...