软件工程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_DEF将SysMqOpen注册到g_syscallHandle中.

浙公网安备 33010602011771号