linux 虚拟块设备

###1. 虚拟块设备 虚拟块设备是指不存在真实的物理块设备, 而是在内存上模拟(ramdisk)或者使用文件模拟(loop device)的块设备。 ###1. ramdisk ramdisk是一种内存中的一块区域当作物理磁盘来使用的技术,它在内存中创建一个快设备, 用来存放文件系统,掉电后文件内容会消失, 不能用于长期保存文件爱你的介质。为了使用ramdisk必须在编译内核时配置选项“CONFIG_BLK_DEV_RAM”。为了在内核的加载阶段就使用ramdisk, 还必须配置”CONFIG_BLK_DEV_INITRD”. ramdisk的大小固定, 安装在上面的文件系统的大小也是固定的。ramdisk在使用的时候,和高速缓存之间有数据拷贝,还需要文件系统的驱动来格式化和解时这些数据,使用ramdisk浪费了内存,污染了cache, 加重了cpu的负担,而且所有的文件访问都需要通过页和目录缓存来进行,这些工作都是ramfs需要执行的,另外, 回环设备提供了一个根为灵活和方便的方式(通过文件而不是大块内存)来创建一个块设备。因此, linux2.6以后已经废弃了ramdisk. 可以使用 loop device ramdisk与ramfs的区别: ramdisk有一块内存作为后端, 因此可以 挂载/回写/格式化 ###2. loop device loop device是linux上的一种特殊的块设备,它通过映射操作系统上正常的文件来虚拟你个块设备。这种机制为我们创建一个特定文件系统的镜像提供了条件。 创建文件系统镜像的步骤: 1.使用dd命令创建一个指定大小的空白文件 dd if=/dev/zero of=img_file bs=1k count=10000 2.使用·losetup命令关联循环设备和img_file文件 losetup /dev/loop0 img_file 3.使用mkfs命令创建一个文件系统...

generic netlink

###1. generic netlink netlink 一文中对linux的netlink的使用做了一个简单的介绍, 可以根据需要自己定义新的netlink协议类型,内核的一些子系统(例如 uevent,netfilter)定义了一些专用的netlink协议类型, 如果没有特殊需求, 不必去自定义netlink 协议类型,大可使用generic netlink netlink仅支持32种协议类型,这在实际应用中可能并不足够, 而generic netlink支持1023个子family(一个family是一堆服务的集合) generic netlink使用定义的NETLINK_GENERIC协议类型, 并提供一组数据结构和api给内核代码使用, 无需,也不要使用kernel提供的原生的netlink的API去使用NETLINK_GENERIC协议类型 generic netlink工作在NETLINK_GENERIC协议类型之上,内核中不同的用户使用generic netlink,并且希望在generic netlink上监听消息时 需要注册自己的falmily和对应的operations ###2. generic netlink的消息结构 generic netlink的消息结构如下 在generic netlink中, nlmsghdr->nlmsg_type保存了family id(必须依靠它来支持多达1023个family) generic netlink在netlink的payload字段作出了扩展, 在头部添加了genlmsghdr和可选的user head,genlmsghdr中保存了消息的cmd,每一个消息对应有一个cmd, 并携带若干个attr ###3. 内核中使用generic netlink...

linux 内存文件系统

###1. 内存文件系统 大部分的文件系统,建立在可持久存储的设备上, 如磁盘, U盘等, 而内存文件系统则是将一块内存空间作为存储介质, 构建在其上的文件系统, linux中最常见的两种内存文件系统是ramfs和tempfs。 ###2. ramfs ramfs是一种简单的文件系统,它直接利用了linux的高速缓存机制(因此代码很小, 直接集成在内核代码中,不能被配置),使用系统的物理内存做成一个基于内存的文件系统。 ramfs工作于虚拟文件系统层(VFS),不能被格式化, 可以创建多个。 ramfs和其它的文件系统最大的差别就是, 它没有真正的对应的文件系统设备(如磁盘,U盘等),为ramfs分配的高速也缓存和目录缓存不能被标记为clean的状态, 系统永远也不会释放ramfs所占用的高速缓存,故只有root用户有权限操作ramfs. ramfs只能在物理内存中创建(虚拟内存包括物理内存和交换空间,ramfs不能被交换到磁盘上). ###3. tempfs tempfs在ramfs的基础上增加了回写设备,增大了容量大小限制,允许向交换分区写入数据,因此, 普通用户也可以使用tempfs。 tempfs是一种虚拟内存文件系统, 它不同于用块设备实现的ramdisk, 也不同于针对于物理内存的ramfs,它直接向虚拟内存子系统来请求页来存储文件, 自身并不清楚请求的页存在于内存上还是交换分区上。 因此, tempfs是一种建立在虚拟内存上的文件系统。 tempfs和ramfs一样, 不能被格式化, 大小固定。 ###4. rootfs rootfs是一个ramfs或者tempfs的实例,大部分文件系统安装在rootfs之上,然后忽略它, 它是linux启动的初始化根文件系统。

i2c-dev接口

###1. i2c-dev 通常,i2c设备由一个内核驱动程序来控制,但是在用户空间,还是能够直接访问某个i2c设备。因为, i2c-dev接口为我们导出了i2c总线驱动的操作接口, 位于linux内核i2c驱动目录下的 “i2c-dev.c” 文件 针对每一个I2C适配器,i2c-dev 生成一个主设备号为89的字符设备 “/dev/i2c-x”,它们的次设备号为该i2c总线的总线号(所有的256个次设备号全部可用),可以通过检查“/sys/class/i2c-dev”目录查看具体的i2c总线控制器所对应的总线号。也可以使用”i2c-tool”工具包中的 i2cdetect -l命令来获取系统中所有的i2c适配器的列表,注意,i2c总线的编号可能是动态分配的,有可能在系统重启后变为不同的值。 linux kernel 中的i2c-dev.c中实现了“/dev/i2c-x”的文件操作接口 static const struct file_operations i2cdev_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = i2cdev_read, .write = i2cdev_write, .unlocked_ioctl = i2cdev_ioctl, .open = i2cdev_open,...

android.mk

###1. android.mk Android.mk 用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk 中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。 Android.mk 中的内容大致可以分为3种: 预定义变量(例如 LOCAL_MODULE) 调用预定义函数(例如 $(call my-dir)) include 预定义Android.mk文件(例如include(CLEAR_VARS)) ###2. 预定义变量 1. LOCAL_PATH : 一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件, 通常使用 LOCAL_PATH:=$(call my-dir) 来赋值, my-dir为android编译系统中预定义的函数, 用于返回当前路径 2. LOCAL_PACKAGE_NAME : 生成package的名字(例如指定为app, 则生成app.apk), 编译apk时需要指定 3. LOCAL_MODULE : 以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,例如,一个被命名为’foo’的共享库模块,将会生成’libfoo.so’文件 4. LOCAL_IS_HOST_MODULE...