认识romfs文件系统

2023-05-16

1.1 什么是romfs

       romfs是一个只读文件系统,主要用在 mainly for initial RAM disks of installation disks.使用romfs文件系统可以构造出一个最小的内核,并且很节省内存。相比而言,早期的minixxiafs(现在已经过时)文件系统如果编译为模块的形式则大小超过20000字节(在x86机器上大小为38502字节),而romfs却小于一页(在linux系统中,一页大小为PAGE_OFFSET,一般为4K),大约4000字节(在x86机器上大小为10479字节)。在相同的条件下,msdos文件系统模块大约30K(并且不支持设备节点和符号链接,在x86机器上大小为12K)。ntfsnfsroot文件系统模块大约57K(在x86机器上大小为102K)。

注:上面叙述中的数值都是针对i586机器,括号中叙述的数值是在现在的x86机器上的大小,针对2.6.28内核。

1.2 romfs的用途

   romfs本设计的主要目标是构造一个最小内核,在内核中只链接romfs文件系统,这样就可以使用romfs在稍后加载其他模块。romfs也可以用来运行一些程序,从而决定你是否需要SCSI设备,或者IDE设备,或者如果你使用的是"initrd"结构的内核,romfs也可以用来在之后加载软驱驱动。romfs的另一个用途是在你使用romfs文件系统的时候,你可以关闭ext2或者minix甚至affs文件系统直到你确信需要的时候再开启。

1.3 romfs的性能

       romfs的操作是基于块设备的,它的底层结构非常简单。为了快速访问,每个单元被设计为起始于16字节边界。一个最小的文件为32字节(文件内容为空,并且文件名长度小于16字节)。对于一个非空文件的最大的开销是位于文件内容前面的文件头和其后的16字节的文件名(因为大多数的文件名长度大于3字节并且小于15字节,所以预置文件名长度为16字节)。

1.4 如何使用romfs映像

   要使用一个制作好的romfs格式的映像,是将其挂载在其他文件系统的某个节点上。并且还有一个很重要的前提,就是内核要支持romfs文件系统。这一点可以通过配置内核实现,有两个方法:

1.romfs配置成直接编译进内核,方法为使用make menuconfig命令进入内核配置界面,选择"File systems"并进入,选择“Miscellaneous filesystems”并进入,选择“ROM file system support(ROMFS)”,将其配置成"*"(直接编译进内核)。这样生成的内核就直接包含对romfs文件系统的支持。

2.romfs配置成模块的形式,步骤和前面一样,只是在最后选择"ROM file system support(ROMFS)"的时候将其配置成"M"(编译为内核模块)。这样编译好的内核并不包含对romfs文件系统的支持,只是生成了romfs.ko模块(fs/romfs/romfs.ko),需要在启动系统后将其加载进内核才能使内核支持romfs文件系统。

有了内核对romfs文件系统的支持,就可以直接挂载romfs格式的映像了,挂载方法为:

niutao@niutao:~/kernel/romfs$ ls

hello.img

niutao@niutao:~/kernel/romfs$ file hello.img

hello.img: romfs filesystem, version 1 208 bytes, named rom 49e05ac0.

niutao@niutao:~/kernel/romfs$ sudo mount -o loop hello.img /mnt

niutao@niutao:~/kernel/romfs$ cd /mnt/

niutao@niutao:/mnt$ ls

hello.c

niutao@niutao:/mnt$

  可以看到使用mount命令将hello.img挂载到了/mnt目录下,其内只有一个文件。

  卸载一个已经被挂载的romfs格式映像使用umount命令。

1.5 如何制作romfs映像

     如果要创建一个romfs文件系统,需要使用genromfs工具。具体用法为:

-f IMAGE     指定输出romfs映像的名字

-d DIRECTORY 指定源目录(将该目录制作成romfs文件系统)

-v           显示详细的创建过程

-V VOLUME    指定卷标

-a ALIGN     指定普通文件的对齐边界(默认为16字节)

