「Efficient Android Threading 笔记」- C1 Android Components and the Need for Multiprocessing Android RecyclerView Android Socket Programming Supporting Multiple Screens Make a Reusable UI in Android App Development 如何在 Android Studio 中包含 *.so library,并使用库中定义的方法? 使用 SpannableString 格式化字符串,实现前景色、下划线、超链接、图文混排等 如何使用 bound service 完成进程间通信? 创建自定义视图 Creating custom views 通过 Android Theme & Style 定制应用的样式 「译」Android ViewPropertyAnimator 介绍 Android Animation Interpolator - Android 动画插值器源码笔记 「译」Android Animation in Honeycomb by Chet Haase(Android 3.0系统中的动画机制) 从 Android Sample ApiDemos 中学习 android.animation API 的用法 如何学习 Android Animation? 如何实现 Android ListView「上拉加载更多」? 「译」向Big Nerd Ranch提问:为什么Fragment在Android App开发中非常重要? 分类整理我在 SegmentFault 上针对某些问题作的回答 Android Servcie 后台服务总结笔记 如何在Android设备旋转时暂存数据以保护当前的交互状态? Android Message Handler 消息处理机制总结笔记 如何获取FragmentTabHost中指定标签页的Fragment? Fragment子类必须包含一个public无参构造器 如何更新及替换ViewPager中的Fragment? 如何使用Android UI Fragment开发“列表-详情”界面? 一个Android音频文本同步的英文有声读物App的开发过程 「Android编程权威指南笔记」Android应用本地化 通过jfeinstein10/SlidingMenu实现Android侧滑菜单 为Ubuntu14.04部署Android App的Eclipse开发环境 「Android编程权威指南笔记」使用ListFragment显示列表 「Android编程权威指南笔记」SDK版本与兼容 「Android编程权威指南笔记」Android布局和组件 「Android编程权威指南笔记」UI Fragment 「Android编程权威指南笔记」Activity 第一次开发iOS App和Android的对比总结笔记 「App Training笔记」创建第一个应用 「App Training笔记」开发入门训练大纲 Android APP - 从远程FTP服务器下载文件到本地

I/O体系结构(设备文件的标准I/O操作)

2013年12月18日

按照经典的UNIX箴言“万物皆文件”(everything is file),对外设的访问可利用/dev目录下的设备文件完成,程序对设备的处理完全类似于常规文件。设备驱动程序的任务是支持应用程序经由设备文件与设备通信,即,按适当的方式在设备上读取/写入数据。[ LKA-1.3.8 设备驱动程序、块设备和字符设备 ]

与外设的通信称为输入输出,缩写为I/O. 在实现外设I/O时,内核必须处理3个可能出现的问题:[ LKA-6.1 ]

  • 硬件寻址;
  • 向应用程序提供访问设备的方法,应当采取统一的方案,确保应用程序能够在不考虑硬件设备的情况下进行互操作;
  • 用户空间需要知道内核中有哪些设备可用。

这些问题通过层次化的多个抽象层解决。层次结构的最底层是硬件设备,它通过总线系统连接到系统CPU和其它设备。如下图 [ LKA-6.1-图6-1 ]:

LKA-6.1-Figure6.1-Layer-model-for-addressing-peripherals

文件I/O的标准库定义

应用程序调用open打开设备文件,若成功则返回文件描述符。读或写一个设备文件时,使用open返回的文件描述符标识该文件,将其作为参数传递给read或write. [ APUE-3 ]

int open(const char *pahtname, int oflag, .../* mode_t mode */);
ssize_t read(int filedes, void *buf, size_t nbytes);
ssize_t write(int filedes, const void *buf, size_t nbytes);
int close(int filedes);

文件I/O的内核定义

内核(kernel/include/linux/fs.h)定义了一组文件操作的函数指针集合,包括打开、读取、写入等。 [ LKA-8.3.4, 8.2.4 ], [ LDD3-3.一些重要的数据结构.文件操作 ]

struct file_operations {
    int (*open) (struct inode *, struct file *);
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 
}

编辑历史

  • 2013-12-18 初稿
  • 2014-01-06 使用markdown编辑格式

知识共享许可协议
li2的博客WeiYi.Li 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
© 2011-2017. All rights reserved by WeiYi.Li. Powerd by Jekyll & LinAnYa's Theme