当前位置: 首页 > news >正文

【文件系统】


一. 磁盘的物理结构

  • 机械硬盘内部有一个或多个高速旋转的盘片,盘片一般由铝合金或玻璃等材料制成,表面涂有一层磁性材料。盘片被划分成许多同心圆,这些同心圆被称为磁道。每个磁道又被进一步划分为多个扇区,扇区是磁盘存储数据的最小单位,通常每个扇区的容量为 512 字节或 4KB。
  • 磁头是机械硬盘中用于读写数据的部件,它通过电磁感应原理来实现数据的读写。当需要读取数据时,磁头会感应到盘片上磁性材料的磁场变化,并将其转换为电信号,然后传输给计算机的其他部件进行处理。写入数据时,磁头会根据要写入的数据内容,产生相应的磁场,改变盘片上磁性材料的磁化状态,从而将数据记录在盘片上。

二. 文件系统

  • 文件区:保存所有文件内容的数据。记录要保存所有文件内容的块号,块号*8就是该文件的起始扇区,然后就可以转化成CHS地址。
  • 块位图:文件区有多少个块,块位图就有多少个比特位,文件区中哪个块保存了数据对应的比特位就为1。(1kb=1024B(字节)=8*1024bit(比特))
  • i节点表:保存所有文件属性,文件大小、所有者、最近修改时间。文件属性类型都是一样的,只不过属性类型对应的值不一样,Linux中文件属性定义成结构体变量struct inode,inode类型的结构体变量大小一般为128B。(4*1024)/128 = 32所以1个块可以存储32个文件的属性。
struct indoe
{
    int size;
    ...
    int inode_number;
    int databack[N];
}

inode位图:一个比特位对应一个inode。

  • ll -li xxx:查看inode中文件标识,也就是inode_number。

在磁盘中存储的文件属性和内容都没有存储文件名,但是在用户层是输入文件名,Linux内核如何做到的?

     在Linux中目录是文件,Linux将目录下文件名和inode编号的映射关系作为目录文件的内容存储到磁盘中,Linux内核通过inode编号找到该文件属性在磁盘中存储的数据,indoe结构体中的databack数组存储的是该文件所有的块号,将块号转换成CHS地址,然后就能够读取到文件数据。

目录去掉’r’权限,读不到目录文件中的文件名与inode编号的映射关系,也就在磁盘上无法找到该文件;

目录去掉’w’权限,无法向目录文件中写入文件名与inode编号的映射关系,也就无法新建文件。

  • 要想找到myshell文件就得知道"myshell"与inode编号映射关系,所以要先找到linux文件,要想找到linux文件先要找到qian文件,要想找到qian文件先要找到home文件,想要找到home文件就要先找到根目录,根目录的inode编号是操作系统设计是制定好的。

三. 软硬链接

3.1软链接

Linux中的软链接和Windows中的快捷方式一样,将软链接文件删除,目标文件不会受影响,因为软连接文件是独立的文件,有自己的inode编号,软链接文件内容是目标文件的路径字符串。但是将目标文件删除,软链接文件会受影响。

软链接意义:可执行程序所处路径很复杂不易找到,这时就可以通过软连接链接目标文件,直接运行软链接文件。

3.2硬链接

硬链接是该目录文件中添加一个新的文件名与目标文件inode编号的映射,目标文件的文件属性struct inode{};中引用计数++。删除目标文件还是硬链接文件并不会互相影响,只是struct inode{};中的引用计数会–。

3.2.1硬链接的意义

dir目录文件引用计数是3,".“代表当前目录,当cd. 时就是要打印dir目录文件内容。”…"代表上级目录,进入到dir下的a目录中,cd…就是要打印dir目录文件内容。在dir目录文件中添加’.‘与dir目录文件inode编号建立映射关系,在dir目录下的a目录文件添加’…'与dir目录文件inode编号建立映射关系。

  • Linux系统自己可以给目录建立硬链接,但不允许用户给目录建立硬链接,防止路径成环。

四. 动静态库

  • ldd 可执行文件:查看该可执行文件中使用到哪些动静态库

