inode
inode用于管理文件属性和内容
一个文件只能有一个inode,一个inode可以对应多个文件名
Linux进程中,打开的每一个文件都有对应的文件inode属性和文件页缓冲区(内存和磁盘的缓冲区)
软硬链接
硬链接
多个文件指向同一个inode时,inode就有多个计数,这几个文件实质上是同一个文件
删除时inode计数不为0,这个inode管理的文件内容就不会释放
软链接
链接指定文件时,产生独立的inode
删除源文件,软链接失效
为什么软链接可以跨文件系统链接,但是硬链接不可以?
因为软链接是独立的inode,里面存有源文件的路径
动静态库
静态库
一般只在如下情况使用静态库
1、static修饰
2、只提供静态库
为什么 -I 引用头文件时不需要绝对路径,但是在链接 -L 却需要绝对路径?
这两者都是需要绝对路径的,预处理阶段头文件展开,是需要在系统路径下找的
引用头文件只是告诉编译器去哪条路径下找,绝对路径写在了main.c中
库名称是libmymath.a 为什么链接时却是mymath?
链接库时去掉前缀和后缀
动态库
为什么动态库找不到?
链接时告诉了编译器动态库在哪里,但系统不知道(加载器),所以在加载时找不到动态库
为什么静态库能找到?
静态库是直接拷贝到可执行程序
找不到静态库解决方法
Linux进程可以共享动态库 --共享库
所以动态库可以节省内存和磁盘空间
动态库是怎么被加载的?
进程地址空间中的共享区内容通过页表映射在物理内存中,通过映射,之后执行的代码都会在进程地址空间中执行
系统在运行多个库时,会对多个库进行管理(先描述,在组织)
地址问题
程序没加载前
在函数入口处的地址是虚拟地址
程序加载后
CPU运行函数入口(虚拟地址)后,通过进程页表映射到物理内存,CPU看到的是虚拟地址,他不需要直接关心物理地址
共享库大了,具体映射在哪里?
动态库是不可能加载到固定的地址空间位置
库可以在虚拟内存任意位置加载,让自己内部函数不采用绝对编址,只表示在库中的偏移量就可以