好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
主要介绍一些操作系统的基本知识,简述了设备驱动、操作系统、虚拟空间、物理空间、页映射、线程等基本概念。
使用gcc编译程序生成目标文件中,经历了四个过程:预处理、编译、汇编、链接
可执行文件格式:PE(windows下的Portable Executable)、ELF(linux下的 Executable Linkable Format),都是COFF(Common file firmat)格式的变种
动态链接库(DLL,Dynamic Linking Library,windows下的.dll和linux下的.so)和静态链接文库(Static Linking Library,windows下的的.lib和linux下的.a)文件已 ELF 格式存储。
linux下可用 file 指令查看文件格式
ELF文件结构:代码段、数据段、BSS段、文件头、段表、重定位表、字符串表、符号表、调试表
空间与地址分配、符号解析和重定位
因为基于Linux开发,windows相关的暂时跳过
操作系统装载程序到内存:覆盖装入和页映射
静态链接会浪费内存和磁盘空间、模块更新困难
静态链接是链接时重定位,动态链接是装载时重定位
地址无关代码(PIC):解决共享对象指令中对绝对地址的重定位问题
延迟绑定(PLT):当函数第一次被调用时才进行绑定
ldd:查看程序依赖库
readelf:查看ELF结构相关信息
objdump:打印对象信息
共享库版本命名:libname.so.x.y.z(主版本号x(重大升级,不兼容其他版本),次版本号y(增量升级),发布版本号z(修正、改进))
SO-NAME:只保留主版本号的共享库名
链接名:即libname.so.x.y.z中的name
LD_LIBRARY_PATH:改变某程序的共享库查找路径
LD_PRELOAD:指定预先装载的一些共享库或目标文件
LD_DEBUG:打开动态链接器的调试功能
跳过
调用惯例:约定的函数调用方式
程序运行步骤:操作系统创建进程,把控制权交给程序入口(一般是运行库中某个入口函数);入口函数对运行库和运行环境进行初始化,包括堆、I/O、线程、全局变量构造等;入口函数完成初始化后,调用main函数,执行程序主体部分;main函数执行完毕后,返回入口函数,进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程
线程私有存储空间:栈、线程局部存储、寄存器
CRT(C语言运行库):启动与退出、标准函数、I/O、堆、语言实现、调试
系统调用:应用程序与操作系统内核之间的接口
主要讲 Mini CRT的实现