主讲:陈香兰 助教:贾永泉、毛熠璐 xlanchen@ustc.edu.cn 3606864-83(西区电三421) Autumn 2007 Linux操作系统分析 主讲:陈香兰 助教:贾永泉、毛熠璐 xlanchen@ustc.edu.cn 3606864-83(西区电三421) Autumn 2007
程序的执行 xlanchen@2007.10.16
操作系统是如何通过可执行文件的内容建立进程的执行上下文的? 可执行文件的格式 程序以可执行文件的形式存放在磁盘上 库 可供很多程序使用的一些例程的集合 静态库 vs 共享库 命令行参数、环境变量等 Shell提示符下输入 从shell继承而来,用户可修改 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 提纲 可执行文件 可执行格式 Exec函数 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 可执行文件 可执行文件是一个普通的文件,它描述了如何初始化一个新的进程上下文 Fork + execve xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 命令行参数和shell环境 用户使用shell来执行某个程序时,可以指定命令行参数 例如:$ ls -l /usr/bin 列出/usr/bin下的目录信息 Shell本身不限制命令行参数的个数,但它受限于命令自身 例如,int main(int argc, char *argv[]) 又如, int main(int argc, char *argv[], char *envp[]) xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 命令行参数和环境串都放在用户态堆栈中 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 库 源文件目标文件可执行文件 最小的程序也会利用到C库 例如:void main(void) {} 要为main的执行建立执行上下文 在进程结束时,杀死进程(在main的最后插入exit()) 其他库 libm,包含浮点操作的基本函数 libX11,所有X11窗口系统图形接口的基本底层函数 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 静态链接 vs 动态链接 静态库 动态链接:共享库 Gcc的-static选项指明使用静态库 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 程序段和进程的线性区 在逻辑上,Unix程序的线性地址空间被划分为各种段(segment) 正文段,text 数据段,data Bss段 堆栈段 在mm_struct中都有对应的字段 start_code/end_code、start_data/end_data、start_brk/brk、start_stack、arg_start/arg_end、env_start/env_end xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 此外,还有共享库和文件的映射,他们映射在其他线性区 参阅/proc/1/maps了解init进程的线性区 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 可执行格式 Linux标准的可执行格式 ELF:Executable and Linking Format 旧版的可执行文件格式 a.out:Assembler OUT put format 其他 MS-DOS的exe文件 UNIX BSD的COFF文件 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems Linux对可执行文件格式的处理 在系统启动时,所有编译进内核的可执行格式都被注册 在系统运行过程中,也可以注册一个新的可执行文件格式 使用linux_binfmt对象管理 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems linux_binfmt 链表,连接所有linux_binfmt对象 通过读存放在可执行文件中的信息为当前进程建立一个新的进程上下文 动态的把一个共享库绑定到一个已经在运行的进程 将当前进程的上下文保存到名为core的文件中 xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems Linux通过可执行文件的扩展名或者存放在文件前128字节的magic数来识别文件格式 文件扩展名 Exe Bat … xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems Exec函数家族 指定被执行文件的路径名 用一个指定的可执行文件所描述的上下文代替进程的上下文 系统调用:execve sys_execve xlanchen@2007.6.25 Embedded Operating Systems
Embedded Operating Systems 作业 什么是线性区?列举4种最常见的线性区。 Linux如何描述进程的地址空间? xlanchen@2007.6.25 Embedded Operating Systems