OpenHarmony开源社区
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

探讨一下鸿蒙系统的shell

小型系统编译内核的入口在B_LTS/kernel/liteos_a/BUILD.gn,打开看一下:



所以,kernel子系统的编译,依赖于make这个组件,而make组件则是通过执行同目录下的build.sh做预编译,然后通过make+Makefile来构建编译内核的。

同目录下的.config配置文件,就是预编译时根据各种配置最终生成的编译内核的一组宏定义,相当于对内核又做了一次裁剪。

如,编译release版本时,LOSCFG_SHELL没有定义,内核应用shell是不编译的;当编译debug版本时,LOSCFG_SHELL=y,就会编译shell。

编译内核的中间产物,全都在
B_LTS/out/hispark_taurus/ipcamera_hispark_taurus/obj/kernel/liteos_a/目录下,我们暂且将它称为“kernel_out”目录。

查看kernel_out/build.log,可以查看内核的大概编译过程,不过我们暂不深入去分析,这里主要看一下B_LTS/kernel/liteos_a/apps/目录下的三个内核应用shell、init、tftp,以及B_LTS/kernel/liteos_a/shell/目录下的full_shell的编译。

full_shell会编译成静态库到kernel_out/lib/libshell.a,后面会连同其他库文件链接到liteos镜像中。

三个内核应用会编译成同名的可执行程序,生成在kernel_out/bin/目录下,连同kernel_out/musl/目录下的动态库等文件,一起拷贝到
B_LTS/out/hispark_taurus/ipcamera_hispark_taurus/rootfs/对应的目录中。

系统启动初期,在SystemInit()函数中,就有对console的初始化相关工作,会调用B_LTS/kernel/liteos_a/shell/ 编译出来的libshell.a提供的函数来完成控制台和内核shell服务的初始化


启动到框架层的系统服务shell时,执行的是内核应用shell程序,入口在B_LTSkernelliteos_aappsshellsrcmain.c,从抓回来的log看,这里跑的是apps的shell的流程,


但是,当你在shell下执行命令时,你会发现有部分命令(如date、ping、task等),直接在apps shell内就可以完成,而另外一些命令(如cd、ls等),则需要full shell来提供。这是因为apps shell是一个精简版的shell,只提供基础功能,而full shell是全功能的shell。

如以下命令,只跑apps_shmsg部分,和跑了apps_shmsg之后还要跑full_show,注意两者的差别。


更多回帖

发帖
×
20
完善资料,
赚取积分