- 在 Linux 系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件 IO”来操作的
- 文件从哪来?
文件是对数据的一种组织方式
存储设备上的文件系统需要挂载到根文件系统上才能够访问,用cat /proc/mounts命令查看挂载了那些文件系统
- 插入SD卡后会在/dev目录下创建sda文件,表示整个SD卡;还可能会创建sda1、sda2这些文件,表示SD卡不同分区
- Linux内核提供某些虚拟文件系统,根据虚拟文件系统的文件可以查看内核的某些信息;比如sysfs
也可以对虚拟文件系统进行挂载
因为sysfs是虚拟的文件系统,其节点可以任意写,如none
- Linux内核中有两类驱动程序:字符设备驱动(char)、块设备驱动(block)
- 设备节点中还含有两个信息:主设备号、次设备号
- 内核中有那么多个字符设备驱动程序,某个设备节点对应哪一个字符设备驱动程序呢?
- 通过主设备号确定对应哪一个驱动,通过次设备号确定对应驱动程序中的哪一个硬件
- 通用的 IO 模型:open/read/write/lseek/close
man手册查看用法
- 不是通用的函数:ioctl/mmap
man手册查看用法
- 系统调用函数怎么进入内核?
系统调用陷入内核的过程及参数传递:
- glibc中对open/write/close等函数实现了swi/svc指令,这条指令是ARM平台软件中断的汇编指令,执行指令将会触发异常从而进入到内核去工作(导致CPU跳到某个地址去执行操作系统的代码)
- 那么系统是如何保证open/read/write这些函数触发的异常后去调用对应sys_open/sys_read/sys_write这些函数而不是其他函数呢?
- glibc在实现这些IO函数时会使用swi/svc指令触发异常,会在触发不同的异常时传入不同的参数给内核,内核根据不同的参数就可以分辨要调用的是sys_open还是sys_read或者其他函数
- glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。
- glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
- glibc 和 libc 都是 Linux 下的 C 函数库。libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库。
- GNU C 函数库是一种类似于第三方插件的东西。由于 Linux 是用 C 语言写的,所以 Linux 的一些操作是用 C 语言实现的,因此,GUN 组织开发了一个 C 语言的库以便让我们更好的利用 C 语言开发基于 Linux 操作系统的程序。
- glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。Linux下面的标准c库不仅有这一个,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。
- 内核中的sys_open/sys_read这些函数会做什么呢?