免费注册 查看新帖 |

Chinaunix

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

android启动时如何使用loop设备 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 17:34 |只看该作者 |倒序浏览
如果在android启动时要加载一个压缩的文件系统镜像或者一个ext3的文件系统镜像,不可避免的要使用loop设备,可是android本省的init没有提供losetup功能,而且其mount功能中也没有loop设备相关处理,因此要自己动手添加一个losetup功能。
要修改的代码在 system/core/init目录下。

keywords.h中添加int do_losetup(int nargs, char **args);和 KEYWORD(losetup,     COMMAND, 2, do_losetup)两行。

parser.c中的lookup_keyword函数case 'l'部分添加一行 if (!strcmp(s, "osetup")) return K_losetup;

在builtins.c中添加do_losetup函数和setloop函数。

int do_losetup(int nargs, char **args) {
/* max 2 args,  no option*/
    if (nargs != 3)
        return -1;
if (setloop(args[1], args[2], 0)
return 0;
}
static int setloop(char *device, const char *file, unsigned long long offset)
{
bb_loop_info loopinfo;
struct stat statbuf;
int dfd, ffd, mode, rc = -1;
/* Open the file. */
mode = O_RDONLY;
ffd = open(file, mode);
if (ffd
/* Ran out of block devices, return failure.  */
if (stat(device, &statbuf) || !S_ISBLK(statbuf.st_mode)) {
  return -errno;
  }
/* Open the sucker and check its loopiness.  */
dfd = open(device, mode);
if (dfd
rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
/* If device is free, claim it.  */
if (rc && errno == ENXIO) {
  memset(&loopinfo, 0, sizeof(loopinfo));
  strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE);
  loopinfo.lo_offset = offset;
  /* Associate free loop device with file.  */
  if (!ioctl(dfd, LOOP_SET_FD, ffd)) {
   if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo))
    rc = 0;
   else
    ioctl(dfd, LOOP_CLR_FD, 0);
  }
    }
else
    return -errno;
close(dfd);
close(ffd);
return rc;
}
重新编译,现在可以在init.rc中使用losetup功能。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4329/showart_1912223.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP