提交 6e00749b 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 d9938192
......@@ -1522,7 +1522,7 @@ LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR
delete_files(OsCurrProcessGet(), (struct files_struct *)oldFiles);
#endif
OsSwtmrRecycle(processCB->processID);
OsSwtmrRecycle(processCB->processID);//定时器回收
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
#ifdef LOSCFG_SECURITY_VID
......
......@@ -84,7 +84,7 @@ extern "C" {
#define PF_R 0x4
#define PF_W 0x2
#define PF_X 0x1
//ELF 加载信息 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式
typedef struct {
const CHAR *fileName;
CHAR *execName;
......@@ -99,19 +99,19 @@ typedef struct {
UINT32 stackSize;
INT32 stackProt;
UINTPTR loadAddr;
UINTPTR elfEntry;
LD_ELF_EHDR elfEhdr;
LD_ELF_PHDR *elfPhdr;
UINTPTR elfEntry; //入口函数位置
LD_ELF_EHDR elfEhdr; //ELF head
LD_ELF_PHDR *elfPhdr; //ELF 程序头表
UINT32 execFileLen;
INT32 execFD;
LD_ELF_EHDR interpELFEhdr;
LD_ELF_EHDR interpELFEhdr; //解释器段 ( 动态链接器路径 )
LD_ELF_PHDR *interpELFPhdr;
UINT32 interpFileLen;
INT32 interpFD;
UINTPTR topOfMem;
UINTPTR oldFiles;
LosVmSpace *newSpace;
LosVmSpace *oldSpace;
LosVmSpace *newSpace; //新的虚拟空间,新开一个空间,把ELF各segment加载到这个虚拟空间,再切换MMU上下文,开始ELF的运行
LosVmSpace *oldSpace; //老的虚拟空间,切当前进程的壳运行,由此保存当前进程的虚拟空间
#ifdef LOSCFG_ASLR
INT32 randomDevFD;
#endif
......
......@@ -92,7 +92,7 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR *
UINT32 strLen;
errno_t err;
if (LOS_IsUserAddress((VADDR_T)(UINTPTR)fileName)) {//在用户空间
if (LOS_IsUserAddress((VADDR_T)(UINTPTR)fileName)) {//参数文件名存放在用户空间
err = LOS_StrncpyFromUser(kfileName, fileName, PATH_MAX + 1);
if (err == -EFAULT) {
return err;
......@@ -100,7 +100,7 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR *
PRINT_ERR("%s[%d], filename len exceeds maxlen: %d\n", __FUNCTION__, __LINE__, PATH_MAX);
return -ENAMETOOLONG;
}
} else if (LOS_IsKernelAddress((VADDR_T)(UINTPTR)fileName)) {//在内核空间
} else if (LOS_IsKernelAddress((VADDR_T)(UINTPTR)fileName)) {//参数文件存在内核空间
strLen = strlen(fileName);
err = memcpy_s(kfileName, PATH_MAX, fileName, strLen);//从filename -> kfilename
if (err != EOK) {
......@@ -114,7 +114,7 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR *
loadInfo->fileName = kfileName;
return LOS_OK;
}
//运行一个执行文件 .elf
INT32 LOS_DoExecveFile(const CHAR *fileName, CHAR * const *argv, CHAR * const *envp)
{
ELFLoadInfo loadInfo = { 0 };//ELF加载信息结构体
......@@ -127,7 +127,7 @@ INT32 LOS_DoExecveFile(const CHAR *fileName, CHAR * const *argv, CHAR * const *e
LosVmPage *vmPage = NULL;
if ((fileName == NULL) || ((argv != NULL) && !LOS_IsUserAddress((VADDR_T)(UINTPTR)argv)) ||
((envp != NULL) && !LOS_IsUserAddress((VADDR_T)(UINTPTR)envp))) {
((envp != NULL) && !LOS_IsUserAddress((VADDR_T)(UINTPTR)envp))) {//argv需要再用户空间
return -EINVAL;
}
ret = OsCopyUserParam(&loadInfo, fileName, kfileName, PATH_MAX);//将文件名拷贝到内核空间,PATH_MAX = 256
......@@ -165,12 +165,12 @@ INT32 LOS_DoExecveFile(const CHAR *fileName, CHAR * const *argv, CHAR * const *e
LOS_PhysPagesFreeContiguous(virtTtb, 1);
return -ENOMEM;
}
LOS_ListAdd(&loadInfo.newSpace->archMmu.ptList, &(vmPage->node));
LOS_ListAdd(&loadInfo.newSpace->archMmu.ptList, &(vmPage->node));//用vmPage->node挂到 ptlist, vmPage 就是 L1表
loadInfo.argv = argv;
loadInfo.argv = argv;//
loadInfo.envp = envp;
ret = OsLoadELFFile(&loadInfo);
ret = OsLoadELFFile(&loadInfo);//虚拟空间已经准备好了,该开始加载ELF文件到虚拟空间了。
if (ret != LOS_OK) {
return ret;
}
......
......@@ -141,7 +141,7 @@ STATIC INT32 OsVerifyELFPhdr(const LD_ELF_PHDR *phdr)
return LOS_OK;
}
//ELF加载初始化
STATIC INT32 OsELFLoadInit(const CHAR *fileName, ELFLoadInfo *loadInfo)
{
INT32 ret;
......@@ -971,19 +971,19 @@ STATIC INT32 OsLoadELFSegment(ELFLoadInfo *loadInfo)
return LOS_OK;
}
//擦除虚拟空间
STATIC VOID OsFlushAspace(ELFLoadInfo *loadInfo)
{
LosProcessCB *processCB = OsCurrProcessGet();
LosProcessCB *processCB = OsCurrProcessGet();//获取当前进程
OsExecDestroyTaskGroup();
loadInfo->oldSpace = processCB->vmSpace;
processCB->vmSpace = loadInfo->newSpace;
processCB->vmSpace->heapBase += OsGetRndOffset(loadInfo);
processCB->vmSpace->heapNow = processCB->vmSpace->heapBase;
processCB->vmSpace->mapBase += OsGetRndOffset(loadInfo);
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);
loadInfo->oldSpace = processCB->vmSpace;//当前进程的虚拟空间记录下来
processCB->vmSpace = loadInfo->newSpace;//新空间换成当前进程的虚拟空间,牛逼借壳上市
processCB->vmSpace->heapBase += OsGetRndOffset(loadInfo);//堆区基地址
processCB->vmSpace->heapNow = processCB->vmSpace->heapBase;//堆区现地址
processCB->vmSpace->mapBase += OsGetRndOffset(loadInfo);//映射区基地址
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);//mmu上下文切换
}
STATIC VOID OsDeInitLoadInfo(ELFLoadInfo *loadInfo)
......@@ -1014,17 +1014,17 @@ STATIC VOID OsDeInitFiles(ELFLoadInfo *loadInfo)
delete_files_snapshot((struct files_struct *)loadInfo->oldFiles);
#endif
}
//加载ELF文件
INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
{
INT32 ret;
ret = OsELFLoadInit(loadInfo->fileName, loadInfo);
ret = OsELFLoadInit(loadInfo->fileName, loadInfo);//ELF加载初始化
if (ret != LOS_OK) {
goto OUT;
}
ret = OsLoadProgramHdrs(loadInfo);
ret = OsLoadProgramHdrs(loadInfo);//加载程序头
if (ret != LOS_OK) {
goto OUT;
}
......@@ -1039,12 +1039,12 @@ INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
goto OUT;
}
(VOID)OsFlushAspace(loadInfo);
(VOID)OsFlushAspace(loadInfo);//冲洗干净空间,这里的意思就是打扫干净房子,准备放东西进来。
ret = OsLoadELFSegment(loadInfo);
if (ret != LOS_OK) {
OsCurrProcessGet()->vmSpace = loadInfo->oldSpace;
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);
ret = OsLoadELFSegment(loadInfo);//加载ELF各个段,放东西进虚拟空间
if (ret != LOS_OK) {//如果加载失败
OsCurrProcessGet()->vmSpace = loadInfo->oldSpace;//之前的虚拟空间还给当前进程
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);//切换mmu上下文
goto OUT;
}
......
......@@ -73,7 +73,7 @@ HandleInfo g_cmsTask;
HandleInfo g_serviceHandleMap[MAX_SERVICE_NUM];
#endif
STATIC LOS_DL_LIST g_ipcPendlist;
STATIC LOS_DL_LIST g_ipcUsedNodelist[LOSCFG_BASE_CORE_PROCESS_LIMIT];
STATIC LOS_DL_LIST g_ipcUsedNodelist[LOSCFG_BASE_CORE_PROCESS_LIMIT];//==进程数量 64个
/* ipc lock */
SPIN_LOCK_INIT(g_ipcSpin);
......@@ -216,7 +216,7 @@ VOID IpcBacktrace(VOID)
}
}
#endif
//liteIpc 初始化
LITE_OS_SEC_TEXT_INIT UINT32 LiteIpcInit(VOID)
{
UINT32 ret, i;
......
......@@ -377,7 +377,7 @@ OUT:
}
return ret;
}
//系统调用,运行.elf
int SysExecve(const char *fileName, char *const *argv, char *const *envp)
{
return LOS_DoExecveFile(fileName, argv, envp);
......
gcc -o main main.c
.\main.out
\ No newline at end of file
......@@ -43,11 +43,16 @@ void round1(){
//printf("ROUNDUP %d\n",ROUNDUP(9, 2));
//printf("ROUNDDOWN %d\n",ROUNDDOWN(9, 2));
}
int aw;
int bw=99;
void Print(){
printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024));
}
int main()
{
printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024));
int b = 0;
//printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024));
Print();
return 0;
}
.file "main.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "ROUNDUP %d\12\0"
.LC1:
.ascii "ROUNDDOWN %d\12\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
.LFB28:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $32, %rsp
.seh_stackalloc 32
.seh_endprologue
call __main
movl $10, %edx
leaq .LC0(%rip), %rcx
call printf
movl $8, %edx
leaq .LC1(%rip), %rcx
call printf
movl $0, %eax
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
.def printf; .scl 2; .type 32; .endef
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册