微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 90|回复: 0

Linux 驱动开发学习笔记(六)

[复制链接]

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-11-8 13:49:28 | 显示全部楼层 |阅读模式
接着Linux 驱动开发学习笔记(五)继续写,主要还是分析板子的启动过程(启动引导阶段、内核启动阶段,加载文件系统阶段)。
(五)写了第二阶段,接下来我们来看加载文件系统阶段
知识点1:根文件系统启动

bootloader启动:BL0+BL1+BL2
kernel启动:
    前两个阶段硬件汇编初始化
    三阶段:init/main.c
        465:start_kernel功能:各种功能的初始化
            rest_init功能:开启任务调度,创建其他任务。。
                kernel_init开启第一个用户进程
                    prepare_namespace();加载文件系统
                    init_post();用boot传过来的参数linuxrc 调用kernel_execve替换第一个用户进程
文件系统启动:kernel第三阶段中内核创建的第一个用户进程中加载的
    init/do_mounts.c
        prepare_namespace();
        mount_root();//根据引导程序参数规定的启动方式来加载文件系统
知识点2:文件系统概述

概念:负责管理和存储文件信息的软件组件(管家,管理储存器上的文件)
功能:

  • 1、负责存储器中文件的组织和分配
  • 2、提高对存储器资源的利用效率
  • 3、将文件的存取、共享和保护等功能提供给操作系统和用户
  • 4、简化用户对文件的各项操作
  • 5、保证在多用户环境下文件的安全性和一致性
重要性:文件系统是操作系统的重要组成部分,是实现文件多元化管理的必要条件



操作系统、磁盘、文件系统之间的关系

知识点3:常见文件系统

3.1基于Flash的文件系统
JFFS 文件系统(Journalling Flash File System)
JFFS系列日志文件系统包括JFFS1、JFFS2和JFFS3。JFFS3正在开发中,JFFS2比JFFS1 有很多改进的地方,所以目前通常使用 JFFS2。
工作原理:当文件系统加载时扫描整个 Flash 的内容,将信息读入日志结点 jffs2_raw_inode,然后根据该信息建立文件系统。修改操作是先分配新结点 jffs2_raw_inode,将内容写入新结点,然后将原来的结点标记为脏数据。当系统接近满或者已满时就要进行垃圾收集,需要扫描整个 Flash 中的结点,将标记为脏的结点进行回收。
JFFS2主要特点:可读写;使用基于哈希表的日志结点结构,大大提高了对结点的操作速度;支持数据压缩;提供了“写平衡”支持;支持多种结点类型(数据 I 结点、目录 I 结点等),JFFS 只支持一种结点;提高了对闪存的利用率,降低了内存的消耗。
JFFS2 的挂载过程主要分为 4 个过程:
(1)JFFS2 扫描闪存介质,检查每个结点 jffs2_raw_inode 的 CRC 校验码是否合法,同时分配 struct jffs2_inode_cache 和 struct jffs2_raw_node_ref。
(2)扫描每个结点的物理结点链表,标识出过时的物理结点;将每个合法的 dentry 结 点相应的 jffs2_inode_cache 中的字段 nlink 加 1。
(3)找到 nlink 为 0 的 jffs2_inode_cache,释放对应的结点。
(4)释放扫描过程中的临时信息。
JFFS2 的优点有:
(1)碎片收集对象是基于一个扇区而不是基于整个文件系统,删除的对象也是扇区,因此删除操作的时间短。
(2)遇到坏扇区时进行标记而使用可用扇区,延长了设备的写生命周期。
JFFS 系列文件系统存在下面的缺点:
(1)文件系统已满或者接近满时,系统无法分配新的结点就必须进行垃圾收集;
(2)垃圾收集就是从头开始扫描日志结点(jffs2_raw_inode)标记脏数据结点,这样使 文件系统变得非常缓慢。
由于 JFFS 系列文件系统存在上述缺点,不适用于 NAND Flash。因为 NAND Flash 的容量一般较大,导致 JFFS 系列文件系统为维护日志结点所占用的内存空间迅速增大;其次,JFFS 系列文件系统在挂载时需要扫描整个 Flash 的内容,以找出所有的日志结点,建立文件结构,对于大容量的 NAND Flash 会耗费大量时间。
YAFFS 文件系统(Yet Another Flash File System)
1.YAFFS文件系统的特点
YAFFS/YAFFS2 自带 NAND 芯片驱动,提供了嵌入式系统直接访问文件系统的 API,这样用户可以不使用 Linux 中的 MTD 与 VFS,直接对文件系统操作。当然,用户也可以通过 MTD 驱动程序来访问文件系统。
2.YAFFS与YAFFS2的区别
YAFFS 与 YAFFS2 的主要区别在于,YAFFS 仅支持小页(512 Bytes)NAND Flash,而 YAFFS2 能够支持大页(2KB)NAND Flash。另外,YAFFS2 在内存空间占用、垃圾回收速度、读/写速度等方面都有较大的改进。
3.YAFFS/YAFFS2的工作原理
YAFFS/YAFFS2 根据 NAND Flash 的存取特点,将文件组织成固定大小(512  Bytes/2KB)的数据段。对文件系统上的所有内容(比如正常文件、目录、链接、设备文件等)都统一当做文件来处理,每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者 ID、组 ID、长度、文件名、Parent Object ID 等信息。根据 NAND Flash的特点,NAND Flash 上的每一页数据都留有额外的空间用于存储附加信息,一般 NAND驱动只占有该空间的一部分,YAFFS 文件系统正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。为了了解 YAFFS 工作的原理,下面通过分析源码(fs/yaffs_guts.c)认识 YAFFS 是如何进行分配和删除页(代码中表示为 chunk)的。
4.YAFFS与JFFS的比较
YAFFS 和 JFFS 都提供了写均衡、垃圾收集等操作。同时在稳定性、垃圾收集速度、 储存容量等特性方面具有以下区别:
(1)JFFS 是一种日志文件系统,采用日志机制保证文件系统的稳定性。YAFFS 仅仅借鉴了日志系统的思想,不提供日志机制,所以稳定性不如 JFFS,但是资源占用少。
(2)JFFS 中使用多级链表管理需要回收的脏块,采用系统生成伪随机变量计算要回收的块,这种方法能提高硬件的写均衡,在 YAFFS 中是从头到尾对块进行扫描,所以在垃圾收集上 JFFS 的速度较慢,但是能延长 NAND 器件的寿命。
(3)JFFS 支持文件压缩,适合存储容量较小的系统;YAFFS 不支持压缩,更适合存储容量大的系统。
Cramfs 文件系统(Compressed ROM File System)
Cramfs 是一个压缩式的文件系统,不必一次性将文件系统中的全部内容解压缩到内存中,而只是在系统需要访问某个位置的数据时,先计算出该数据压缩后在 Cramfs 中所存的位置,再将该数据即时解压缩到 RAM 中,最后通过访问内存来读取文件系统中需要的数据。Cramfs 中的解压缩及解压缩之后的内存中数据存放位置,都Cramfs 文件系统本身进行维护的,用户不需要了解具体的实现细节,因此这种方式增强了透明度,既方便, 又节省了存储空间。
1.Cramfs文件系统的特点
在 Cramfs 文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,节省了嵌入式系统 Flash 存储空间,系统使用低容量的 Flash 存储相同的文件,因此降低了系统的成本。另外,它的速度快,效率高,其只读特性有利于保护文件系统遭受破坏,提高了系统的可靠性。
Cramfs 的特性如下:
(1)系统访问数据时采用实时解压缩方式,其解压缩算法复杂,因此解压缩过程有延迟。
(2)Cramfs 的数据都是经过处理、打包的,对数据进行写操作比较困难。所以 Cramfs 不支持写操作,这一特性适合嵌入式应用中使用 Flash 存储文件系统的场合。
(3)在 Cramfs 中文件最大不能超过 16MB。
(4)支持组标识(gid)。mkcramfs 处理掉 gid 的高 8 位,保留 gid 的低 8 位,因此只有 gid 的低 8 位是有效的。
(5)支持硬链接,但是 Cramfs 不能处理多条链接,硬链接的文件属性中,链接数始终为 1。
(6)Cramfs 的目录中,没有“.”和“..”这两项。因此,Cramfs 中的目录链接数通常也仅有一个。
(7)Cramfs 中不保存文件的时间戳(timestamps)信息。正在使用的文件由 inode 保存在内存中,其时间可以暂时变更为最新时间,但是不会保存到 Cramfs 文件系统中。
(8)当前版本的 Cramfs 只支持 PAGE_CACHE_SIZE 为 4096 的内核。因此,如果发现Cramfs 不能正常读写的时侯,可以修改 mkcramfs.c 中的宏定义。
2.Cramfs文件系统的优点和缺点
Cramfs 文件系统的优点有:压缩比较高,占用内存空间少;其缺点就是只能进行读操作,不支持写操作。
Romfs 文件系统(ROM File System)
Romfs 是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存功能,采用顺序存储方式,所有的数据包括目录、链接等都按照目录树的顺序进行存放。与 EXT2 等较大型的文件系统而言,Romfs 非常节省空间。通常 Romfs 用在嵌入式设备中作为根文件系统,或者用于保存 boot loader 以便引导系统启动。
因为 Romfs 是一种只读的文件系统,使用顺序存储方式,所有数据都是顺序存放的。它的数据存储方式决定了无法对 Romfs 进行写操作。因此 Romfs 中的数据一旦确定就无法修改,Romfs 只能作为一种只读文件系统。由于采取了顺序存放策略,Romfs 中每个文件的数据都能连续存放,读取过程中只需要一次寻址操作,就可以对整块数据进行读取,因此 Romfs 中读取数据效率很高。
对于 Romfs 文件系统的注册过程,读者可以查看 fs/romfs/inode.c 文件。其注册过程类似简单设备驱动注册过程。

