- 论坛徽章:
- 0
|
写了一个简单的驱动,加载时系统崩溃。请看看有什么问题.
系统环境:
AIX53 ,oslevel -s :5300-06-03-0732
ls -l unix :
/unix -> /usr/lib/boot/unix_64
xlc 8.0
代码
static struct devsw testdevsw = {
testopen, /* d_open entry point for open routine */
testclose, /* d_close entry point for close routine */
testread, /* d_read entry point for read routine */
testwrite, /* d_write entry point for write routine */
testioctl, /* d_ioctl entry point for ioctl routine */
nodev, /* d_strategy entry point for strategy routine */
NULL, /* d_ttys pointer to tty device structure */
nodev, /* d_select entry point for select routine */
test_main, /* d_config entry point for config routine */
nodev, /* d_print entry point for print routine */
nodev, /* d_dump entry point for dump routine */
nodev, /* d_mpx entry point for mpx routine */
nodev, /* d_revoke entry point for revoke routine */
NULL, /* d_dsdptr pointer to device specific data */
NULL, /* d_selptr ptr to outstanding select cntl blks */
DEV_MPSAFE|DEV_64BIT
};
static long test_count = 0;
static simple_lock_t mutex = NULL ;
int init_test(){
bsdlog(LOG_DEBUG|LOG_KERN,"initing test \n" ;
lock_alloc(&test_mutex.test_lk, LOCK_ALLOC_PIN,512,-1 );
{
bsdlog(LOG_DEBUG|LOG_KERN,"initing......mutex \n" ;
simple_lock_init(test_mutex.test_lk);
}
bsdlog(LOG_DEBUG|LOG_KERN,"inited \n" ;
return 0;
}
int test_main(dev_t dev,int cmd,struct uio * uiop )
{
int error = EINVAL;
bsdlog(LOG_DEBUG|LOG_KERN,"test(%u[%d:%d],%d,%p)\n", dev,major_num(dev),minor_num(dev),cmd,uiop);
switch (cmd)
{
case CFG_INIT :
if(error = pincode(testopen) ){
bsdlog(LOG_DEBUG|LOG_KERN,"pincode \n" ;
return error;
}
error = devswadd(dev, &testdevsw);
if(!error){
error = init_test();
if(error ) unpincode(testopen);
}
break;
case CFG_TERM :
MUTEX_DESTROY(&test_mutex);
error = devswdel(dev);
unpincode(test_main);
break;
case CFG_QVPD :
error = 0;
break;
default :
bsdlog(LOG_DEBUG|LOG_KERN,"test(%ld[%d:%d],%d,%p) invalid cmd\n", dev,major_num(dev),minor_num(dev),cmd,uiop);
error=EINVAL;
break;
}
bsdlog(LOG_DEBUG|LOG_KERN,"test(%ld[%d:%d],%d,%p):%d\n", dev,major_num(dev),minor_num(dev),cmd,uiop,error);
return error;
}
int testopen (dev_t devno, u_long flags, chan_t chan, int ext){
/* int error=EINVAL; */
int error=0;
bsdlog(LOG_DEBUG|LOG_KERN,"testopen(%u[%d:%d],%ld,,)\n", devno,major(devno),minor(devno),flags);
MUTEX_ENTER(&test_mutex);
test_count++;
MUTEX_EXIT(&test_mutex);
return error;
}
int testclose(dev_t devno, chan_t chan){
int error=0;
bsdlog(LOG_DEBUG|LOG_KERN,"testclose(%u[%d:%d])\n", devno,major(devno),minor(devno));
error=0;
}
int testread (dev_t devno, struct uio * uiop, chan_t chan, int ext){
bsdlog(LOG_DEBUG|LOG_KERN,"testread(%u[%d:%d])\n", devno,major(devno),minor(devno));
return ENXIO;
}
int testwrite (dev_t devno, struct uio * uiop, chan_t chan, int ext){
bsdlog(LOG_DEBUG|LOG_KERN,"testwrite(%u[%d:%d])\n", devno,major(devno),minor(devno));
MUTEX_ENTER(&test_mutex);
test_count++;
test.tar.gz
(4.91 KB, 下载次数: 23)
MUTEX_EXIT(&test_mutex);
return ENXIO;
}
int testioctl (dev_t devno, int cmd, caddr_t data, ulong devflag,chan_t chan,int mode){
bsdlog(LOG_DEBUG|LOG_KERN,"testioctl(%u[%d:%d],%d,%p,%d)\n", devno,major(devno),minor(devno),cmd,data,mode);
return ENXIO;
}
编译选项:
BITS=64
CC=cc
CFLAGS=-g -q$(BITS)
DDFLAGS=$(CFLAGS) -q$(BITS) -D_KERNEL -DKERNEL
#DDFLAGS=-g -q$(BITS) -D_KERNEL -DKERNEL -D__64BIT_KERNEL
IMPORTS = -bI:/lib/kernex.exp -bI:/lib/syscalls.exp -bI:/lib/sockets.exp \
-bI:/lib/netinet.exp
KLDOPTS=-b64
LDSTUFF64= -b"binder:/usr/lib/bind glink:/usr/lib/glink64.o" -bnoentry -b h:4 \
-D0 -T512
LDFLAGS = -m -etest_main -bexport:test.exp ${IMPORTS} \
-lsys -lcsys ${KLDOPTS}
DRV=test
MOD_OBJS64=test64.o
MOD_OBJS=test.o
EXE=ll
all (DRV) $(EXE)
ll:ll.c
$(CC) -q$(BITS) -b$(BITS) $(CFLAGS) -o $@ ll.c -lcfg -lodm
test.o:test.c
$(CC) -D_KERNEL -DKERNEL -c test.c
test64.o:test.c
$(CC) $(DDFLAGS) -o $@ -c test.c
test64 (MOD_OBJS64)
${LD} ${LDSTUFF64} -b64 -bloadmap:test64.loadmap \
-bmap:test64.map -o test64 \
${MOD_OBJS64} ${LIBS} \
${LDFLAGS} ${IMPORTS64}
主要问题:
1. 使用 lock_alloc && simple_lock_init 后 ,加载驱动时系统崩溃.感觉好像是lock_alloc 失败,如何判断&检测lock_alloc 成功?
屏蔽掉lock类代码驱动能加载.
2. void lock_alloc ( lock_addr, flags, class, occurrence) 中的 class ,occurrence如何赋值?
3. splnet() 代码也是不能用,一调用系统就crash 掉了。
test.tar.gz
(4.91 KB, 下载次数: 34)
[ 本帖最后由 tsunli 于 2008-8-19 15:22 编辑 ] |
|