Linux:.so(动态库) .a(静态库)

Windows:.dll(动态库) .lib(静态库)

在软件开发中,库是预先编译好的代码集合,供其他程序调用,有了库可以提高开发效率。动态库在程序运行时才被加载到内存中,并且可以被多个程序共享使用。与之相对的是静态库,静态库在编译时就被完整地复制到可执行文件中。

4.1静态库

  • 制作静态库时库名以lib为前缀+名字+.a为后缀

将头文件拷贝到头文件的搜索路径中,库文件拷贝到库文件的搜索路径中

  • 将头文件拷贝到头文件搜索路径下、库文件拷贝到库文件的搜索路径下

  • 已经将头文件拷贝到头文件搜索路径下、库文件拷贝到库文件的搜索路径下,这里的mylib安装包就可以删掉

  • mystdio.h和mymath.h已经是系统文件,所以包含头文件时用’<>'包含

编译链接

  • gcc、g++默认是认识C/C++库,但不认识第三方提供的库,编译器编译时-l+名字,告诉编译器指定到那个库中去找

对于第三方提供的库不建议安装到系统路径中。卸载库(删除相关文件)

  • -I:指定用户自定义头文件路径
  • -L:指定用户自定义哭所在路径
  • -l:指定是哪个库

4.2动态库

4.2.1制作动态库

制作动态库中编译.c文件

动态库打包

4.2.2使用动态库

  • 编译时不仅要指明头文件和动态库路径,而且运行程序时需要找到动态库加载并运行,所以也要指明动态库路径。

将第三方提供的动态库安装到系统路径中,一般不建议这样做,会影响系统的健康状态

卸载第三方提供的动态库

  • 如果卸载了相关动态库,很多相关程序也不能运行

在lib64目录下建立同名的软链接文件

  • 是在lib64目录下新建软链接文件,所以需要管理员权限

LD_LIBRARY_PATH环境变量是系统用来查找动态库路径,将第三方提供的动态库路径添加到LD_LIBRARY_PATH环境变量中,这只是暂时的,因为修改的是内存变量。

将第三方提供的动态库路径添加到配置文件中

  • 在家目录中存在一个.bashrc的一个用户级配置文件

在/etc/ld.so.conf.d目录下存在系统级的配置文件,在该目录下新建配置文件,将动态库的路径写入到新建的配置文件中。

这里只是添加了配置文件,并没让改配置文件生效

  • ldconfig命令使配置文件生效

相关文章:

  • C语言for循环语句的用法(非常详细)
  • Ubuntu 源码安装 Qt5
  • 报错E0513:不能将 “const wchar_t *“ 类型的值分配到 “LPWSTR“ (aka “wchar_t *“) 类型的实体
  • 【性能测试入门_01性能测试jmeter基础实操场景详解】
  • # 如何确认elementary os (linux)使用的是Wayland而不是x11?
  • TCP连接过程图解
  • Android Compose是如何使用什么架构,多个Activity?还是Fragment?compose的ui又是如何卸载和挂载的呢?
  • 【day10】智慧导览:学习LBS定位精度标准
  • markdown转docx
  • Java基础关键_020_集合(四)
  • 电网电压暂态扰动机理与工业设备抗失压防护策略研究
  • 【SpringBoot】深入剖析 Spring Boot 自动装配原理(附源码与实战)
  • 内存检测工具——Qt Creator
  • git使用命令总结
  • python总结(3)
  • QT工程打开、编译、运行流程
  • Netty基础—2.网络编程基础三
  • Dify平台训练个人文档助手
  • 2024年群智能SCI1区TOP:混沌可行性恢复粒子群算法CEPSO,深度解析+性能实测
  • 20250212:linux系统DNS解析卡顿5秒的bug
  • 王毅谈中拉命运共同体建设“五大工程”及落实举措
  • 中国巴西关于乌克兰危机的联合声明
  • 习近平举行仪式欢迎巴西总统卢拉访华
  • 视频丨美国两名男童持枪与警察对峙,一人还试图扣动扳机
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税