1 文件IO_读写函数
在Linux系统中,一切都是"文件":普通文件,确定程序,网络通信等,所有的操作,都是通过”文件IO“来操作的,所有必要掌握文件操作的常用接口。
1.1 文件从哪里来?
Linux 的文件既可以是真实保存到存储介质的文件也可以 是自身内核提供的虚拟文件,还可以是设备节点。
2.2 如何访问文件?
利用通用的IO模型:open / read / write / lseek / close
如何知道这些函数的用法?
Linux中有3大帮助方法:help , man , info
help只能用于查看某个命令的用法。而man手册既可以查看命令用法,也可以查看函数用法。info手册比man手册更全面,但man使用起来更容易。
当想查看open函数用法,执行
man 2 open
注:man手册中快捷键:f往前翻,b向后翻,q退出。
2 文件IO_内核接口
APP(应用程序) ——> open/read/write....——> kernel(内核) |
2.1 应用程序如何进入内核?
APP使用的open,read,write这些函数是由/glibc等c库提供的。这些文件要求打开文件,要去读写文件,它需要依赖操作系统提供的功能。
可以认为该APP是一个APP1,操作系统是另外一个APP2,APP1不能调用APP2中函数,那么open是如何使用内核里面的功能呢?
原因:open函数中会放一条指令,当执行该指令(swi或svc,swi用于32位,svc用于64位)后,会触发cpu的异常,会导致cpu跳到某个地址去执行操作系统的代码,此时,操作系统可去执行对应的sys_open和sys_read,sys_write。
2.2应用程序如何知道触发异常是为了调用sys_open而不是sys_read?
/glibc实现open/read/write这些系统调用时,它会使用这些命令来触发异常,它会在触发异常时,传入不同的参数给内核,内核根据那些不同的参数可分辨。
2.3/glibc如何传递参数?
可以利用old ABI 或 EABI 或 ARM64。具体不详述。
注:内核中:sys_call_table是函数指针数组 。
内核把glibc传入的值取出来后,就可用这个值作为sys_call_table数组的下标,在数组中找到对应函数,如何调用调用函数。
2.4内核的 sys_open、sys_read 会做什么?
进入内核后,sys_read/open 会首先根据参数判断文 件的类型,然后根据不同的文件类型去找不同的设备驱动,继而进行读写或者输入输出控制。
普通文件以某种格式保存在块设备上后,需要使用FAT32或EXT4....文件系统的代码来读写块设备。
字符设备节点以主设备号来寻找驱动,使用驱动来操作这些硬件。