热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FreeBSD系统内核对象

FreeBSD系统内核对象--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
内核对象,也就是Kobj,为操作系统内核提供了一种面向对象的C语言编程方式。被操作的数据也承载操作它的方法。这使得在不破坏二进制兼容性的前提下,某一个接口能够增/减相应的操作。Kobj工作时,产生方法的描述。每个描述有一个唯一的标识和一个缺省函数。某个描述的地址被用来在一个类的方法表里唯一的标识方法。 构建一个类,就是要建立一张方法表,并将这张表关联到一个或多个函数(方法);这些函数(方法)都带有方法描述。使用前,类要被编译。编译时要为这个类分配一些缓存。在方法表中的每个方法描述都会被指派一个唯一的标识,除非已经被其它引用它的类在编译时指派了标识。对于每个将要被使用的方法,都会由脚本生成一个函数(方法查找函数),以解析外来参数,并在被查询时给出方法描述的地址。被生成的函数(方法查找函数)凭着那个方法描述的唯一标识按Hash的方法查找对象的类的缓存。如果这个方法不在缓存中,函数会查找使用类的方法表。如果这个方法被找到了,类里的相关函数(也就是某个方法的实现代码)就会被使用。否则,这个方法描述的缺省函数将被使用。 这些过程可被表示如下: 对象->缓存<->类

如何使用Kobj
结构
struct kobj_method

函数
void kobj_class_compile(kobj_class_t cls);
void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
void kobj_class_free(kobj_class_t cls);
kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);
void kobj_init(kobj_t obj, kobj_class_t cls);
void kobj_delete(kobj_t obj, struct malloc_type *mtype);


KOBJ_CLASS_FIELDS
KOBJ_FIELDS
DEFINE_CLASS(name, methods, size)
KOBJMETHOD(NAME, FUNC)

头文件
建立一个接口的模板

使用Kobj的第一步是建立一个接口。建立接口包括建立模板的工作。建立模板可用脚本src/sys/kern/makeobjops.pl完成,它会产生申明方法的头文件和代码,脚本还会生成方法查找函数。 在这个模板中如下关键词会被使用: #include, INTERFACE, CODE, METHOD, STATICMETHOD, 和 DEFAULT. #include语句的整行内容将被一字不差的复制到被生成的代码文件的头部。

例如: #include 关键词INTERFACE用来定义接口名。这个名字将与每个方法名接合在一起,形成 [interface name]_[method name]。语法是:INTERFACE [接口名]; 例如: INTERFACE foo; 关键词CODE会将它的参数一字不差的复制到代码文件中。语法是CODE { [任何代码] }; 例如:
CODE {
struct foo * foo_alloc_null(struct bar *)
{
return NULL;
}
};
关键词METHOD用来描述一个方法。语法是: METHOD [返回值类型] [方法名] { [对象 [, 参数若干]] }; 例如:
METHOD int bar {
struct object *;
struct foo *;
struct bar;
};
关键词DEFAULT跟在关键词METHOD之后,是对关键词METHOD的补充。它给这个方法补充上缺省函数。语法是: METHOD [返回值类型] [方法名] { [对象; [其它参数]] }DEFAULT [缺省函数]; 例如:
METHOD int bar {
struct object *;
struct foo *;
int bar;
} DEFAULT foo_hack;
关键词STATICMETHOD类似关键词METHOD。对于每个Kobj对象,一般其头部都有一些Kobj专有的数据。METHOD定义的方法就假设这些专有数据位于对象头部;假如对象头部没有这些专有数据,这些方法对这个对象的访问就可能出错。而STATICMETHOD定义的对象可以不受这个限制:这样描述出的方法,其操作的数据不由这个类的某个对象实例给出,而是全都由调用这个方法时的操作数(译者注:即参数)给出。这也对于在某个类的方法表之外调用这个方法有用。

其它完整的例子:
src/sys/kern/bus_if.m
src/sys/kern/device_if.m
建立一个类

使用Kobj的第二步是建立一个类。一个类的组有名字、方法表;假如使用了Kobj的“对象管理工具”(Object Handling Facilities),类中还包含对象的大小。建立类时使用宏DEFINE_CLASS()。建立方法表时,须建立一个kobj_method_t数组,用NULL项结尾。每个非NULL项可用宏KOBJMETHOD()建立。 例如:
DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));

kobj_method_t foomethods[] = {
KOBJMETHOD(bar_doo, foo_doo),
KOBJMETHOD(bar_foo, foo_foo),
{ NULL, NULL}
};
类须被“编译”。根据该类被初始化时系统的状态,将要用到一个静态分配的缓存和“操作数表”(ops table,译者注:即“参数表”)。这些操作可通过声明一个结构体struct kobj_ops并使用kobj_class_compile_static(),或是只使用kobj_class_compile()来完成。

建立一个对象

使用Kobj的第三步是定义对象。Kobj对象建立程序假定Kobj专有数据在一个对象的头部。如果不是如此,应当先自行分配对象,再使用kobj_init()初始化对象中的Kobj专有数据;其实可以使用kobj_create()分配对象,并自动初始化对象中的Kobj专有内容。kobj_init()也可以用来改变一个对象所使用的类。 将Kobj的数据集成到对象中要使用宏KOBJ_FIELDS。 例如:
struct foo_data {
KOBJ_FIELDS;
foo_foo;
foo_bar;
};
调用方法

使用Kobj的最后一部就是通过生成的函数调用对象类中的方法。调用时,接口名与方法名用'_'接合,而且全部使用大写字母。 例如,接口名为foo,方法为bar,调用就是: [返回值 = ] FOO_BAR(对象 [, 其它参数]);

当一个用kobj_create()不再需要被使用时,可对这个对象调用kobj_delete()。当一个类不再需要被使用时,可对这个类调用kobj_class_free()。
推荐阅读
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 说到C语言的语句块,真是一堆血泪史。第一大坑就是优先级。刚工作那会儿,C的书没看几本,自信满满的认为C语言都会了,拿出搞ACM培养的豪情壮志,代码倒是写得爽,却到处留 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
author-avatar
小金刚钻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有