RTEMS文件系统(4):系统调用开发信息(下)

计算机系统基础、LinkLab实验每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识 阶段1:全局变量ó数据节 阶段2:强符号与弱符号ó数据节 阶段3:代码节修改 阶段4:代码与重定 计算机系统基础,LinkLab实验、每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识 阶段1:全局变量ó数据节 阶段2:强符号与弱符号ó数据节 阶段3:代码节修改 阶段4:代码与重定位位置 阶段5:代码与重定位类型 阅读详情

4.18 mkfifo
文件:mkfifo.c

处理:这个函数试图在文件系统下的创建一个先进先出节点。该函数基于~mknod()~函数。

开发注释:见~mknod()~函数的开发注释。

4.19 mknod
文件:mknod.c

处理:
此函数允许在文件系统下创建以下类型的节点:

  •  目录;
  •  普通文件;
  •  字符设备;
  •  块设备;
  •  FIFOS。



截至目前,试图创建一个~FIFO~会使调用函数得到一个~ENOTSUP~的错误。
此例程基于文件系统的特定函数~evalformake()~函数和~mknod()~函数。
一个新文件系统必须包含自己的~evalformake()~和~mknod()~函数,以支持通用的~mknod()~函数。
在此条件下的通用~mknod()~函数支持其他文件系统类型而不必进行任何修改。

开发注释:
测试节点的类型,测试过程类似以下的代码:

    if ( (mode & S_IFDIR) = = S_IFDIR) ||
         (mode & S_IFREG) = = S_IFREG) ||
         (mode & S_IFCHR) = = S_IFCHR) ||
         (mode & S_IFBLK) = = S_IFBLK) ||
         (mode & S_IFIFO) = = S_IFIFO))
        Set_errno_and_return_minus_one (EINVAL);


其中:

  •  S_IFREG (0100000):创建一个正常的文件;
  •  S_IFCHR (0020000):创建一个字符设备;
  •  S_IFBLK (0060000):创建一个块设备;
  •  S_IFIFO (0010000):创建一个FIFO。



使用~rtems_filesystem_get_start_loc()~函数判断即将创建的路径名称是从根目录开始或相对于当前目录开始的。
确定路径名称在节点创建后是否是一个有效的可被访问的目录。
如果路径名是一个可创建节点的有效位置,验证该文件系统是否提供了~mknod()~函数。
如果~mknod()~函数存在,调用该文件系统的~mknod()~函数,并传递名称、模式、设备类型和节点创建的目录位置信息给该函数。

4.20 mount
文件:mount.c

参数(不是一个标准的~POSIX~调用):

rtems_filesystem_mount_table_entry_t **mt_entry,

如果挂载操作成功,这个指向指针的指针将被设置为指向已为这个文件系统挂载分配的挂载表项目。

rtems_filesystem_operations_table *fs_ops,

这个指针指向我们即将挂载的文件系统的函数表。
这个机制选择文件系统类型时不需要为了正确的完成挂载操作而保存一个所有可能文件系统类型的动态数据库。
使用这种方法,只需要配置我们希望在~RTEMS~执行体中使用到的文件系统。
未使用的文件系统类型将不会被编译。

char *fsoptions,

此参数指向一个选择挂载为只读访问或读/写访问的字符串。有效的字符串是~"RO"~和~"RW"。

char *device,

此参数是保留给一个设备的名称,用来访问文件系统信息。
当前文件系统的实现是基于内存的,不需要设备来访问文件系统信息。

char *mount_point

这是一个已经挂载文件系统上的允许读取、写和执行的目录的路径名。
如果成功,通过评估这个名字发现这个节点存储在~mt_entry。


处理:
此函数将挂载一个文件系统到挂载点上。
如果操作成功,返回一个指向与已挂载文件系统相关的挂载链表中的项目的指针给调用函数。
关于挂载点的处理和被挂载文件系统的处理都被封装在文件系统里的~mount()~和~fsmount_me()~函数中。
这使得通用~mount()~函数保持不变,即可支持新的文件系统类型。

开发注释:
此函数将使用~get_file_system_options()~来判断挂载选项~("RO"~或~"RW")~是否正确。
它确认文件系统的~OPS~表已经被选中。
为挂载表条目分配空间并初始化临时挂载表的相关字段。
如果指定一个挂载点:将检查挂载点,以确定它是一个目录并且也有适当的权限允许文件系统挂载到这个目录上。
在当前的挂载链表中搜索,以确定没有其他的文件系统挂载在我们试图进行挂载的挂载点上。
如果在包含挂载点的文件系统的~OPS~表中定义了~mount~函数,那么在这个时候将调用他。

