背景:

笔者由于一个项目,这段时间在使用FreeBSD进行内核模块的编程。

之前做过一段时间的Linux下驱动模块编程。对Linux下的模块编程还算熟悉。

如今突然转到FreeBSD下。尽管Linux和FreeBSD两者都是类Unix系统。在实现机制上还是区别非常大的,多少有点不习惯。笔者的项目要在一个插入进内核的模块里。将log信息写入到磁盘的中。在用户层能够用读写文件的形式;在内核模块中,与Linux不同的是。并不推荐用户使用将这样的方法移植到内核模块中。

可是FreeBSD却提供了一种ALQ机制。

ALQ机制依赖于ALQ模块,在sys/conf/files中,能够看到它是可选的。

简单介绍:

ALQ(Asynchronous Logging Queues) 异步日志队列,提供了一种异步的定长和变长的record机制。

它可以记录不论什么vnode。因此能对日志、字符设备及普通文件进行操作。

全部的功能函数接受一个struct alq的參数,struct alq是一种隐含类型,维护一个ALQ的状态信息。这样的logging机制作为一个独立的内核线程来执行的,可以为系统全部的log请求服务。每个ale(asynchronous
log entry)定义成一个struct ale,结构例如以下:

<span style="font-size:12px;"><span style="font-size:10px;">	   struct ale {
intptr_t ae_bytesused; /* # bytes written to ALE. */
char *ae_data; /* Write ptr. */
int ae_pad; /* Unused, compat. */
};</span></span>

一个alq能够以定长或变长的两种模式创建。可变长度的alq适应alq_writen()alq_getn()使用时写的长度。 而定长的alq在队列创建时就已经指定好了。定长模式如今已经被弃用,能够使用变模式来取代它。

函数:

#include <sys/alq.h>

int alq_open_flags(struct alq **app, const char *file, struct ucred *cred, int cmode, int size, int flags);  创建一个可变长的alq。

file为文件名称。

假设文件不存在,alq_open()会试图创建它,而且cmode參数会被传递给alq_open()作为创建文件的属性。 对多数用户来说这个cmdode应被指定为ALQ_DEFAULT_CMODE。

当打开文件和进行I/O操作时,cred參数指定信任证书。size设置队列的大小(单位为字节)。最后一个參数flag通常被设置成ALQ_ORDERED来  指明写线程等待忙碌的alq释放资源的顺序应该被保留。成功返回0,否则返回错误码(open(2))。



int alq_open(struct alq **app,const char *file,struct ucred *cred, int cmode, int size, int count);被弃用的alq_open()封装在alq_open_flags()中。为了兼容老版本号。

全部的         參数都是通过alq_open_flags()间接传递的。

详细的我在此不作介绍,有兴趣的读者能够參考alq

int alq_writen(struct alq *alq, void *data, int len, int flags);从data把len字节的数据写入到设置地可变长模式的alq中。假设alq_write()不能马上写  入这个数据,同一时候flags參    数又设置了ALQ_WAITOK。那么它将使用msleep_spin(9)睡眠等待数据。

一个写操作会自己主动调度队列alq使     之写入磁盘。这样的行为能够通过给flags參数传递
ALQ_NOACTIVATE。来控制它不会被写入磁盘。假设设置ALQ_NOWAIT或队列已满或系统关机,返回EWOULDBLOCK。
int alq_write(struct alq *alq, void *data, int flags);被弃用的alq_write()封闭在alq_writen()中。有兴趣的读者能够參考query=alq&apropos=0&sektion=0&manpath=FreeBSD+10.1-RELEASE&arch=default&format=html">alq
void alq_flush(struct alq *alq);刷新alq到log文件。

假设alq有数据可被刷新。而且没有没有进行在刷新。那么它将会堵塞。去进行IO操作。

否则马上返回。

void alq_close(struct alq *alq);关闭alq。刷新全部的挂起的写请求到log文件。释放申请的全部资源。

struct ale * alq_getn(struct alq *alq, int len, int flags);从alq队列中返回一个ale。它会让alq处于锁定状态直到子alq_post()或alq_post_flags被调用。假设
alq_getn()不能马上获取到len长度字节数据,而且在flags中设置了ALQ_WAITOK,它将会堵塞等待数据。调用者能够通过事先设置struct ale中的 ae_bytesused域,选择返回小于len字节到ale中。假设设置ALQ_NOWAIT或队列已满或系统关机,返回NULL。
struct ale * alq_get(struct alq *alq, int flags); 被弃用。封装于alq_getn()中。
void alq_post_flags(struct alq *alq, struct ale *ale, int flags);调度ale(从alq_getn()或alq_get()中获取)用于写alq。

能够在flags參数中设置ALQ_NOACTIVATE指明队列不会马上被刷新到磁盘。 会对alq进行解锁。

參考文献:

    ALQ

FreeBSD内核之中的一个 ALQ机制的使用的更多相关文章

  1. FreeBSD 5.0中强制访问控制机制的使用与源代码分析【转】

    本文主要讲述FreeBSD 5.0操作系统中新增的重要安全机制,即强制访问控制机制(MAC)的使用与源代码分析,主要包括强制访问控制框架及多级安全(MLS)策略两部分内容.这一部分讲述要将MAC框架与 ...

  2. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  3. 【转】深入Windows内核——C++中的消息机制

    上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32 ...

  4. Linux 内核的文件 Cache 管理机制介绍

    Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...

  5. [转] Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  6. Linux内核分析-构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel C ...

  7. 【IPC进程间通讯之中的一个】邮槽MailSlot

    IPC进程间通信+邮槽MailSlot                IPC(Inter-Process Communication.进程间通信).        现代计算机採用虚拟内存机制,为进程提 ...

  8. 【eclipse插件开发实战】Eclipse插件开发1——eclipse内核结构、扩展点机制

    Eclipse插件开发实战1--eclipse内核结构.扩展点机制 一.前言 本系列总体介绍eclipse插件开发基本理论.插件项目结构及开发步骤,最后再给出两个插件开发实例. 总体安排结构如下: 1 ...

  9. Objective-C(十九、通知-消息发送模式之中的一个)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结. 知识点一直在变.仅仅是作为參考.以苹果官方文档为准~ 十九.通知-消息 ...

随机推荐

  1. [Windows Server 2012] 安装Apache+PHP+MySQL

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2012 ...

  2. Cesium学习笔记(九):导入3D模型(obj转gltf)

    在用cesium的过程中难免需要导入别人做好的3D模型,这时候就需要将这些模型转成gltf格式了 当然,官方也给了我们一个网页版的转换器,但是毕竟是网页版的,效率极其低下,文件还不能太大,所以我们就需 ...

  3. PHP连接mysql8.0出错“SQLSTATE[HY000] [2054] The server requested authentication method unkno…

    今天安装安装一个叫得推校园O2O系统的使劲都说连接不上服务器. 下面是安装说明,我直接进行3步骤,导入数据库配置文件,结果就显示题目报错的内容 安装说明: 直接输入程序目录即可 http://loca ...

  4. /etc目录常用配置文件

    /etc/resolv.conf DNS客户端配置文件,逐渐被网卡配置文件所替代 /etc/hosts 本机DNS解析文件,优先级高于DNS服务器 /etc/hostname CentOS 7 主机名 ...

  5. Java类及成员

    Java类及成员 类 类是对一类事物的的描述,是抽象的概念上的定义:类是创建对象的模板: public class TestClass { public static void main(String ...

  6. 关于桌面程序被安全软件误判为HEUR:Trojan.Win32.Generic的解决方案

    最近写了一个桌面程序,里面用了些读取系统环境变量.提取文件图标.启动外部程序之类的操作. 然后…………卡巴斯基就把它识别成了HEUR:Trojan.Win32.Generic………… 咱遵纪守法好程序 ...

  7. 【python】详解numpy库与pandas库axis=0,axis= 1轴的用法

    对数据进行操作时,经常需要在横轴方向或者数轴方向对数据进行操作,这时需要设定参数axis的值: axis = 0 代表对横轴操作,也就是第0轴: axis = 1 代表对纵轴操作,也就是第1轴: nu ...

  8. [系统资源攻略]CPU使用率和负载

    我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段.服务器的CPU利用率高,则表明服务器很繁忙.如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统 ...

  9. RAID级别简介

    独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(RAID, Redundant Array of Inexpensive ...

  10. python编码小记

    Python编码小记 标签(空格分隔): 编程 python 1.list类型remove()操作 列表对象执行remove()函数后,会自动退出循环,所以如果想利用一个单独的for循环删除列表中多个 ...