• 在 Linux 系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件 IO”来操作的
    • 文件从哪来?

    文件是对数据的一种组织方式
    image.png
    存储设备上的文件系统需要挂载到根文件系统上才能够访问,用cat /proc/mounts命令查看挂载了那些文件系统
    image.png

    • 插入SD卡后会在/dev目录下创建sda文件,表示整个SD卡;还可能会创建sda1、sda2这些文件,表示SD卡不同分区

    image.png

    • Linux内核提供某些虚拟文件系统,根据虚拟文件系统的文件可以查看内核的某些信息;比如sysfsimage.png

    也可以对虚拟文件系统进行挂载
    image.png
    因为sysfs是虚拟的文件系统,其节点可以任意写,如none

    • Linux内核中有两类驱动程序:字符设备驱动(char)、块设备驱动(block)
      • 设备节点中还含有两个信息:主设备号、次设备号
      • 内核中有那么多个字符设备驱动程序,某个设备节点对应哪一个字符设备驱动程序呢?
      • 通过主设备号确定对应哪一个驱动,通过次设备号确定对应驱动程序中的哪一个硬件
      • image.png
    • 通用的 IO 模型:open/read/write/lseek/close

    man手册查看用法

    • 不是通用的函数:ioctl/mmap

    man手册查看用法

    • 系统调用函数怎么进入内核?

    系统调用陷入内核的过程及参数传递:
    image.png

    • 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这些函数会做什么呢?

    image.png