Linux 基础IO(2)磁盘文件

1.磁盘文件

在这里插入图片描述
在这里插入图片描述

  1. 扇区:整个盘片分成不同的区块,每一个区块就是一个扇区。
    扇区是磁盘IO的基本单位,一般为512Byte4KB,一般磁盘都是512Byte
  2. 磁道:同一半径一圈区域是磁道

磁盘读写依靠的是磁头,盘面高速旋转,磁头来回摆动。
首先,确定在那个盘面,也就是磁头 head
其次,磁头来回摆动定位磁道 cylinder
然后,盘面高度旋转定位扇区 sector
这样在就可以定位在哪个盘面,哪个磁道的哪个扇区
这样的方法叫做CHS定址法

2.文件系统

扇区是磁盘IO的基本单位,把整个磁盘想象成一个数组,每个元素就是一个扇区,节点下标就是这个扇区的编号
在这里插入图片描述
OS认为一次访问一个扇区,单位太小了,所以操作一次读取4KB的数据块(8个扇区)
在这里插入图片描述
同时,我们把这种地址叫做逻辑区块地址(LBA)

LBA地址怎么转换成CHS呢
首先,设当前LBA = n, 将LBA地址转换为扇区编号区间[8 * n, 8 * n + 7]
扇区编号转CHS:

  1. 盘面c = x / 一个盘面的扇区个数 x %= 一个盘面的扇区个数
  2. 在哪个磁道:x / 一个磁道上扇区个数
  3. 在哪个扇区 : x % 一个磁道上扇区个数

我们使用笔记本/台式机经常会听到分区,但实际上我们的硬盘不会被分成几块,只是划分成了几个区域
在这里插入图片描述
在这里插入图片描述

1.Boot Block(启动块):它的大小是确定的,即1KB,用来存储磁盘分区信息和启动信息。Boot Block的主要作用是引导计算机启动,将操作系统载入内存中
2. inode Table:存放文件属性,如文件大小,所有者,最近修改时间等
3. inode Bitmap:比特位的位置表示第几个inode,比特位的内容表示该inode是否被使用
4. Data blocks:存放文件内容
5. Block Bitmap:比特位的位置表示块号,比特位的内容表示对应的块是否被使用
6. GDT(Group Descriptor Table):块组描述符,描述块组属性信息,管理分组
7. Super Block:存放文件系统本身的结构信息,管理分区

linux系统中每个文件都有它对应的inode,OS只认inode。每个inode占128Byte, inode分区内唯一。
linux中,文件内容和属性分开存储,文件名不属于文件属性。
目录本身也是一个文件,拥有自己的inode和数据块,数据块中保存的是当前目录下的文件名和文件inode的对应关系。
对一个文件,进行增删查改都和文件所处的目录有关系,所以在内核中,都要逆向递归般得到/,从根目录开始进行路径解析
所以之前权限时讲到目录的权限,如果没有r,就无法读取目录下的文件,本质就是无法访问目录数据块的内容,如果没有w,就无法修改当前目录下的文件,因为无法增加或删除或更改存储在目录数据块中的文件名和inode的映射关系。

3.软硬链接

1.软链接

在这里插入图片描述
软链接本质是一个独立的文件,有独立的inode和数据块,软链接的内容中存放着目标文件的路径,相当于快捷方式
可以为目录建立软连接
在这里插入图片描述

2.硬链接

在这里插入图片描述
硬链接的本质是在指定目录下插入新的文件和和inode的映射关系,同时让inode的引用计数(硬链接数)++
在这里插入图片描述
我们不能为目录建立硬链接,除非操作系统自己建立
在这里插入图片描述
一个目录下有多少个子目录:硬连接数 - 2

4.动静态库

在Linux下,静态库的后缀是 .a,动态库的后缀是 .so
在Window下,静态库的后缀是 .lib,动态库的后缀是 .dll
libc.so库名去掉前缀lib,去掉后缀.a/.so就是库的名字

1.静态库

生成静态库
生成.o文件:在这里插入图片描述
打包生成静态库:在这里插入图片描述
ar:打包 -r:replace -c:create
使用静态库:在这里插入图片描述
gcc 选项: -l:指定库名 -L:指定库路径 -I:指定头文件路径
静态库编译生成成功,运行时就不需要了
在这里插入图片描述

库搜索路径:
-L指定目录下
系统指定目录下/usr/lib

2.动态库

生成.o文件:在这里插入图片描述
gcc 选项: -fPIC:生成与位置无关码
打包生成动态库:在这里插入图片描述
使用动态库:
在这里插入图片描述
运行:在这里插入图片描述
运行时报错:无法找到动态库,所以动态库在编译时需要给gcc/g++搜索路径,同时运行时需要给OS搜索路径
解决方法:

  1. 拷贝.so到系统共享库路径下
    在这里插入图片描述
  2. 更改LD_LIBRARY_PATH环境变量
    将不在系统默认库搜索路径下的库的路径,添加到LD_LIBRARY_PATH
    缺点:bash重启之后需重新配置
    在这里插入图片描述
  3. 在系统库的默认搜索路径下添加软链接
    在这里插入图片描述
    在这里插入图片描述
  4. 系统配置文件/etc/ld.so.conf.d/
    在这里插入图片描述
    ldconfig:让配置文件生效

静态库:程序在编译链接时把库的代码复制到可执行文件中,程序运行时不再需要静态库
动态库:程序在运行时动态链接动态库的代码,多个库共享使用库的代码

  1. 同时提供静态库和动态库,gcc默认使用动态库
  2. 同时提供静态库和动态库,要静态链接,必须使用-static选项
  3. 只提供静态库,可执行程序只能对该库进行静态链接,但程序不一定是静态的,可能会动态链接其他库
  4. 只提供动态库,要静态链接,会发生链接报错
  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRBORRR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值