软件工程2021:第2次作业—— 谈谈鸿蒙操作系统

一、概述鸿蒙操作系统

(1)开发背景   

      中国需要新的自己的手机操作系统来打破处处受限的局面,鸿蒙系统由此产生。

(2)需求

      随着中国自身科技实力整体地,明显地进步。我们需要开发一个全新的,不同于安卓和苹果的操作系统。中国有世界上所有国家中最多的手机用户,华为根据实际情况,研发鸿蒙操作系统,满足不同用户的不同需求,打破对国外产品的过度依赖。

(3)开发历史

       2012年9月,在华为“2012诺亚方舟实验室”专家座谈会上,任正非提出要做终端操作系统,以防范于未然。

       2017年,鸿蒙OS内核1.0完成技术验证,并逐步开展内核2.0研发。

       2018年,鸿蒙内核2.0已被应用于终端TEE。

       2019年,鸿蒙OS 1.0版本正式亮相,1.0版本基于开源框架,其关键模块均为自研,同时具备分布式架构、方舟编译器、确定时延引擎、TEE微内核形式化验证以及多终端开发IDE(Beta)。

       2021年,鸿蒙操作系统正式开启大规模商用。

(4)应用场景

       手机、手环、平板、汽车、智能家居等消费级场景,主要还是面向的是To C。

(5)发展趋势

      华为鸿蒙不是要在安卓和IOS已经垄断的市场上分一杯羹,而是瞄准万物互联的更广阔市场。手机、电视、平板、汽车等终端只要搭载鸿蒙系统,软件在不同平台之间都可以适配,不再需要单独开发。

二、关于鸿蒙是否套壳的争议

(1)什么是创新:(联系鸿蒙系统分析)

       创新是指以现有的知识和物质,在特定的环境中,改进或创造新的事物(包括但不限于各种方法、元素、路径、环境等等),并能获得一定有益效果的行为。

鸿蒙系统的开发使用了ASOP代码,可以兼容很多安卓软件,但同时也加入很多新的代码和内容,并不是生搬硬套,不是所谓的换皮。

 (2)代码复用与创新的关系

      代码复用不意味着抄袭,创新就是在原有的基础上创新,要不同于,好于之前的东西。之所以用ASOP代码,一方面是,在ASOP这个项目里,任何机构和企业都有义务为开源社区贡献代码,也能够使用和下载开源代码,并基于开源项目做二次开发,另一方面,也是为了兼容安卓软件,方便客户。

三、代码风格分析

好的代码风格1:

代码:

struct file_table_s {//进程fd <--> 系统FD绑定
    intptr_t sysFd; /* system fd associate with the tg_filelist index */
};//sysFd的默认值是-1
struct fd_table_s {//进程fd表结构体
    unsigned int max_fds;//进程的文件描述符最多有256个
    struct file_table_s *ft_fds; /* process fd array associate with system fd *///系统分配给进程的FD数组 ,fd 默认是 -1
    fd_set *proc_fds;	//进程fd管理位,用bitmap管理FD使用情况,默认打开了 0,1,2	       (stdin,stdout,stderr)
    fd_set *cloexec_fds;
    sem_t ft_sem; /* manage access to the file table */ //管理对文件表的访问的信号量
};
struct files_struct {//进程文件表结构体
    int count;				      //持有的文件数量
    struct fd_table_s *fdt; //持有的文件表
    unsigned int file_lock;	//文件互斥锁
    unsigned int next_fd;	  //下一个fd
#ifdef VFS_USING_WORKDIR
    spinlock_t workdir_lock;	//工作区目录自旋锁
    char workdir[PATH_MAX];		//工作区路径,最大 256个字符
#endif
};
typedef struct ProcessCB {
#ifdef LOSCFG_FS_VFS
    struct files_struct *files;        /**< Files held by the process */ //进程所持有的所有文件,注者称之为进程的文件管理器
#endif	//每个进程都有属于自己的文件管理器,记录对文件的操作. 注意:一个文件可以被多个进程操作
}
分析:鸿蒙的每个进程ProcessCB都有属于自己的进程的文件描述符files_struct,该进程和文件系统有关的信息都由它表达.
//文件和线性区的映射关系
static ssize_t MemMap(struct file *filep, LosVmMapRegion *region)
{
#ifdef LOSCFG_KERNEL_VM
    size_t size = region->range.size;
    PADDR_T paddr = region->pgOff << PAGE_SHIFT;
    VADDR_T vaddr = region->range.base;
    LosVmSpace *space = LOS_SpaceGet(vaddr);

    if ((paddr >= SYS_MEM_BASE) && (paddr < SYS_MEM_END)) {
        return -EINVAL;
    }

    /* Peripheral register memory adds strongly ordered attributes */
    region->regionFlags |= VM_MAP_REGION_FLAG_STRONGLY_ORDERED;

    if (space == NULL) {
        return -EAGAIN;
    }//映射
    if (LOS_ArchMmuMap(&space->archMmu, vaddr, paddr, size >> PAGE_SHIFT, region->regionFlags) <= 0) {
        return -EAGAIN;
    }
#else
    UNUSED(filep);
    UNUSED(region);
#endif
    return 0;
}
// vfs 接口实现
  static const struct file_operations_vfs g_memDevOps = {
      MemOpen,  /* open */
      MemClose, /* close */
      MemRead,  /* read */
      MemWrite, /* write */
      NULL,      /* seek */
      NULL,      /* ioctl */
      MemMap,   /* mmap */
  #ifndef CONFIG_DISABLE_POLL
      NULL,      /* poll */
  #endif
      NULL,      /* unlink */
  };
  // 注册/dev/mem 的驱动程序
  int DevMemRegister(void)
  {
      return register_driver("/dev/mem", &g_memDevOps, 0666, 0); /* 0666: file mode */
  }
分析:利用/dev/memmmap导出系统物理地址,免去了用户虚拟地址到内核逻辑地址的繁琐拷贝,提升效率。
好的代码风格3:
代码:
mqd_t mq_open(const char *name, int flags, ...)
{
	mode_t mode = 0;
	struct mq_attr *attr = 0;
	if (*name == '/') name++;
	if (flags & O_CREAT) {
		va_list ap;
		va_start(ap, flags);
		mode = va_arg(ap, mode_t);
		attr = va_arg(ap, struct mq_attr *);
		va_end(ap);
	}
	return syscall(SYS_mq_open, name, flags, mode, attr);
}
分析:
  • SYS_mq_open 是真正的系统调用函数,对应一个系统调用号__NR_mq_open,通过宏SYSCALL_HAND_DEF将SysMqOpen注册到g_syscallHandle中.

posted @ 2021-09-18 15:11  259529  阅读(134)  评论(0编辑  收藏  举报