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