如果没有指定挂载点:按挂载链表项目建立基本文件系统。
如果~fsmount_me()~函数在被挂载文件系统的~OPS~表中指定了,即调用函数来初始化新的文件系统。
在成功完成后,记录了挂载文件系统的临时挂载表项将放到挂载表链上。

4.21 open
文件:open.c

处理:此函数是建立在~RTEMS~调用和文件系统的自己实现的~open()~函数。
这些功能的接口应该不会为新文件系统而改变,因此在引入新文件系统进入系统中代码是稳定的。

开发注释:这个函数为即将打开的一个文件或设备分配文件控制块。
然后它将测试路径是否存在。如果存在将填充一个~rtems_filesystem_location_info_t~结构的数据。
此结构包含的信息与节点的信息、文件系统特定的函数和该路径的挂载链表的信息相关。

如果指定了创建选项,它尝试着在指定的路径下创建一个普通文件的节点。
如果该文件已经在指定的路径下存在,将会产生一个错误,否则,在包含该路径的文件系统下将为该文件分配一个节点。
当创建了一个新的节点时,也会对其进行评估,以便为新创建节点的~rems_filesystem_location_info_t~数据结构内填充合适的信息。
如果文件已存在或已被成功创建,将使用详细描述节点和文件系统数据的处理程序表信息,节点信息和
~rtems_filesystem_location_info_t~数据结构初始化该文件控制块结构。
如果~open()~函数存在与节点所在文件系统的处理程序表中,我们
试图进行打开操作,将在这时调用它。
如果在过程中发现有任何错误,执行清理操作。它包括释放文件
控制块结构,是在通用~open()~函数开始时分配的。
一旦~open()~成功,计算文件描述符表的索引并将其返回给调用程序。

4.22 opendir
文件:opendir.c

处理:
这个函数尝试打开一个目录进行读访问。
这将建立一个目录控制结构用来访问目录信息。
此函数基于通用的~open()~函数和文件系统特定的目录处理函数。

开发注释:
BSD~小组提供这个函数。

4.23 pathconf
文件:pathconf.c

处理:这个函数将获取一个路径配置参数并返回给调用程序。
它基于通用的~open()~函数和~fpathconf()~函数。
增加新文件系统类型到系统中不会改变这些接口。

开发注释:
这个函数将按照路径尝试打开该文件。
如果成功,pathconf~使用~fpathconf()~函数并指定名称访问该文件的文件描述符中的值。
访问完成后关闭该文件。

4.24read
文件:deviceio.c

处理:
此函数基于一系列~RTEMS~的调用和文件系统自己的读取操作。
该功能基于这样的实现方式,使它们在引入新的文件系统时可以免于修改。

开发注释:
这个函数将检查它发送的文件描述符的类型。
如果这个文件描述符与网络设备相关联,读取函数将被映射一个特别的网络处理处理程序。
从网络处理程序返回的代码作为通用~read()~函数的返回代码被返回。
对于与该文件系统相关联的文件描述符将顺序执行下列操作:

  1.  获取文件控制块相关联的文件描述符;
  2.  检查文件描述符的范围;
  3.  确定缓冲区的指针是有效的;
  4.  检查计数不为零;
  5.  检查文件控制块确定我们是否有读取权限;
  6.  如果在处理程序表中有~read()~函数,调用处理程序表中的~read()~函数;
  7.  使用从处理程序表中的~read()~函数的返回值(读取的字节数)加入文件控制块中的偏移量字段;
  8.  返回读取的字节数给调用程序。




4.25 readdir

文件:readdir.c

处理:这个函数从~BSD~小组获得。没有对原来的代码做任何的修改。

开发注释:
该函数调用一个由用户提供的~getdents()~函数。这个函数提供文件系统读取目录的特殊信息。
它基于目录处理程序表中的~read()~函数。此函数已被映射到~Imfs_dir_read()~函数。

4.26 unmount
文件:unmount.c

处理:这个例程将尝试挂载的文件系统卸除,然后释放所有资源
被分配给该文件系统的管理。

开发注释:

 这个程序将确定是否有已挂载的文件系统挂载在我们正在试图卸载的文件系统上。这将防止卸载文件系统;
 它将测试当前目录是否在我们正在试图卸载的文件系统中。这将防止卸载文件系统;
 它会扫描所有当前打开的文件描述符,以确定是否有是一个已打开的文件描述符在我们正试图~unmount()~的文件系统中。


