# 编写OpenSolaris内核模块

596人阅读 评论(0)

On opening day, I chose to post an entry on adding a system call to OpenSolaris. Considering the feedback, I thought I'd continue with brief "How-To add to OpenSolaris" documents for a while. There's a lot to choose from here, so I'll just pick them off as quick as I can. Todays topic as adding a new kernel module to OpenSolaris.

For the sake of discussion, we will be adding a new module that does nothing apart from print a message on load and unload. It will be architecture-neutral, and be distributed as part of a separate package (to give you a taste of our packaging system). We'll continue my narcissistic tradition and name this the "schrock" module.

To begin, you must put your source somewhere in the tree. It must be put somewhere under usr/src/uts/common, but exactly where depends on the type of module. Just about the only real rule is that filesystems go in the "fs" directory, but other than that there are no real rules. The bulk of the modules live in the "io" directory, since the majority of modules are drivers of some kind. For now, we'll put 'schrock.c' in the "io" directory:

#include <sys/modctl.h>#include <sys/cmn_err.h>static struct modldrv modldrv = {	&mod_miscops,	"schrock module %I%",	NULL};static struct modlinkage modlinkage = {	MODREV_1, (void *)&modldrv, NULL};int_init(void){	cmn_err(CE_WARN, "OpenSolaris has arrived");	return (mod_install(&modlinkage));}int_fini(void){	cmn_err(CE_WARN, "OpenSolaris has left the building");	return (mod_remove(&modlinkage));}int_info(struct modinfo *modinfop){	return (mod_info(&modlinkage, modinfop));}

The code is pretty simple, and is basically the minimum needed to add a module to the system. You notice we use 'mod_miscops' in our modldrv. If we were adding a device driver or filesystem, we would be using a different set of linkage structures.

### 2. Creating Makefiles

We must add two Makefiles to get this building:

usr/src/uts/intel/schrock/Makefileusr/src/uts/sparc/schrock/Makefile

With contents similar to the following:

UTSBASE = ../..MODULE          = schrockOBJECTS         = $(SCHROCK_OBJS:%=$(OBJS_DIR)/%)LINTS           = $(SCHROCK_OBJS:%.o=$(LINTS_DIR)/%.ln)ROOTMODULE      = $(ROOT_MISC_DIR)/$(MODULE)include $(UTSBASE)/intel/Makefile.intelALL_TARGET =$(BINARY)LINT_TARGET     = $(MODULE).lintINSTALL_TARGET =$(BINARY) $(ROOTMODULE)CFLAGS +=$(CCVERBOSE).KEEP_STATE:def:            $(DEF_DEPS)all:$(ALL_DEPS)clean:          $(CLEAN_DEPS)clobber:$(CLOBBER_DEPS)lint:           $(LINT_DEPS)modlintlib:$(MODLINTLIB_DEPS)clean.lint:     $(CLEAN_LINT_DEPS)install:$(INSTALL_DEPS)include $(UTSBASE)/intel/Makefile.targ ### 3. Modifying existing Makefiles There are two remaining Makefile chores before we can continue. First, we have to add the set of files to usr/src/uts/common/Makefile.files: KMDB_OBJS += kdrv.oSCHROCK_OBJS += schrock.oBGE_OBJS += bge_main.o bge_chip.o bge_kstats.o bge_log.o bge_ndd.o / bge_atomic.o bge_mii.o bge_send.o bge_recv.o If you had created a subdirectory for your module instead of placing it in "io", you would also have to add a set of rules to usr/src/uts/common/Makefile.rules. If you need to do this, make sure you get both the object targets and the lint targets, or you'll get build failures if you try to run lint. You'll also need to modify the usr/src/uts/intel/Makefile.intel file, as well as the corresponding SPARC version: MISC_KMODS += usba usba10MISC_KMODS += zmodMISC_KMODS += schrock## Software Cryptographic Providers (/kernel/crypto):# ### 4. Creating a package As mentioned previously, we want this module to live in its own package. We start by creating usr/src/pkgdefs/SUNWschrock and adding it to the list of COMMON_SUBDIRS in usr/src/pkgdefs/Makefile:  SUNWsasnm / SUNWsbp2 / SUNWschrock / SUNWscpr / SUNWscpu / Next, we have to add a skeleton package system. Since we're only adding a miscellaneous module and not a full blown driver, we only need a simple skeleton. First, there's the Makefile: include ../Makefile.com.KEEP_STATE:all:$(FILES)install: all pkginclude ../Makefile.targ

A 'pkgimfo.tmpl' file:

PKG=SUNWschrockNAME="Sample kernel module"ARCH="ISA"VERSION="ONVERS,REV=0.0.0"SUNW_PRODNAME="SunOS"SUNW_PRODVERS="RELEASE/VERSION"SUNW_PKGVERS="1.0"SUNW_PKGTYPE="root"MAXINST="1000"CATEGORY="system"VENDOR="Sun Microsystems, Inc."DESC="Sample kernel module"CLASSES="none"HOTLINE="Please contact your local service provider"EMAIL=""BASEDIR=/SUNW_PKG_ALLZONES="true"SUNW_PKG_HOLLOW="true"

And 'prototype_com', 'prototype_i386', and 'prototype_sparc' (elided) files:

# prototype_i386!include prototype_comd none kernel/misc/amd64 755 root sysf none kernel/misc/amd64/schrock 755 root sys
# prototype_comi pkginfod none kernel 755 root sysd none kernel/misc 755 root sysf none kernel/misc/schrock 755 root sys

### 5. Putting it all together

If we pkgadd our package, or BFU to the resulting archives, we can see our module in action:

halcyon# modload /kernel/misc/schrockJun 19 12:43:35 halcyon schrock: WARNING: OpenSolaris has arrivedhalcyon# modunload -i 197Jun 19 12:43:50 halcyon schrock: WARNING: OpenSolaris has left the building

This process is common to all kernel modules (though packaging is simpler for those combined in SUNWckr, for example). Things get a little more complicated and a little more specific when you begin to talk about drivers or filesystems in particular. I'll try to create some simple howtos for those as well.

---------------------------------

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：597472次
• 积分：10449
• 等级：
• 排名：第1636名
• 原创：445篇
• 转载：3篇
• 译文：0篇
• 评论：11条
阅读排行
最新评论