-A ALIGN,PATTERN 匹配参数PATTERN的对象对齐在ALIGN边界上

-x PATTERN 不包括匹配PATTERN的对象。

-h 显示帮助文档。

下面一一解释每个参数的含义。

1.5.1  -f参数

   该参数指定要生成的romfs映像的名字,是一个必须参数,如果缺少,则无法生成映像。例如:

niutao@niutao:~/kernel/romfs$ ls

hello.c

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img

niutao@niutao:~/kernel/romfs$ ls

hello.c  hello.img

  可以看到生成了名为hello.imgromfs格式的映像。那么genromfs是将那个目录制作成了hello.img?将hello.img挂载之后,可以看到其内的文件为当前路径下的文件(hello.chello.img)。所以在没有指定源目录(要将那个目录制作成romfs映像)的时候,默认为当前目录。这一点也可以从genromfs的源代码中看到:

701 int main(int argc, char *argv[])

702 {

703         int c;

704         char *dir = ".";

705         char *outf = NULL;

706         char *volname = NULL;

注:代码摘自genromfs-0.5.2/genromfs.c

可以看到其中的dir就是指定的源目录,默认为当前目录。那么如何指定源目录?通过使用-d参数指定。

1.5.2  -d参数

   该参数指定源目录,意思是要将那个目录及其下面的文件制作成romfs格式的映像。如果不使用-d参数指定,则默认为当前目录。例如:

niutao@niutao:~/kernel/romfs$ ls

hello

niutao@niutao:~/kernel/romfs$ ls hello/

hello.c

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/

niutao@niutao:~/kernel/romfs$ ls

hello  hello.img

niutao@niutao:~/kernel/romfs$

1.5.3  -v参数

       -v表示显示romfs映像创建的详细过程。例如:

niutao@niutao:~/kernel/romfs$ ls

hello

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -v

0    rom 49e06097         [0xffffffff, 0xffffffff] 37777777777, sz     0, at 0x0

1    .                    [0x80e     , 0x1e4204  ] 0040755, sz     0, at 0x20   

1    ..                   [0x80e     , 0x1e41ea  ] 0040755, sz     0, at 0x40     [link to 0x20    ]

1    hello.c              [0x80e     , 0x1e4266  ] 0100644, sz    71, at 0x60   

niutao@niutao:~/kernel/romfs$ ls

hello  hello.img

niutao@niutao:~/kernel/romfs$

1.第一列为目录深度(0为顶极目录),各项的含义具体见genromfs.cshownode函数。

2.第二列为文件或者目录名。

3.第三列为前一个为文件或者目录所在设备的设备号,后一个为文件或者目录的节点号(这两个对应struct stat结构体的st_dev项和st_ino项)。

4.第四列为文件或者目录的属性(对应struct stat结构体的st_mode项)。

5.第五列为文件或者目录的大小,对于目录为0,文件则为文件以字节为单位的大小。

6.第六列为文件或者目录在生成的romfs格式映像文件中的偏移。

7.第七列表示该文件或者目录是一个硬链接,其指向的位置。这里需要注意一个细节:对于顶极目录下的目录,..目录是一个硬链接,除此之外,所有的目录都是目录(也就是说此第七列对于顶极目录下的目录就不存在)。而对于顶极目录下的子目录内的目录,则都是硬链接。这个在往后还会继续从代码的角度分析为什么会是这样(见对genromfs工具的分析)。

1.5.4  -V参数

    指定当前要生成的romfs格式映像的卷标,如果没有指定,则默认为字符串"rom "加当前的时间(16进制格式)。例如:

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/

niutao@niutao:~/kernel/romfs$ ls

hello  hello.img

niutao@niutao:~/kernel/romfs$ file hello.img

hello.img: romfs filesystem, version 1 256 bytes, named rom 49e069d8.

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -V niutao

niutao@niutao:~/kernel/romfs$ file hello.img

hello.img: romfs filesystem, version 1 256 bytes, named niutao.

niutao@niutao:~/kernel/romfs$

1.5.5  -a参数

   指定普通文件的对齐边界(默认为16字节),目的是为了快速访问文件内容。给出的对齐边界值必须大于16并且为16的倍数。这里所说的对齐指的是普通文件的文件内容的对齐,而并非文件头(见内核include/linux/romfs_fs.h中结构体struct romfs_inode )的对齐。假如指定普通文件x的对齐边界为align,其在生成的romfs格式映像中的偏移为start,文件名长度为len,则文件内容在romfs映像中的偏移offset为:

offset = start + 16 + (len / 16) * 16 + len % 16 ? 16 : 0

其计算过程为文件头偏移加上文件头大小(struct romfs_inode),其文件头大小为16字节,再加上文件名以16字节对齐的长度。

例如:

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/ -V niutao -a 64 -v

0    niutao               [0xffffffff, 0xffffffff] 37777777777, sz     0, at 0x0

1    .                    [0x80e     , 0x1e4204  ] 0040755, sz     0, at 0x20   

1    ..                   [0x80e     , 0x1e41ea  ] 0040755, sz     0, at 0x40     [link to 0x20    ]

1    hello.c              [0x80e     , 0x1e4266  ] 0100644, sz    71, at 0x60   

niutao@niutao:~/kernel/romfs$

我们使用-a参数指定普通文件的对齐algin = 64。可以看到普通文件hello.c文件头(也叫节点)开始偏移为start = 0x60,文件名长度len = 7,则文件内容起始位置offset为:

offset = start + 16 + (len / 16) * 16 + len % 16 ? 16 : 0

       = 0x60 + 16 + (7 / 16) * 16 + 7 % 16 ? 16 : 0

       = 0x80

其正好对齐在64边界上。

注意:-a参数只对普通文件起作用,如果要对所有或者部分或者指定的文件起作用,则要使用-A或者-x参数。

1.5.6  -A参数

       genromfs -A ALIGN,PATTERN

匹配PATTERN的对象对齐在ALIGN边界上。给出的对齐边界值必须大于16并且为16的倍数。和-a不同的是,-A参数可以指定某个文件或者某些文件对其在ALIGN边界上。例如:

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/  -v -A 64,.

0    rom 49e08490         [0xffffffff, 0xffffffff] 37777777777, sz     0, at 0x0

1    .                    [0x80e     , 0x1e4204  ] 0040755, sz     0, at 0x40   

1    ..                   [0x80e     , 0x1e41ea  ] 0040755, sz     0, at 0x60     [link to 0x40    ]

1    hello.c              [0x80e     , 0x1e4266  ] 0100644, sz    71, at 0x80   

niutao@niutao:~/kernel/romfs$

指定目录"."对齐在64字节边界上。

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/  -v -A 64,*.c

0    rom 49e08553         [0xffffffff, 0xffffffff] 37777777777, sz     0, at 0x0    

1    .                    [0x80e     , 0x1e4204  ] 0040755, sz     0, at 0x20   

1    ..                   [0x80e     , 0x1e41ea  ] 0040755, sz     0, at 0x40     [link to 0x20    ]

1    hello.c              [0x80e     , 0x1e4266  ] 0100644, sz    71, at 0x60   

niutao@niutao:~/kernel/romfs$

指定所有的.c文件对其在64字节边界上。

1.5.7  -x参数

不包括匹配PATTERN的对象。也就是说在生成romfs格式映像的时候,不包括指定的源目录下的匹配PATTERN的文件或者目录。例如:

niutao@niutao:~/kernel/romfs$ ls -al hello

total 12

drwxr-xr-x 2 niutao niutao 4096 2009-04-11 20:02 .

drwxr-xr-x 3 niutao niutao 4096 2009-04-11 19:49 ..

-rw-r--r-- 1 niutao niutao    0 2009-04-11 20:02 aa.c

-rw-r--r-- 1 niutao niutao   71 2009-04-11 16:54 hello.c

niutao@niutao:~/kernel/romfs$ genromfs -f hello.img -d hello/  -v -x hello.c

0    rom 49e086ed         [0xffffffff, 0xffffffff] 37777777777, sz     0, at 0x0    

1    .                    [0x80e     , 0x1e4204  ] 0040755, sz     0, at 0x20   

1    ..                   [0x80e     , 0x1e41ea  ] 0040755, sz     0, at 0x40     [link to 0x20    ]

1    aa.c                 [0x80e     , 0x1e4276  ] 0100644, sz     0, at 0x60

可以看出,我们使用-x参数将hello.c文件过滤掉了,在生成的romfs格式的映像中,没有hello.c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

认识romfs文件系统 的相关文章

  • Linux文件系统--文件类型

    Linux中一切都是文件 xff0c 文件类型有多种 xff0c 使用ls l命令可以查看文件属性 xff0c 所显示结果的第一列的第一个字符用来表示文件类型 xff0c 如下 xff1a 1 普通文件 第一列第一个字符为 的文件为普通文件
  • Linux 文件系统

    Linux 文件系统以及常见命令 Linux 文件系统block 与 inode文件类型权限目录树挂载 管道啥是管道管道的分类管道的实质 Linux 文件系统 在 Linux 中一切皆文件 xff0c 不仅仅是平时所使用的 txt pdf
  • C++标准 — C++17特性 — 文件系统 — path 路径处理

    C 43 43 标准 C 43 43 17特性 文件系统 path 路径处理 一 分解二 查询三 拼接1 append 61 2 concat 43 61 四 修改五 遍历六 比较 类型 path 的对象表示文件系统上的路径 只有路径的语法
  • Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍

    nbsp Linux 查看磁盘分区 文件系统 使用情况的命令和相关工具介绍 提要 Linux 磁盘分区表 文件系统的查看 统计的工具很多 有些工具是多功
  • ROS学习:ROS文件系统--package.xml

    package xml 也是一个 catkin的package 必备文件 xff0c 它是这个软件包的描述文件 xff0c 在较早的ROS 版本 rosbuild 编译系统 中 xff0c 这个文件叫做 manifest xml xff0c
  • Android 11.0 支持exFAT文件系统

    Android 11 0 支持exFAT文件系统 U盘常见文件系统类型有FAT32 NTFS exFAT xff0c Android默认支持FAT32 一般也有NTFS类型编译选项 xff0c 但是exFAT由于版权或者其他原因 xff0c
  • ROMFS的建立

    参考 xff1a VxWorks 7 File Systems Programmer s Guide
  • linux下查看磁盘分区,文件系统,磁盘文件系统的命令

    http www linuxsir org bbs thread214738 html 一 df 命令 df 是来自于coreutils 软件包 系统安装时 就自带的 我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置 举例 S
  • linux文件系统出错:Read-only file system

    问题 root xx opt gopath src github com hyperledger fabric mkdir p testtt mkdir cannot create directory testtt Read only fi
  • Openwrt一条命令把整个路由器搞蹦了

    对于rm rf这条命令以前吃过一次亏了 这次又没有长记性 以前本来想删除某个目录下所有的c文件删掉 但是cd到该目录时少进了一级目录 结果啊把其他人忙活里几天的代码全搞没了 我只想说一下 当某种破坏已经造成 并且破坏没有继续 而你又一时不知
  • 文件系统(4)——Ubuntu system service设置自动登录

    参考链接 linux systemd启动方式解析 如何开机自动登录 开机自动运行程序 https blog csdn net a617996505 article details 88423794 涉及文件 OK3399 linux ubu
  • 用busybox构建最小根文件系统详解

    1 busybox源码获取 1 busybox官网下载地址 https busybox net 2 建议下载busybox的版本 尽量和你使用的编译环境 比如 Ubuntu 的版本相近 版本差太多可能需要解决一些编译时候的兼容问题 2 bu
  • 【linux kernel】记一次linux内核裁剪总结

    记一次linux内核裁剪总结 一 背景 在linux内核构建过程中 根据实际应用场景 小生构建了一个大约5 7M大小的linux内核zImage镜像 发现其稍微有点大了 想着将其裁剪和缩小 于是乎对linux内核进行裁剪 本篇文章主要记录一
  • FAT16 FAT32 文件系统

    FAT 英文为File Allocation Table 文档分配表 先要记住几个概念 扇区 一般扇区为512个字节 簇 由若干个扇区组成 而FAT文件系统 其他文件系统应该相似 就是专门管理这些簇的 一个文件可能占据一个或者多个簇 按正确
  • stm32 FATFS文件系统如何减少Flash和RAM占用,FATFS移除中文文件名,FATFS移除动态内存

    FATFS 下载地址 FATFS源码下载 FATFS 移植的过程中 主要用到三个文件 ff c diskio c ffconf h 移植FATFS不需要过多的操作 过程很是方便 步骤为 补全 diskio c 中的存储介质底层驱动文件 一般
  • 一文让你彻底了解Linux内核文件系统

    一 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • Linux内核文件系统知识大总结

    1 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • ext4 buddy块分配算法源码剖析

    概述 ext4 buddy块分配算法的函数是ext4 mb regular allocator 阅读本文之前需要先看下ext4 mballoc之buddy算法 nginux的博客 CSDN博客 ext4 mb regular allocat
  • 深入理解操作系统原理之文件系统

    一 概述 操作系统对系统的软件资源 不论是应用软件和系统软件 的管理都以文件方式进行 承担这部分功能的操作系统称为文件系统 1 文件 计算机系统对系统中软件资源 无论是程序或数据 系统软件或应用软件都以文件方式来管理 文件是存贮在某种介质上
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索

随机推荐

  • RTK差分共享猫APP后台系统已开源

    RTK差分共享猫APP后台系统开源 xff0c 开源地址https gitee com forgy NtripShareCatServer 后台系统基于GUNS 6 0 xff08 https gitee com stylefeng gun
  • RTK差分数据网络播发软件

    解决短基线范围内多台设备同时作业 xff0c CORS差分账号资源不足的问题 基于串口或模拟网络RTK请求 xff0c 将实时差分数据进行转发 xff0c 支持Ntrip协议 xff0c 支持市面所有网络RTK系统 个人作品 xff0c 不
  • STM32使用cubemx的uart空闲中断接收不定长度数据

    void USART3 IRQHandler void USER CODE BEGIN USART3 IRQn 0 USER CODE END USART3 IRQn 0 HAL UART IRQHandler amp huart3 USE
  • 基于ROS平台的移动机器人-8-使用Kinect2导航

    基于ROS平台的移动机器人 8 使用Kinect2导航 ready 终于到写最后一篇了 不是经常写博文的老司机果然伤不起 xff01 在这一篇教程就是利用KinectV2来导航啦 go 1 安装一下所需的包 xff08 1 xff09 cd
  • kali linux学习——安装WingIDE(libqt4-webkit软件依靠问题)

    kali linux 中安装wingide xff08 libqt4 webkit软件依靠问题 xff09 走过的坑缺失的libqt4 webkit成功安装WingIDE 走过的坑 在kali linux上利用命令 dpkg i wingi
  • 华为的OD,值得去吗?

    最近有不少小伙伴接到了华为OD的面试邀约 xff0c 但搞不清楚OD到底怎么回事儿 xff0c 要不要去 所以今天来说说华为的OD到底是怎么回事儿 xff0c 怎么判断是否值得去 1 华为的OD是怎么回事儿 OD xff0c 是Outsou
  • 第01课:技术成长的三阶段模型

    引言 作为整个系统课程的第一部分 xff0c 我想先跟大家分享的是如何选择技术方向 xff0c 我将结合技术成长的三阶段模型 xff0c 讨论在入行 构建技能树 技术转型 团队技术方案选型等常见场景中如何选择适合自己的技术 努力只有在方向正
  • 开篇词 | 程序员的成长课

    大家好 xff0c 我是安晓辉 xff0c 做过开发工程师 研发经理 技术总监等岗位 xff0c 现在自由职业 xff0c 专注写作和开发者生涯咨询 出版过 程序员的成长课 Qt Quick 核心编程 你好哇 xff0c 程序员 解忧程序员
  • const与define的区别

    1 define是预编译指令 xff0c const是普通变量的定义 xff0c define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量是在编译运行阶段使用的 2 const定义的是变量 xff0c 而define
  • 如何摆脱CRUD等打杂状态,从事更高价值工作

    每个月都会有十来个来询者向我抱怨工作低端 xff0c 程序员说自己每天CRUD xff0c 重复 枯燥 没技术含量 xff0c 销售助理说自己天天搜集客户信息 打印资料 帮老大带饭 xff0c 繁琐 无聊 不重要 xff0c 他们都说自己整
  • Windows下Qt 5.2 for Android开发入门

    Qt 5 2 发布了 xff0c 支持 Android 平台 xff0c 太好了 之前公司项目 xff0c 为了移植一个依赖 Qt 的程序到安卓平台上 xff0c 我自己交叉编译了 Qt Embedded 4 5 2 xff0c 费了老大劲
  • Qt Quick 之 QML 与 C++ 混合编程详解

    Qt Quick 技术的引入 xff0c 使得你能够快速构建 UI xff0c 具有动画 各种绚丽效果的 UI 都不在话下 但它不是万能的 xff0c 也有很多局限性 xff0c 原来 Qt 的一些技术 xff0c 比如低阶的网络编程如 Q
  • 漫谈程序员系列:一张图道尽程序员的出路

    推背图 相传由唐太宗时期的司天监李淳风和袁天罡合著 xff08 此两人其实是超级武学高手 xff0c 参见小椴的 开唐 xff09 xff0c 推算大唐以后中国两千多年的国运盛衰 xff0c 在中国七大预言书中居首 xff0c 是当之无愧的
  • 漫谈程序员系列:咦,你也在混日子啊

    戳你一下 xff0c 疼吗 xff1f 混日子的定义 来自百度百科的定义 xff1a 生活等方面过得不怎么好 xff0c 无目标 xff0c 混混沌沌 混日子 xff1a 即没有理想 xff0c 没有抱负 xff0c 糊里糊涂地生活 也指工
  • QtAndroid详解(1):QAndroidJniObject

    Qt 5 3之后 xff0c 新增了 QtAndroid 名字空间 xff0c 内有下列四个方法 xff1a QAndroidJniObject AndroidActivity int androidSdkVersion void star
  • freeSWITCH安装、配置与局域网测试

    这次来说说 freeSWITCH 的安装和配置 1 安装 freeSWITCH 下载页面 xff1a https freeswitch org confluence display FREESWITCH Installation 我们 Wi
  • 就 3 点,提升工作效率

    要想提高工作效率 xff0c 不论你看什么书 xff0c 看什么文章 xff0c 用什么工具 xff0c 只有下面这三点最重要 xff1a 动力剖析自己 xff0c 找到改善的切入点付诸行动并且坚持 目标驱动 有目标才能高效 我们爬山 xf
  • Python3 下 ROS 的使用 cv_bridge

    Python 3 下 ROSmsg 转 cv2 项目中用到的 Tensorflow2 4 的环境 xff0c 该环境只支持python3 版本 xff0c 项目中遇到不少需要和 ROS 交互的地方 xff0c 所以不断探索 python3
  • 深度图和RGB图对齐

    深度图 canny RGB canny Alignment xff1a code span class token function import span cv2 span class token function import span
  • 认识romfs文件系统

    1 1 什么是romfs romfs 是一个只读文件系统 xff0c 主要用在 mainly for initial RAM disks of installation disks 使用romfs 文件系统可以构造出一个最小的内核 xff0