如果上述条件得到满足,然后按以下顺序执行:

  1.  调用包含该挂载点的文件系统的~unmount()~函数。这个函数应指示挂载点下面没有挂载文件系统;
  2.  为我们试图卸载的文件系统调用它的~fsunmount_me()~函数,
  3. 这个函数应该清理被卸载文件系统的管理过程中一些不再需要的资源;
  4.  移除挂载表中的刚刚从挂载链表中卸载的文件系统;
  5.  释放与移除的挂载表项相关联的内存。

 

Ubuntu下编译RTEMS 说明由于RTEMS 的最新版本4.12的使用信息并不完善,我们决定采用更加完善稳定的RTEMS 4.11版本,配套使用4.11的RTEMS Resource Builder。Linux下RTEMS工具链的安装Linux下的RTEMS工具链包括gcc, gdb, python等,首先使用命令安装这些工具* $ sudo apt-get build-dep binutils gcc g++ gdb un 阅读详情

相关推荐

RTEMS的BSP开发流程

RTEMS BSP 的开发流程图,一共分为 8 个步骤:建立开发环境、选择 BSP 模板、新建 BSP 目录、建立 BSP 配置文件、修改 Makefile、修改启动代码、配置 RTEMS 和编译测试和运行。第一步:建立开发环境。主要是针对 Linux 上的环境配置,将 Linux 作为宿主环境,开发板作为目标环境。 第二步:选择 BSP 模板。这一步主要是针对目标开发板,寻找合适的 BSP。RT

蓝蓝蓝博特的博客 1761

RTEMS LIBIO

 为了让文件支持Unix标准的open, read, write, ioctl操作, RTEMS做了一层libio的封装,封装之后,用户不必了解libio过多,只要会用就行了,我没有仔细地看代码,就是看了看console.c 和 相关的termio函数,然后做了几个实验得出,若要使文件支持标准C的操作,只需要操作rtmes驱动函数中的最后一个参数,即 void *arg,简述如下:

1032

RTEMS4.11 FEDORA20 64BIT环境搭建

之前一直在MCU上用的是UCOS系统,虽然UCOS小巧易用,但终究是收费的而且过于简单的OS。在机缘巧合之下,了解到了RTEMS、NUTTX,在RTEMS、NUTTX、ECOS中徘徊了一段时间之后,决定使用RTEMS。ECOS在STM32上有点庞大,NUTTX跟RTEMS相比,比较年轻,稳定性不如RTEMS经过验证。 1.感谢 在此首先感谢Ray大神,最早是根据Ray的www.rtems.ne

qq_30136173的博客 1165

解决 Install fail! Error: ENOTSUP: operation not supported on socket, symlink

解决 Install fail! Error: ENOTSUP: operation not supported on socket, symlink

gusijin的博客 2285

飞腾CPU运行RTEMS6.0

飞腾CPU运行RTEMS

lizongjun126com的博客 1342

