网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月24日漏签0天
minix吧 关注:196贴子:309
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 3回复贴,共1页
<<返回minix吧
>0< 加载中...

懂C的朋友能不能帮忙分析一下minix当中do_svrctl这个函数的功能

  • 只看楼主
  • 收藏

  • 回复
  • Navis璡
  • Ⅰ
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
想求教minix源码pm文件夹下misc.c文件里的do_svrctl这个函数的功能
源码如下:
/*===========================================================================*
*                 do_svrctl                      *
*===========================================================================*/
PUBLIC int do_svrctl()
{
   int s, req;
   vir_bytes ptr;
#define MAX_LOCAL_PARAMS 2
   static struct {
       char name[30];
       char value[30];
   } local_param_overrides[MAX_LOCAL_PARAMS];
   static int local_params = 0;
   req = m_in.svrctl_req;
   ptr = (vir_bytes) m_in.svrctl_argp;
   /* Is the request indeed for the MM? */
   if (((req >> 8) & 0xFF) != 'M') return(EINVAL);
   /* Control operations local to the PM. */
   switch(req) {
   ca****SETPARAM:
   ca****GETPARAM: {
       struct sysgetenv sysgetenv;
       char search_key[64];
       char *val_start;
       size_t val_len;
       size_t copy_len;
       /* Copy sysgetenv structure to PM. */
       if (sys_datacopy(who, ptr, SELF, (vir_bytes) &sysgetenv,
               sizeof(sysgetenv)) != OK) return(EFAULT);  
       /* Set a param override? */
       if (req == MMSETPARAM) {
       if (local_params >= MAX_LOCAL_PARAMS) return ENOSPC;
       if (sysgetenv.keylen <= 0
        || sysgetenv.keylen >=
             sizeof(local_param_overrides[local_params].name)
        || sysgetenv.vallen <= 0
        || sysgetenv.vallen >=
             sizeof(local_param_overrides[local_params].value))
           return EINVAL;
          
           if ((s = sys_datacopy(who, (vir_bytes) sysgetenv.key,
             SELF, (vir_bytes) local_param_overrides[local_params].name,
                sysgetenv.keylen)) != OK)



  • Navis璡
  • Ⅰ
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
                    return s;
           if ((s = sys_datacopy(who, (vir_bytes) sysgetenv.val,
             SELF, (vir_bytes) local_param_overrides[local_params].value,
               sysgetenv.keylen)) != OK)
                    return s;
             local_param_overrides[local_params].name[sysgetenv.keylen] = '\0';
             local_param_overrides[local_params].value[sysgetenv.vallen] = '\0';
       local_params++;
       return OK;
       }
       if (sysgetenv.keylen == 0) {     /* copy all parameters */
           val_start = monitor_params;
           val_len = sizeof(monitor_params);
       }
       else {                 /* lookup value for key */
             int p;
           /* Try to get a copy of the requested key. */
           if (sysgetenv.keylen > sizeof(search_key)) return(EINVAL);
           if ((s = sys_datacopy(who, (vir_bytes) sysgetenv.key,
                   SELF, (vir_bytes) search_key, sysgetenv.keylen)) != OK)
               return(s);
           /* Make sure key is null-terminated and lookup value.
            * First check local overrides.
            */
           search_key[sysgetenv.keylen-1]= '\0';
           for(p = 0; p < local_params; p++) {
               if (!strcmp(search_key, local_param_overrides[p].name)) {
                   val_start = local_param_overrides[p].value;



2025-07-24 19:21:42
广告
不感兴趣
开通SVIP免广告
  • Navis璡
  • Ⅰ
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
                   break;
               }
           }
           if (p >= local_params && (val_start = find_param(search_key)) == NULL)
                return(ESRCH);
           val_len = strlen(val_start) + 1;
       }
       /* See if it fits in the client's buffer. */
       if (val_len > sysgetenv.vallen)
           return E2BIG;
       /* Value found, make the actual copy (as far as possible). */
       copy_len = MIN(val_len, sysgetenv.vallen);
       if ((s=sys_datacopy(SELF, (vir_bytes) val_start,
               who, (vir_bytes) sysgetenv.val, copy_len)) != OK)
           return(s);
       return OK;
   }
#if ENABLE_SWAP
   ca****SWAPON: {
     struct mmswapon swapon;
     if (mp->mp_effuid != SUPER_USER) return(EPERM);
     if (sys_datacopy(who, (phys_bytes) ptr,
         PM_PROC_NR, (phys_bytes) &swapon,
         (phys_bytes) sizeof(swapon)) != OK) return(EFAULT);
     return(swap_on(swapon.file, swapon.offset, swapon.size)); }
   ca****SWAPOFF: {
     if (mp->mp_effuid != SUPER_USER) return(EPERM);
     return(swap_off()); }
#endif /* SWAP */
   default:
     return(EINVAL);
   }
}



  • Navis璡
  • Ⅰ
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
能不能大致说明一下这个函数是用来干嘛的,我还想知道它是用在什么地方的呢?(本人刚学操作系统不久,能力实在有限呐)


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回minix吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示