免费注册 查看新帖 |

Chinaunix

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

AIX5.3 驱动开发 问题 初始化过程中系统崩溃 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-19 15:49 |只看该作者 |倒序浏览
写了一个简单的驱动,加载时系统崩溃。请看看有什么问题.
系统环境:
  AIX53  ,oslevel -s :5300-06-03-0732
  ls -l  unix :
     /unix -> /usr/lib/boot/unix_64
    xlc 8.0
代码: test.tar.gz (4.91 KB, 下载次数: 16)
使用方式:
    a.cp test64 /usr/lib/drivers/test
    b. 加载:./ll -l
    c. 卸载:./ll -u
主要问题:
   1.在初始化过程中不能使用 splnet ,否则加载驱动系统崩溃。
   2.simple_lock_t 的使用:
       a.  void lock_alloc ( lock_addr, flags, class, occurrence) 的 class,occurrence如何赋值?
       b. 初始化过程lock_alloc,simple_lock_init 系统崩溃,lock_alloc失败? 如何正确使用simple_lock_t ?


谢谢各位.
主要代码,驱动入口为 test_main:
#define  KMUTEX_T       simple_lock_t
#define KRWLOCK_T       complex_lock_t
typedef union {
#ifdef KMUTEX_T
        struct  {
                KMUTEX_T        test_slk;
                char            *test_lname;
        } test_lkun_s;
#endif
} testmutex_t;
#define test_lk          test_lkun_s.test_slk
#define test_lname       test_lkun_s.test_lname
#define test_isr         test_lkun_s.test_sr
#define test_isw         test_lkun_s.test_sw
#define test_magic       test_lkun_s.test_magic


#  define       MUTEX_ENTER(x)          simple_lock((x)->test_lk)

#  define       MUTEX_INIT(x, y)       /* pin( &(x)->test_lk );*/\
                                        lock_alloc(&((x)->test_lk), \
                                                   LOCK_ALLOC_PIN, \
                                                   1, -1 ); \
                                        simple_lock_init((x)->test_lk)
#  define       MUTEX_DESTROY(x)       /* unpin(&(x)->test_lk) ; */\
                                           lock_free(&( (x)->test_lk ))
#  define       MUTEX_EXIT(x)           simple_unlock((x)->test_lk)


int testopen (dev_t, u_long, chan_t, int);
int testclose (dev_t, chan_t);
int testread (dev_t, struct uio *, chan_t, int);
int testwrite (dev_t, struct uio *, chan_t, int);
int testioctl (dev_t devno, int cmd, caddr_t arg, ulong devflag,chan_t chan,int mode);
int  test_main(dev_t devno,int cmd,struct uio * uiop );

static testmutex_t   test_mutex;
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;
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++;
        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;
}

[ 本帖最后由 tsunli 于 2008-8-19 15:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-19 21:32 |只看该作者
没接触过,虽然有AIX机器,不敢搞,楼主你真牛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP