软件工程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/mem
和mmap
导出系统物理地址,免去了用户虚拟地址到内核逻辑地址的繁琐拷贝,提升效率。
好的代码风格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_DE
F将SysMqOpen
注册到g_syscallHandle
中.