netlink

###1. netlink linxu选择将关键并且性能要求较高的代码放置在内核空间, 其它的代码, 例如GUI等, 放置在用户空间中运行, 因此, 很多时候需要kernel与userspace之间的通信 kernel与userspace之间存在着多种IPC方法, 例如系统调用, ioctl, proc文件系统以及netlink socket Netlink socket是用于内核和用户空间之间交换信息的特殊的IPC机制。它提供了一种全复用的通信链路。和TCP/IP使用的地址族AF_INET相 比,Netlink socket使用地址族AF_NETLINK,每个的netlink socket特征定义协议类型在内核头文件中include/linux/netlink.h ###2. netlink的优势 为了linux的稳定性,不建议在轻易为不常用的功能来添加系统调用,而使用ioctl和proc文件系统相对也比较复杂, 而添加一个新的netlink协议类型较简单 同socket API一样,Netlink是异步的,它提供了一个socket队列来平滑突发的信息, netlink消息将排列在接受者的netlink队列中, 然后调用接收者的处理函数 netlink socket的一大优势是支持多播, 一个进程可以将一条消息广播到一个netlink组地址。任意多的进程可以监听那个组地址。这提供了一种从内核到用户空间进行事件分发接近完美的机制 netlink socket的另一优势是双向IPC, userspace和kernel可以互向对方发送消息, 而系统调用和ioctl是单一的IPC 5. netlink socket 使用标准的sockt API, 容易使用 ###3....

linux 内核镜像文件种类

###1. kernel 镜像文件种类 linux kernerl镜像文件按照格式可以分为如下几种: vmlinux zImage bzImage uImage vmlinuxz ###2. vmlinux: 编译生成的最原始的内核文件, 没有经过压缩。 ###3. zImage: vmlinux经过gzip压缩后的文件, 包含自解压代码。 ###4. bzImage: bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。 ###5. uImage: U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag(64个字节,说明这个映像文件的类型、加载位置、生成时间、大小等信息)。其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。 ###6. vmlinuxz: vmlinuxz是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接

使用proc文件系统导出信息

###1. 创建 /proc 节点 struct proc_dir_entry 内核使用 proc_dir_entry 结构体来描述 /proc 文件系统中的一个目录或者文件节点 struct proc_dir_entry { unsigned int low_ino; umode_t mode; nlink_t nlink; kuid_t uid; kgid_t gid; loff_t size; const struct inode_operations *proc_iops; const struct file_operations *proc_fops; struct proc_dir_entry *next, *parent, *subdir;...

i2c 驱动

###1. i2c总线: i2c是“Inter-IC” bus 的缩写,它是一种广泛应用于低速率通信的简单的总线协议。由于它是一个许可商标, 有些厂商也使用其它的名称(比如”Two-Wire Interface”, TWI) ,i2c只需要两根信号线(时钟线SCL,数据线SDA),大部分i2c设备使用7bit地址,总线速率可达400KHz(高速扩展可达3.4MHz,但很少被使用)。i2c是一条多主机总线,开漏信号被用来在主机之间来进行仲裁,以及在慢速设备之间进行握手及同步时钟。 ###2. linux的i2c接口: linux的i2c接口只支持主机端的通信,i2c接口围绕两种驱动和两种设备来组织,适配器驱动(“Adapter Driver”)用来抽象硬件上的i2c控制器,它绑定到一个物理设备(可能是PCI设备或者平台设备),并为它管理的每一条i2c总线使用一个结构体“i2c_adapter”来表示。而在i2c总线上, 使用结构体”i2c_client”来代表挂接在上面的i2c设备。这些i2c设备都应该绑定到一个结构体“i2c_driver”上以符合linux的驱动模型。有一系列的函数用来进行i2c协议的操作,到目前为止, 只能从任务上下文中使用它们. linux中i2c驱动框架中,分为总线(BUS)驱动和设备(DEVICE)驱动,总线驱动的职责是为系统中每一个i2c总线实现相应的读写方法,提供给设备驱动来使用,但是总线驱动并不进行任何的通信。设备驱动则是与挂接在i2c总线上的设备进行通讯的驱动,通过i2c总线驱动提供的方法, 设备驱动可以忽略不同的i2c总线控制器的差异。 ###3. i2c总线驱动: 在系统开机时, 首先装载总线驱动,一个驱动用于支持一条特定的i2c总线的读写,一个总线驱动通常使用两个数据结构来描述: i2c_adapter i2c_algorithm ####3.1 i2c_adapter i2c_adapter 用于描述一个特定的i2c总线控制器 struct i2c_adapter { struct module *owner; unsigned int class; /* classes to allow...

i2c 总线

###1. i2c总线 I2C最初是由Philips提出,用于IC之间的互联,如今已经被全球超过50个公司的1000+个ICs所使用,已经是一个世界标准, 其标准文档为《I2C-bus specification and user manual》,I2c总线的特点如下: 只需要两根线,一个串行数据线(SDA)额一个串行时钟线(SCL) 使用 主-从 机的设计, 是真正的多主机总线,如果有两个或多个主机初始化数据传输,可以通过冲突检测和仲裁来防止数据被破坏 串行的8位双向数据传输在标准模式下达到100kb/s,快速模式下是400kb/s,超速模式下是3.4Mb/s 总线上连接的最大IC数量由总线最大的电容所限制 与多种不同的控制总线是兼容的,比如SMBus(系统管理总线),PMBus(电源管理总线),IPMI(智能平台管理总线),DDC(显示数据通道)以及ATCA(高级电信架构) i2C总线理论上传输速度可以为 100KHz (标准) 400KHz (全速) 1MHz (快速) 3.4MHz (高速) 目前还没有成熟的3.4MHz速率的产品, I2C总线是板内总线,总线内部有地址管理和仲裁机制,在总线容量、slave地址等技术指标正确的情况下,数据的完整性和安全性是有保证的 i2c相关信息可参考 i2c bus ###2. i2c总线的负载能力 i2c总线上可连接的的设备数目受总线上电容大小的限制: 标准模式(100KHz)时, 总线电容 <= 400pF 快速模式(400KHz)时, 总线电容 <=...