feat: 基于汇编实现内核对用户态内存清零的功能

背景:LOS_UserMemClear接口原有实现是通过在内核中
申请一块堆内存并对其清零,调用copy_to_user来达到
对用户态内存清零的目的,需要使用堆内存。
修改方案:基于汇编实现内核对用户态内存清零的功能。

close #I3XXT0

Change-Id: I27cb1e45559cb75a9b330799fe427abd54f51c15
Signed-off-by: Haryslee <lihao189@huawei.com>
This commit is contained in:
Haryslee
2021-06-26 14:36:00 +08:00
parent b8e18ffdf1
commit 9db3407589
4 changed files with 157 additions and 34 deletions

View File

@@ -416,42 +416,20 @@ INT32 OsGetKernelVaddr(const LosVmSpace *space, VADDR_T vaddr, VADDR_T *kvaddr)
STATIC INT32 OsSetBss(const LD_ELF_PHDR *elfPhdr, INT32 fd, UINTPTR bssStart, UINT32 bssEnd, UINT32 elfProt)
{
UINTPTR bssPageStart, bssStartPageAlign, bssEndPageAlign;
UINTPTR bssStartPageAlign, bssEndPageAlign;
UINTPTR mapBase;
UINT32 offset, size;
UINT32 bssMapSize;
INT32 stackFlags;
INT32 ret;
vaddr_t kvaddr = 0;
bssPageStart = ROUNDDOWN(bssStart, PAGE_SIZE);
bssStartPageAlign = ROUNDUP(bssStart, PAGE_SIZE);
bssEndPageAlign = ROUNDUP(bssEnd, PAGE_SIZE);
ret = LOS_UnMMap(bssPageStart, (bssEndPageAlign - bssPageStart));
if ((ret != LOS_OK) && (bssPageStart != 0)) {
PRINT_ERR("%s[%d], Failed to unmap a region, vaddr: %#x!\n", __FUNCTION__, __LINE__, bssPageStart);
}
ret = LOS_UserSpaceVmAlloc(OsCurrProcessGet()->vmSpace, PAGE_SIZE, (VOID **)&bssPageStart,
0, OsCvtProtFlagsToRegionFlags(elfProt, MAP_FIXED));
if (ret != LOS_OK) {
PRINT_ERR("%s[%d], Failed to do vmm alloc!\n", __FUNCTION__, __LINE__);
return -ENOMEM;
}
ret = OsGetKernelVaddr(OsCurrProcessGet()->vmSpace, bssPageStart, &kvaddr);
if (ret != LOS_OK) {
PRINT_ERR("%s[%d]\n", __FUNCTION__, __LINE__);
ret = LOS_UserMemClear((VOID *)bssStart, PAGE_SIZE - ROUNDOFFSET(bssStart, PAGE_SIZE));
if (ret != 0) {
PRINT_ERR("%s[%d], Failed to clear bss\n", __FUNCTION__, __LINE__);
return -EFAULT;
}
(VOID)memset_s((VOID *)(UINTPTR)kvaddr, PAGE_SIZE, 0, PAGE_SIZE);
offset = ROUNDDOWN(elfPhdr->offset + elfPhdr->fileSize, PAGE_SIZE);
size = ROUNDOFFSET(elfPhdr->offset + elfPhdr->fileSize, PAGE_SIZE);
ret = OsReadELFInfo(fd, (UINT8 *)(UINTPTR)kvaddr, size, offset);
if (ret != LOS_OK) {
PRINT_ERR("%s[%d]\n", __FUNCTION__, __LINE__);
return -EIO;
}
bssMapSize = bssEndPageAlign - bssStartPageAlign;
if (bssMapSize > 0) {