3.2基于RAM的文件系统
基于 RAM 文件系统的优点就是读写速度非常快,而缺点就是当系统复位后会丢失所有数据。下面分别简单介绍基于 RAM 的文件系统的特点。
Ramdisk  
Ramdisk 是划分一块固定大小的内存作分区来使用,它不是一个实际的文件系统,而是将实际的文件系统装入内存的一种策略,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过 Ramdisk 放在内存中,可以明显地提高系统的性能。
在 Linux 的启动阶段,initrd 提供了一套机制,将内核映像和根文件系统一起加载到内存中。在 initrd 机制中还会指定文件系统的起始地址、大小等参数,这些参数会通过Bootloader 传递给内核。
Ramfs/Tmpfs  
Ramfs 是 Linus Torvalds 开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS) 层,不能进行格式化,可以创建多个,在创建时可以指定其最大使用的内存大小(VFS 可看成是一种内存文件系统,统一了文件在内核中的表示方式,并对磁盘文件系统进行了缓冲)。
Ramfs/Tmpfs 文件系统把所有的文件都放在 RAM 中,所以读/写操作发生在 RAM 中,可以用 Ramfs/Tmpfs 来存储一些临时性或经常要修改的数据,例如/tmp 和/var 目录,这样既避免了对 Flash 存储器的读写损耗,又提高了数据读写速度。Ramfs/Tmpfs 相对于传统的 Ramdisk 的不同之处主要在于其不能被格式化,文件系统大小可随所含文件内容大小变化。
3.3其他
ext3:
日志型文件系统,目前使用较多的是ext4
ext4:
日志型文件系统,特点效率高,且存储量庞大
nfs:
一般网络共享,用于开发调试使用。
VFS:
虚拟文件系统。
知识点4:根文件系统的目录结构

概念:Linux系统启动后,首先由内核挂载的文件系统称为根文件系统,其中包括系统启动所必需的文件。
特点:
1、在其主目录下的所有目录都有其目的及功能
2、根文件系统的文件系统类型任意
3、需要全部挂载才可使用。


知识点5:构造根文件系统

本质就是构造/bin /sbin /lib /etc linuxrc ..............
制作工具:busybox
特点:
1、提供完善的Linux命令工具集
2、提供图形化的配置环境和默认配置选项
3、所有功能均整合到busybox程序中,实现不同命令的代码共享,占用磁盘空间极小
4、所有命令均通过软链接到/bin/busybox实现
5、帮助用户实现了1号用户进程(linuxrc)
构造过程:
步骤1:拷贝busybox源码到虚拟机


步骤2:先创建空的根文件系统
mkdir rootfs
cd rootfs
mkdir dev etc lib usr var proc tmp home root mnt bin sbin opt sys media
步骤3:使用工具构建/bin /sbin  linuxrc
tar xvf busybox-1.21.1.tar.bz2
cd busybox-1.21.1
make defconfig
make menuconfig





make
make install步骤4:将工具构建/bin /sbin  linuxrc拷贝到空的根文件系统中
cd _install
cp  bin  sbin  usr  linuxrc   /home/edu/share/rootfs  -rfa
步骤5:构造lib目录
cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
cp  *so*  /home/edu/share/rootfs/lib  -a
cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib
cp  ./libstdc++.so.* /home/edu/share/rootfs/lib  -a 步骤6:构造etc目录
inittab:用来作为linuxrc的配置脚本
init.d/rcS: inittab启动的第一个脚本
一般用来挂载系统必需的文件系统、必要的设备连接、设置IP地址、启动其他脚本等默认仅有mount –a
fstab:  执行mount –a时,按照此文件挂载文件系统
profile:登陆完shell后自动执行此脚本,一般用来配置用户的登录环境
cd /home/edu/share/rootfs/etc
cp /home/edu/share/busybox-1.21.1/examples/bootfloppy/etc/* . -r 修改inittab
删除第三行代码:tty2::askfirst:-/bin/sh修改init.d/rcS


修改fstab


修改profile


启动根文件:
1、通过Nfs启动根文件系统验证


2、制作镜像烧写到开发板中验证



备注:
于作者水平,难免有理解和描述上有疏漏或者错误的地方,欢迎共同交流;部分参考已经在正文和参考文献中列表注明,但仍有可能有疏漏的地方,有任何侵权或者不明确的地方,欢迎指出,必定及时更正或者删除;文章供于学习交流,转载注明出处。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-9 03:59 , Processed in 0.099187 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表