43#ifdef LOSCFG_KERNEL_VDSO
46#ifdef LOSCFG_DRIVERS_TZDRIVER
62 if (oflags & O_CLOEXEC) {
66 ret = open(fileName, oflags);
99 ret = stat(fileName, &buf);
102 if (strcmp(fileName,
"/bin/shell") != 0) {
104 PRINT_ERR(
"%s[%d], Failed to stat file: %s, errno: %d\n", __FUNCTION__, __LINE__, fileName, errno);
111 if (S_ISREG(buf.st_mode) == 0) {
112 PRINT_ERR(
"%s[%d], The file: %s is invalid!\n", __FUNCTION__, __LINE__, fileName);
115 if (buf.st_size > FILE_LENGTH_MAX) {
116 PRINT_ERR(
"%s[%d], The file: %s length is out of limit!\n", __FUNCTION__, __LINE__, fileName);
120 *fileLen = (
UINT32)buf.st_size;
130 PRINT_ERR(
"%s[%d], Invalid procfd!\n", __FUNCTION__, __LINE__);
135 returnPos = lseek(fd, offset, SEEK_SET);
136 if (returnPos != offset) {
137 PRINT_ERR(
"%s[%d], Failed to seek the position!, offset: %#x\n", __FUNCTION__, __LINE__, offset);
141 byteNum = read(fd, buffer, readSize);
143 PRINT_ERR(
"%s[%d], Failed to read from offset: %#x!\n", __FUNCTION__, __LINE__, offset);
152 if (
memcmp(ehdr->elfIdent, LD_ELFMAG, LD_SELFMAG) != 0) {
153 PRINT_ERR(
"%s[%d], The file is not elf!\n", __FUNCTION__, __LINE__);
156 if ((ehdr->elfType != LD_ET_EXEC) && (ehdr->elfType != LD_ET_DYN)) {
157 PRINT_ERR(
"%s[%d], The type of file is not ET_EXEC or ET_DYN!\n", __FUNCTION__, __LINE__);
160 if (ehdr->elfMachine != LD_EM_ARM) {
161 PRINT_ERR(
"%s[%d], The type of machine is not EM_ARM!\n", __FUNCTION__, __LINE__);
164 if (ehdr->elfPhNum > ELF_PHDR_NUM_MAX) {
165 PRINT_ERR(
"%s[%d], The num of program header is out of limit\n", __FUNCTION__, __LINE__);
168 if (ehdr->elfPhoff > fileLen) {
169 PRINT_ERR(
"%s[%d], The offset of program header is invalid, elf file is bad\n", __FUNCTION__, __LINE__);
173 PRINT_ERR(
"%s[%d], The entry of program is invalid\n", __FUNCTION__, __LINE__);
182 if ((phdr->fileSize > FILE_LENGTH_MAX) || (phdr->offset > FILE_LENGTH_MAX)) {
183 PRINT_ERR(
"%s[%d], The size of phdr is out of limit\n", __FUNCTION__, __LINE__);
186 if (phdr->memSize > MEM_SIZE_MAX) {
187 PRINT_ERR(
"%s[%d], The mem size of phdr is out of limit\n", __FUNCTION__, __LINE__);
191 PRINT_ERR(
"%s[%d], The vaddr of phdr is invalid\n", __FUNCTION__, __LINE__);
219 ret =
OsELFOpen(fileName, O_RDONLY | O_EXECVE | O_CLOEXEC);
221 PRINT_ERR(
"%s[%d], Failed to open ELF file: %s!\n", __FUNCTION__, __LINE__, fileName);
226#ifdef LOSCFG_DRIVERS_TZDRIVER
228 struct file *filep = NULL;
231 PRINT_ERR(
"%s[%d], Failed to get struct file %s!\n", __FUNCTION__, __LINE__, fileName);
240 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
246 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
247 return isExecFile ? -ENOEXEC : -ELIBBAD;
255 LD_ELF_EHDR *elfEhdr = &elfInfo->
elfEhdr;
259 if (elfEhdr->elfPhNum < 1) {
263 if (elfEhdr->elfPhEntSize !=
sizeof(LD_ELF_PHDR)) {
267 size =
sizeof(LD_ELF_PHDR) * elfEhdr->elfPhNum;
268 if ((elfEhdr->elfPhoff + size) > elfInfo->
fileLen) {
273 if (elfInfo->
elfPhdr == NULL) {
274 PRINT_ERR(
"%s[%d], Failed to allocate for elfPhdr!\n", __FUNCTION__, __LINE__);
282 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
288 PRINT_ERR(
"%s[%d], elf file is bad!\n", __FUNCTION__, __LINE__);
289 return isExecFile ? -ENOEXEC : -ELIBBAD;
295 CHAR *elfInterpName = NULL;
299 if (elfPhdr->type != LD_PT_INTERP) {
307 if ((elfPhdr->fileSize > FILE_PATH_MAX) || (elfPhdr->fileSize < FILE_PATH_MIN) ||
309 PRINT_ERR(
"%s[%d], The size of file is out of limit!\n", __FUNCTION__, __LINE__);
314 if (elfInterpName == NULL) {
315 PRINT_ERR(
"%s[%d], Failed to allocate for elfInterpName!\n", __FUNCTION__, __LINE__);
321 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
326 if (elfInterpName[elfPhdr->fileSize - 1] !=
'\0') {
327 PRINT_ERR(
"%s[%d], The name of interpreter is invalid!\n", __FUNCTION__, __LINE__);
334 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
358 prot = (((pFlags & PF_R) ? PROT_READ : 0) |
359 ((pFlags & PF_W) ? PROT_WRITE : 0) |
360 ((pFlags & PF_X) ? PROT_EXEC : 0));
366 const LD_ELF_PHDR *elfPhdrTemp = elfPhdr;
373 for (i = 0; i < phdrNum; ++i, ++elfPhdrTemp) {
374 if (elfPhdrTemp->type != LD_PT_LOAD) {
382 if (elfPhdrTemp->vAddr < addrMin) {
383 addrMin = elfPhdrTemp->vAddr;
384 offStart = elfPhdrTemp->offset;
386 if ((elfPhdrTemp->vAddr + elfPhdrTemp->memSize) > addrMax) {
387 addrMax = elfPhdrTemp->vAddr + elfPhdrTemp->memSize;
394 size = ROUNDUP(addrMax, PAGE_SIZE) - ROUNDDOWN(addrMin, PAGE_SIZE) + ROUNDDOWN(offStart, PAGE_SIZE);
396 return (size > UINT_MAX) ? 0 : (
UINT32)size;
404 UINT32 offset = elfPhdr->offset - ROUNDOFFSET(elfPhdr->vAddr, PAGE_SIZE);
405 addr = ROUNDDOWN(addr, PAGE_SIZE);
408 mapAddr = (
UINTPTR)
LOS_MMap(addr, mapSize, prot, flags, fd, offset >> PAGE_SHIFT);
410 size = elfPhdr->memSize + ROUNDOFFSET(elfPhdr->vAddr, PAGE_SIZE);
414 mapAddr = (
UINTPTR)
LOS_MMap(addr, size, prot, flags, fd, offset >> PAGE_SHIFT);
417 PRINT_ERR(
"%s %d, Failed to map a valid addr\n", __FUNCTION__, __LINE__);
428 if ((space == NULL) || (vaddr == 0) || (kvaddr == NULL)) {
429 PRINT_ERR(
"%s[%d], space: %#x, vaddr: %#x\n", __FUNCTION__, __LINE__, space, vaddr);
440 PRINT_ERR(
"%s[%d], Failed to query the vaddr: %#x, status: %d\n", __FUNCTION__, __LINE__, vaddr, ret);
445 PRINT_ERR(
"%s[%d], kvaddr is null\n", __FUNCTION__, __LINE__);
454 UINTPTR bssStartPageAlign, bssEndPageAlign;
460 bssStartPageAlign = ROUNDUP(bssStart, PAGE_SIZE);
461 bssEndPageAlign = ROUNDUP(bssEnd, PAGE_SIZE);
463 ret =
LOS_UserMemClear((VOID *)bssStart, PAGE_SIZE - ROUNDOFFSET(bssStart, PAGE_SIZE));
465 PRINT_ERR(
"%s[%d], Failed to clear bss\n", __FUNCTION__, __LINE__);
469 bssMapSize = bssEndPageAlign - bssStartPageAlign;
470 if (bssMapSize > 0) {
471 stackFlags = MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS;
472 mapBase = (
UINTPTR)
LOS_MMap(bssStartPageAlign, bssMapSize, elfProt, stackFlags, -1, 0);
474 PRINT_ERR(
"%s[%d], Failed to map bss\n", __FUNCTION__, __LINE__);
485 const LD_ELF_PHDR *elfPhdrTemp = elfPhdr;
486 UINTPTR vAddr, mapAddr, bssStart;
487 UINT32 bssEnd, elfProt, elfFlags;
491 for (i = 0; i < elfEhdr->elfPhNum; ++i, ++elfPhdrTemp) {
492 if (elfPhdrTemp->type != LD_PT_LOAD) {
495 if (elfEhdr->elfType == LD_ET_EXEC) {
502 if ((elfProt & PROT_READ) == 0) {
505 elfFlags = MAP_PRIVATE | MAP_FIXED;
506 vAddr = elfPhdrTemp->vAddr;
507 if ((vAddr == 0) && (*loadBase == 0)) {
508 elfFlags &= ~MAP_FIXED;
511 mapAddr =
OsDoMmapFile(fd, (vAddr + *loadBase), elfPhdrTemp, elfProt, elfFlags, mapSize);
515#ifdef LOSCFG_DRIVERS_TZDRIVER
516 if ((elfPhdrTemp->flags & PF_R) && (elfPhdrTemp->flags & PF_X) && !(elfPhdrTemp->flags & PF_W)) {
517 SetVmmRegionCodeStart(vAddr + *loadBase, elfPhdrTemp->memSize);
522 if (*elfLoadAddr == 0) {
523 *elfLoadAddr = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE);
526 if ((*loadBase == 0) && (elfEhdr->elfType == LD_ET_DYN)) {
530 if ((elfPhdrTemp->memSize > elfPhdrTemp->fileSize) && (elfPhdrTemp->flags & PF_W)) {
531 bssStart = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->fileSize;
532 bssEnd = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->memSize;
533 ret =
OsSetBss(elfPhdrTemp, fd, bssStart, bssEnd, elfProt);
551 PRINT_ERR(
"%s[%d], Failed to get interp allocation size!\n", __FUNCTION__, __LINE__);
556 interpMapBase, mapSize, &loadBase);
558 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
576 ret = LOS_GetUser(&userStrPtr, (
UINTPTR *)(ptr + index));
578 PRINT_ERR(
"%s[%d], %#x\n", __FUNCTION__, __LINE__, ptr);
582 return (
CHAR *)userStrPtr;
595 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
608 if ((strPtr == NULL) || (
sp == NULL)) {
612 for (i = 0; i < count; ++i) {
645 if ((argc > 0) && (argv == NULL)) {
651 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
655 for (i = argc - 1; i >= 0; --i) {
658 strLen = strlen(strPtr) + 1;
667 if (offset < strLen) {
668 PRINT_ERR(
"%s[%d], The size of param is out of limit: %#x bytes!\n", __FUNCTION__, __LINE__,
669 USER_PARAM_BYTE_MAX);
677 err = memcpy_s((VOID *)(
UINTPTR)(kvaddr + offset), strLen, strPtr, strLen);
683 PRINT_ERR(
"%s[%d], copy strings failed! err: %d\n", __FUNCTION__, __LINE__, err);
702 while (argPtr != NULL) {
704 if ((ret == 0) || (ret > PATH_MAX)) {
705 PRINT_ERR(
"%s[%d], the len of string of argv is invalid, index: %d, len: %d\n", __FUNCTION__,
706 __LINE__, count, ret);
710 if (count >= STRINGS_COUNT_MAX) {
724 if (read(randomDevFD, &randomValue,
sizeof(
UINT32)) ==
sizeof(
UINT32)) {
725 randomValue &= RANDOM_MASK;
727 randomValue = (
UINT32)random() & RANDOM_MASK;
733 return ROUNDDOWN(randomValue, PAGE_SIZE);
741 for (i = 0; i < loadInfo->
execInfo.
elfEhdr.elfPhNum; ++i, ++elfPhdrTemp) {
742 if (elfPhdrTemp->type == LD_PT_GNU_STACK) {
759 if (kvaddr == NULL) {
763 region =
LOS_RegionAlloc(space, vaddr, vsize, regionFlags | VM_MAP_REGION_FLAG_FIXED, 0);
764 if (region == NULL) {
769 vaddrTemp = region->
range.
base + vsize - psize;
777 paddrTemp += PAGE_SIZE;
778 vaddrTemp += PAGE_SIZE;
796 loadInfo->
randomDevFD = open(
"/dev/urandom", O_RDONLY);
805 if (((
UINT32)loadInfo->
stackProt & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
813 vmFlags |= VM_MAP_REGION_FLAG_STACK;
815 USER_PARAM_BYTE_MAX, vmFlags);
817 PRINT_ERR(
"%s[%d], Failed to alloc memory for user stack!\n", __FUNCTION__, __LINE__);
826 PRINT_ERR(
"%s[%d], Failed to copy filename to user stack!\n", __FUNCTION__, __LINE__);
848 INT32 items = (loadInfo->
argc + 1) + (loadInfo->
envc + 1) + 1;
851 loadInfo->
topOfMem = ROUNDDOWN((
UINTPTR)(topMem - vecIndex - items), STACK_ALIGN_SIZE);
860 PRINT_ERR(
"%s[%d], Failed to put argc to user stack!\n", __FUNCTION__, __LINE__);
868 PRINT_ERR(
"%s[%d], Failed to put argv or envp to user stack!\n", __FUNCTION__, __LINE__);
874 PRINT_ERR(
"%s[%d], Failed to copy strings! Bytes not copied: %d\n", __FUNCTION__, __LINE__, size);
886 for (i = 0; i < vecSize; ++i) {
888 if (ret !=
sizeof(
UINT32)) {
889 rndVec[i] = (
UINT32)random();
892 rndVec[i] = randomValue;
900 UINTPTR auxVector[AUX_VECTOR_SIZE] = { 0 };
903 UINT32 rndVec[RANDOM_VECTOR_SIZE];
906#ifdef LOSCFG_KERNEL_VDSO
910 ret =
OsGetRndNum(loadInfo, rndVec,
sizeof(rndVec));
914 loadInfo->
topOfMem -=
sizeof(rndVec);
923 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_PHENT,
sizeof(LD_ELF_PHDR));
924 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_PHNUM, loadInfo->
execInfo.
elfEhdr.elfPhNum);
925 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_PAGESZ, PAGE_SIZE);
926 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_BASE, interpMapBase);
927 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_FLAGS, 0);
928 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_ENTRY, loadInfo->
execInfo.
elfEhdr.elfEntry);
929 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_UID, 0);
930 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_EUID, 0);
931 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_GID, 0);
932 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_EGID, 0);
933 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_HWCAP, 0);
934 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_CLKTCK, 0);
935 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_SECURE, 0);
936 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_RANDOM, rndVecStart);
937 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_EXECFN, (
UINTPTR)loadInfo->
execName);
939#ifdef LOSCFG_KERNEL_VDSO
941 if (vdsoLoadAddr != 0) {
942 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_SYSINFO_EHDR, vdsoLoadAddr);
945 AUX_VEC_ENTRY(auxVector, vecIndex, AUX_NULL, 0);
949 PRINT_ERR(
"%s[%d], Failed to put param to user stack\n", __FUNCTION__, __LINE__);
969 PRINT_ERR(
"%s[%d], Failed to get allocation size of file: %s!\n", __FUNCTION__, __LINE__,
976 &loadInfo->
loadAddr, mapSize, &loadBase);
980 PRINT_ERR(
"%s[%d]\n", __FUNCTION__, __LINE__);
1003 PRINT_ERR(
"%s[%d], StackTop is out of limit!\n", __FUNCTION__, __LINE__);
1049 if (ret != LOS_OK) {
1054 if (ret != LOS_OK) {
1059 if (ret != LOS_OK) {
1064 if (ret != LOS_OK) {
1071 if (ret != LOS_OK) {
macro EXC_SP_SET reg1 mrc 获取CPU信息 and mov mul reg0 计算当前CPU栈的偏移位置 ldr reg1 相减得到栈顶 mov sp
void delete_files_snapshot(struct files_struct *files)
删除文件管理器快照
struct files_struct * create_files_snapshot(const struct files_struct *oldf)
创建文件管理器快照,所谓快照就是一份拷贝
void SetCloexecFlag(int procFd)
STATIC INLINE VOID LOS_AtomicInc(Atomic *v)
Atomic addSelf.
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
STATUS_T LOS_ArchMmuMap(LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T paddr, size_t count, UINT32 flags)
LOS_ArchMmuMap 映射进程空间虚拟地址区间与物理地址区间 所谓的map就是生成L1,L2页表项的过程
STATUS_T LOS_ArchMmuQuery(const LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T *paddr, UINT32 *flags)
LOS_ArchMmuQuery 获取进程空间虚拟地址对应的物理地址以及映射属性。 本函数是内核高频函数,通过MMU查询虚拟地址是否映射过,带走映射的物理地址和权限
STATIC INT32 OsELFOpen(const CHAR *fileName, INT32 oflags)
打开ELF文件
STATIC INT32 OsCopyParams(ELFLoadInfo *loadInfo, INT32 argc, CHAR *const *argv)
STATIC INT32 OsGetRndNum(const ELFLoadInfo *loadInfo, UINT32 *rndVec, UINT32 vecSize)
STATIC VOID OsFlushAspace(ELFLoadInfo *loadInfo)
INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
STATIC INT32 OsGetParamNum(CHAR *const *argv)
STATIC INT32 OsReadELFInfo(INT32 procfd, UINT8 *buffer, size_t readSize, off_t offset)
STATIC INT32 OsPutUserArg(INT32 val, const UINTPTR *sp)
STATIC INT32 OsReadPhdrs(ELFInfo *elfInfo, BOOL isExecFile)
STATIC INT32 OsMakeArgsStack(ELFLoadInfo *loadInfo, UINTPTR interpMapBase)
STATIC INT32 OsSetBss(const LD_ELF_PHDR *elfPhdr, INT32 fd, UINTPTR bssStart, UINT32 bssEnd, UINT32 elfProt)
STATIC INT32 OsLoadInterpBinary(ELFLoadInfo *loadInfo, UINTPTR *interpMapBase)
STATIC UINT32 OsGetAllocSize(const LD_ELF_PHDR *elfPhdr, INT32 phdrNum)
STATIC VOID OsLoadInit(ELFLoadInfo *loadInfo)
STATIC UINT32 OsStackAlloc(LosVmSpace *space, VADDR_T vaddr, UINT32 vsize, UINT32 psize, UINT32 regionFlags)
分配栈区
STATIC VOID OsDeInitFiles(ELFLoadInfo *loadInfo)
STATIC INT32 OsPutParamToStack(ELFLoadInfo *loadInfo, const UINTPTR *auxVecInfo, INT32 vecIndex)
INT32 OsGetKernelVaddr(LosVmSpace *space, VADDR_T vaddr, VADDR_T *kvaddr)
STATIC CHAR * OsGetParamPtr(CHAR *const *ptr, INT32 index)
STATIC VOID OsGetStackProt(ELFLoadInfo *loadInfo)
STATIC INT32 OsVerifyELFPhdr(const LD_ELF_PHDR *phdr)
STATIC INT32 OsReadInterpInfo(ELFLoadInfo *loadInfo)
STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *const *envp)
STATIC INT32 OsReadEhdr(const CHAR *fileName, ELFInfo *elfInfo, BOOL isExecFile)
STATIC INT32 OsLoadELFSegment(ELFLoadInfo *loadInfo)
STATIC INT32 OsPutUserArgv(UINTPTR *strPtr, UINTPTR **sp, INT32 count)
STATIC INT32 OsMmapELFFile(INT32 procfd, const LD_ELF_PHDR *elfPhdr, const LD_ELF_EHDR *elfEhdr, UINTPTR *elfLoadAddr, UINT32 mapSize, UINTPTR *loadBase)
STATIC UINT32 OsGetProt(UINT32 pFlags)
STATIC VOID OsDeInitLoadInfo(ELFLoadInfo *loadInfo)
STATIC UINTPTR OsDoMmapFile(INT32 fd, UINTPTR addr, const LD_ELF_PHDR *elfPhdr, UINT32 prot, UINT32 flags, UINT32 mapSize)
STATIC INT32 OsVerifyELFEhdr(const LD_ELF_EHDR *ehdr, UINT32 fileLen)
STATIC INT32 OsGetFileLength(UINT32 *fileLen, const CHAR *fileName)
STATIC INT32 OsELFClose(INT32 procFd)
UINT32 OsGetRndOffset(INT32 randomDevFD)
STATIC INLINE BOOL OsIsBadUserAddress(VADDR_T vaddr)
不超过用户空间顶部位置
LITE_OS_SEC_TEXT VOID OsExecProcessVmSpaceRestore(LosVmSpace *oldSpace)
LITE_OS_SEC_TEXT LosVmSpace * OsExecProcessVmSpaceReplace(LosVmSpace *newSpace, UINTPTR stackBase, INT32 randomDevFD)
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
vaddr_t OsVdsoLoad(const LosProcessCB *)
OsVdsoLoad 为指定进程加载vdso 本质是将系统镜像中的vsdo部分映射到进程空间
STATIC INLINE STATUS_T LOS_MuxAcquire(LosMux *m)
STATIC INLINE STATUS_T LOS_MuxRelease(LosMux *m)
STATIC INLINE BOOL LOS_IsKernelAddress(VADDR_T vaddr)
虚拟地址是否在内核空间
PADDR_T LOS_PaddrQuery(VOID *vaddr)
通过虚拟地址查询映射的物理地址
STATUS_T LOS_VmSpaceFree(LosVmSpace *space)
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
STATIC INLINE UINT32 OsCvtProtFlagsToRegionFlags(unsigned long prot, unsigned long flags)
从外部权限标签转化为线性区权限标签
LosVmMapRegion * LOS_RegionAlloc(LosVmSpace *vmSpace, VADDR_T vaddr, size_t len, UINT32 regionFlags, VM_OFFSET_T pgoff)
LosVmPage * LOS_VmPageGet(PADDR_T paddr)
通过物理地址获取页框
VOID * LOS_PhysPagesAllocContiguous(size_t nPages)
分配连续的物理页
VOID LOS_PhysPagesFreeContiguous(VOID *ptr, size_t nPages)
释放指定页数地址连续的物理内存
VADDR_T * LOS_PaddrToKVaddr(PADDR_T paddr)
通过物理地址获取内核虚拟地址
VADDR_T LOS_MMap(VADDR_T vaddr, size_t len, unsigned prot, unsigned long flags, int fd, unsigned long pgoff)
int memcmp(const void *str1, const void *str2, size_t n)
void srand(unsigned s)
初始化随机数生成器
INT32 LOS_StrnlenUser(const CHAR *src, INT32 count)
LD_ELF_EHDR elfEhdr
ELF头信息
LD_ELF_PHDR * elfPhdr
ELF程序头信息,也称段头信息
UINTPTR topOfMem
虚拟空间顶部位置,loadInfo->topOfMem = loadInfo->stackTopMax - sizeof(UINTPTR);
LosVmSpace * oldSpace
旧虚拟空间
UINTPTR elfEntry
装载点地址 即: _start 函数地址
UINTPTR stackParamBase
栈参数空间,放置启动ELF时的外部参数,大小为 USER_PARAM_BYTE_MAX 4K
const CHAR * fileName
文件名称
LosVmSpace * newSpace
新虚拟空间
ELFInfo interpInfo
解析器文件信息 lib/libc.so
UINTPTR stackBase
栈顶位置,栈基地址
UINTPTR stackTop
栈底位置,递减满栈下,stackTop是高地址位
INT32 stackProt
LD_PT_GNU_STACK栈的权限 ,例如(RW)
struct files_struct * files
物理页框描述符 虚拟内存体现的是程序对内存资源的需求,而物理内存是对该请求的供应。 伙伴算法的思想是:把内存中连续的空闲页框空间看成是空闲页框块,并按照它们的大小(连续页框的数目)分组
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
INT32 LOS_UserMemClear(unsigned char *buf, UINT32 len)
清除用户空间数据
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)
void AssociateSystemFd(int procFd, int sysFd)
参数进程FD和参数系统FD进行绑定(关联)
void FreeProcessFd(int procFd)
释放进程文件描述符
int DisassociateProcessFd(int procFd)
解绑系统文件描述符,返回系统文件描述符
int AllocProcessFd(void)
分配文件描述符
int GetAssociatedSystemFd(int procFd)
获取绑定的系统描述符