文件系统操作
整体架构
在文件系统和应用程序间有一层抽象层,称为虚拟文件系统(VFS)
- VFS作为抽象层向应用层提供了统一的文件接口(read,write等)
- VFS实现了一些公共的功能,如Directory Cache和Page Cache等
- 规范了接口
VFS向应用层提供统一接口,具体实现不同文件系统有不同实现,VFS将函数指针指向对应函数

核心操作
文件系统的注册
在Linux中,具体文件系统通常是一个内核模块,在内核模块被加载时完成文件系统的注册
磁盘挂载
正常寻址需要通过CHS三维向量,但是可以通过一位扇区编号编址
磁盘读写时间 = 寻道时间(选择柱面)+旋转时间(选择+读取扇区)+传输时间(磁生电活电生磁)
其中寻道时间占主导,故每次只读/写一个扇区是对于时间的浪费,故一次读/写多个扇区,称为块
上电自检
主板的固件(BIOS 或 UEFI)执行硬件检测,检查 CPU、内存、显卡、键盘等设备是否正常
加载 BIOS 或 UEFI
CPU 开始执行 0xFFFFFFF0
地址处的指令,该地址处是一条 JUMP
指令,这条指令清空了基址寄存器的值,并让指令跳回到 BIOS 开始处(物理地址为 0xF0000
,参考上图 0xF0000
处的标识)以执行 BIOS
BIOS 或 UEFI 固件初始化计算机硬件,完成底层配置。
确认引导顺序(启动顺序),如硬盘、USB 设备或网络启动。
加载引导程序(Bootloader)的第一部分,通常位于启动设备的引导扇区。
主引导记录(Master Boot Record, MBR)
BIOS 从指定的启动设备中读取主引导记录
启动加载器(Bootloader)
启动加载器是一个小型程序,负责加载操作系统内核(常用:GRUB多操作系统支持,配置灵活;Windows Boot Manager用于加载 Windows 操作系统)
内核初始化
操作系统内核接管硬件的控制。执行真正的根文件系统中的 /sbin/init
进程,即系统的 1 号进程。此后,系统的控制权就全权交给 /sbin/init
进程了
系统初始化
/sbin/init
进程是系统其它所有进程的父进程,当它接管了系统控制权后,它会根据 /etc/inittab
文件来执行相应的脚本,从而完成一系列的系统初始化操作
用户登陆
准备阶段:
运行阶段:
int fib(int n)
,应该翻译成计算数列第n项并返回数列的值拆解问题:考虑在当前的普通输入时,应该如何解决问题。例如对于斐波那契数数列求解,当前应该返回的值是fib(n-1)+fib(n-2)
。
❗️❗️不要尝试去思考其内部具体是如何执行的,只要把当前函数当作一个已经实现的库函数即可。否则只会越绕越晕。
编译时加上-g
选项
命令名称 | 命令缩写 | 命令说明 |
---|---|---|
run | r | 运行一个待调试的程序 |
continue | c | 让暂停的程序继续运行 |
next | n | 运行到下一行 |
step | s | 单步执行,遇到函数会进入 |
until | u | 运行到指定行停下来 |
finish | fi | 结束当前调用函数,回到上一层调用函数处 |
return | return | 结束当前调用函数并返回指定值,到上一层函数调用处 |
jump | j | 将当前程序执行流跳转到指定行或地址,不运行跳过的代码 |
p | 打印变量或寄存器值 | |
backtrace | bt | 查看当前线程的调用堆栈 |
frame | f | 切换到当前调用线程的指定堆栈 |
thread | thread | 切换到指定线程 |
break | b | 添加断点 |
tbreak | tb | 添加临时断点 |
delete | d | 删除断点 |
enable | enable | 启用某个断点 |
disable | disable | 禁用某个断点 |
watch | watch | 监视某一个变量或内存地址的值是否发生变化 |
list | l | 显示源码 |
info | i | 查看断点 / 线程等信息 |
ptype | ptype | 查看变量类型 |
disassemble | dis | 查看汇编代码 |
set args | set args | 设置程序启动命令行参数 |
show args | show args | 查看设置的命令行参数 |