npm ERR! code ENOTSUPnpm ERR! notsup Unsupported engine for asset-transfer-basic@1.0.0: wanted: {“n

npm ERR! code ENOTSUP npm ERR! notsup Unsupported engine for asset-transfer-basic@1.0.0: wanted: {"node":">=14"} (current: {"node":"10.19.0","npm":"6.14.4"}) npm ERR! notsup Not compatible with your version of node/npm: asset-transfer-basic@1.0.0 npm ERR!

lws24919的博客 3063

rtems文件系统(1)

本文主要整理了 rtems 文件系统相关的知识。rtems 架构支持• Mountable file systems 可挂载• Hierarchical file system directory structure 分级• POSIX compliant set of routines for the manipulation of files and directories         p

wangbinyantai的专栏 817

计算机系统基础实验lab4-LinkLab

计算机系统基础实验lab4-LinkLab 逐步修改一个由多个二进制模块(.o文件)组成的程序(称为“linkbomb”),使其在运行时满足实验指定的行为要求 基于ELF文件格式和程序链接过程的理解,修改给定二进制可重定位目标文件的数据内容、机器指令、重定位记录等部分

RTEMS文件系统(4):系统调用开发信息(上)

<br />4 system Call Development Notes<br /> 这一套例程代表应用程序中~RTEMS~文件系统为文件和目录提供的接口。<br /> 所有函数都与~POSIX~标准兼容,如果一个特定的接口已经实现。<br /> 下面的列表列出的例程是应用程序接口一部分。<br />access()chdir()chmod()chown()close()closedir()dup()dup2()fchmod()fcntl()fdatasync()fpathconf()fstat()

雪松's RTEMS 2105

计算机系统基础实验四.pdf

熟悉LC-3Edit 与Simulate软件,掌握IO操作,TRAP指令的编程和IO中断的处理机制。使用LC-3Edit 编写汇编程序,通过键盘向计算机中输入一个字符串当输入7的时候,停止输入字符串,并将结果按照逆序的方式输出。例如输入“ABCD7”,在屏幕上显示DCBA。

计算机系统基础实验二-二进制炸弹.doc

计算机系统基础实验二-二进制炸弹.doc

RTEMS文件系统(4):系统调用开发信息(中)

4.11 fdatasync 文件:fdatasync.c 处理:此函数是内存文件系统(IMFS)的模板,将指导我们到相应的处理函数进行~fdatasync()~处理。 在内存文件系统中该函数是非必要的。在一个采用内存高速缓存的磁盘文件系统上它的功能是将数据缓冲区的数据写入磁盘。 它基于以下函数和宏:  rtems_file_descriptor_type();  rtems_libio_iop();  rtems_libio_check_fd();  rtems_libio_check_p

雪松's RTEMS 1778

bomb实验报告

深入理解计算机系统中的一个实验,bomb实验,也就是拆炸弹,有详细的实验步骤讲解和截图

RTEMS 文件系统设计指南

RTEMS 文件系统设计指南 filesystem.RTEMS文件系统设计指南.双语.V20131224.pdf RTEMS 的filesystem文档的原创翻译。 目录 前言 15 1 路径名评估 19 1.1 路径名评估处理程序 19 1.2 在路径评估期间穿越挂载点 19 1.3 rtems_filesystem_location_info_t结构 20 2 系统初始化 23 2.1 基础文件系统 24 2.1.1 基础文件系统的挂载 25 3 挂载和卸载文件系统 27

天又亮了 1467

CSAPP 六个重要实验 lab4 实验指导书

CSAPP 六个重要实验 lab4 实验指导书

Deepracer 智能无人车-绿洲科学云平台介绍

Deepracer 智能无人车 绿洲科学云

woaixiyue19831的博客 1946

构建beagleboneblack的rtems5开发环境

编译环境说明 安装工具链 下载RTEMS内核源码 编译bsp包 编译rtems-libbsd 常见错误 一些脚本 编译环境说明 时间:2018.04.28. rtems-source-builder版本哈希值:10d3aaf。rtems-src哈希值8b5a801,rtems-libbsd哈希值ef5d536。我只是在我当前的版本编译成功,如果遇到问题无法解决可以...

bh_binghu的专栏 1995

安卓游戏存档修改全攻略:以《英雄迷宫冒险》为例(附避坑指南)

本文详细介绍了安卓游戏存档修改的全过程,以《英雄迷宫冒险》为例,涵盖基础认知、工具选择、实战修改及风险控制。通过十六进制编辑和UTF-8编码解析,玩家可以修改金钱、角色属性和物品数量等数据,同时提供了避坑指南和伦理考量,帮助玩家在享受修改乐趣的同时保持游戏体验的平衡。

weixin_29209801的博客 392

RTEMS 开发环境指南

RTEMS 开发环境指南 develenv.RTEMS开发环境指南.双语.V20131224.pdf RTEMS 的develenv文档的原创翻译。 目录 1 简介 7 2 目录结构 9 2.1 c/ 目录 14 2.1.1 c/src/ 目录 15 2.1.1.1 c/src/lib/libbsp BSP目录 18 2.2 CPU工具箱目录 19 2.3 testsuites/测试套件 24 2.4 Documentation目录 26 3 示例应用程序 31

天又亮了 1958

从‘眼花缭乱’到‘心中有数’:rs-fMRI统计分析全流程避坑指南(附DPABI操作截图)

本文详细解析了rs-fMRI统计分析的全流程,从质量控制到统计模型选择,再到多重比较校正和结果解读。特别针对DPABI软件操作中的常见陷阱提供实用指南,帮助研究者避免FDR和GRF校正等关键环节的错误,实现从数据混乱到清晰分析的转变。

weixin_33686714的博客 398

SAP 调用Ftp服务器

FTP(File transfer protocol)是一种标准的网络协议,可以用于在互联网上传递文件。SAP系统中可通过系列配置和提供的些标准函数,用于查看、更新、下载FTP服务器上的文件。提示:以下是本篇文章正文内容,下面案例可供参考。

qq_38304013的博客 1418
上一篇: RTEMS文件系统(4):系统调用开发信息(中)
下一篇: RTEMS文件系统(5):文件系统实现需求(上)
coolbacon
博客等级 码龄22年 1766粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值