暑假的讲座已经进行了好几进程了,听学长们讲的知识,自己真的觉得未知的东西太多了,尤其是偏硬件的知识,所以大概记了学长说的重点,找资料查了查,方便更好的掌握知识.
静态链接库
静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。格式如:#pragma comment(lib,”XXX.lib”).
linux下的静态链接库:
linux下的静态链接库是*.a文件,与动态链接库.so对应。
linux下.a文件,如果编写了入口函数,也可以直接执行
静态链接库不同于动态链接库(.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为”静态链接”,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
共享库&&运行时库
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll”、”.ocx”(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库中,您无需重新生成或安装整个程序就可以应用更新。
*优点:
* 扩展了应用程序的特性;
*可以用许多种编程语言来编写;
*简化了软件项目的管理;
*有助于节省内存;
*有助于资源共享;
*有助于应用程序的本地化;
*有助于解决平台差异;
*可以用于一些特殊的目的。Windows 使得某些特性只能为 DLL 所用。
ABI
百度ABI
ABI,application binary interface (ABI),应用程序二进制接口。既然是 接口,那就是某 两种东西之间的沟通桥梁,此处有这些种情况:
应用程序 <-> 操作系统;
应用程序 <-> (应用程序所用到的)库
应用程序各个组件之间
类似于API的作用是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。
进程建立的步骤
1.创建内存空间(虚拟)
2.映射
3.确定入口
plt延时绑定
延时绑定的基本思想:函数在被第一次用到时才进行绑定(符号查找,重定位等),没有用到则不绑定。具体elf用plt实现。真正用到的函数_dl_runtime_resolve()
hash表
百度哈希表链接
哈希表根据关键码值(Key value)而直接进行访问的数据结构,提高了查找速度
进程地址空间
百度进程地址空间图解
所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从 Windows 2000 Server 开始,包括 Windows Server 2003)都有一个 boot.ini 开关,可以为应用程序提供访问 3 GB 的进程地址空间的权限,从而将内核模式地址空间限定为 1 GB。
访问进程地址空间的 AWE
内核
百度内核链接
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。