免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2761 | 回复: 5
打印 上一主题 下一主题

[故障求助] AIX5.3 驱动开发 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-19 15:15 |只看该作者 |倒序浏览
写了一个简单的驱动,加载时系统崩溃。请看看有什么问题.
系统环境:
  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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-19 15:23 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2008-08-19 15:42 |只看该作者
你可以到C语言论坛问,这里估计很少有人能回答你的问题

论坛徽章:
0
4 [报告]
发表于 2008-08-19 15:43 |只看该作者

不会吧

不会吧。这里不是AIX论坛?

论坛徽章:
0
5 [报告]
发表于 2008-08-19 16:41 |只看该作者
太高深了

论坛徽章:
0
6 [报告]
发表于 2008-08-19 16:41 |只看该作者
原帖由 tsunli 于 2008-8-19 15:43 发表
不会吧。这里不是AIX论坛?

这里貌似主攻系统层面的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP