文章目录

  • 1、TA的反汇编文件
  • 2、TA中的堆的定义
  • 3、malloc

★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

TA(trust application)是optee种的应用程序,也就是userspace

1、TA的反汇编文件

内核栈定义在nozi段

architecture: aarch64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000000020Program Header:LOAD off    0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**16filesz 0x000000000000777c memsz 0x000000000000777c flags r-xLOAD off    0x0000000000017780 vaddr 0x0000000000007780 paddr 0x0000000000007780 align 2**16filesz 0x0000000000001c34 memsz 0x0000000000001c34 flags r--LOAD off    0x000000000001a000 vaddr 0x000000000000a000 paddr 0x000000000000a000 align 2**16filesz 0x0000000000001cfc memsz 0x000000000000c740 flags rw-DYNAMIC off    0x0000000000019040 vaddr 0x0000000000009040 paddr 0x0000000000009040 align 2**3filesz 0x00000000000000f0 memsz 0x00000000000000f0 flags rw-Dynamic Section:HASH                 0x0000000000009360STRTAB               0x00000000000092b0SYMTAB               0x0000000000009130STRSZ                0x00000000000000acSYMENT               0x0000000000000018DEBUG                0x0000000000000000RELA                 0x0000000000008d38RELASZ               0x00000000000002a0RELAENT              0x0000000000000018RELACOUNT            0x0000000000000013
private flags = 0:Sections:
Idx Name          Size      VMA               LMA               File off  Algn0 .ta_head      00000020  0000000000000000  0000000000000000  00010000  2**3CONTENTS, ALLOC, LOAD, DATA1 .text         0000775c  0000000000000020  0000000000000020  00010020  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE2 .rodata       000015b4  0000000000007780  0000000000007780  00017780  2**3CONTENTS, ALLOC, LOAD, READONLY, DATA3 .dynsym       00000180  0000000000009130  0000000000009130  00019130  2**3CONTENTS, ALLOC, LOAD, READONLY, DATA4 .rela.dyn     000001c8  0000000000008d38  0000000000008d38  00018d38  2**3CONTENTS, ALLOC, LOAD, READONLY, DATA5 .got          00000068  0000000000008f00  0000000000008f00  00018f00  2**3CONTENTS, ALLOC, LOAD, DATA6 .rela.got     000000d8  0000000000008f68  0000000000008f68  00018f68  2**3CONTENTS, ALLOC, LOAD, READONLY, DATA7 .dynamic      000000f0  0000000000009040  0000000000009040  00019040  2**3CONTENTS, ALLOC, LOAD, DATA8 .dynstr       000000ac  00000000000092b0  00000000000092b0  000192b0  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA9 .hash         00000054  0000000000009360  0000000000009360  00019360  2**3CONTENTS, ALLOC, LOAD, READONLY, DATA10 .data         00001cfc  000000000000a000  000000000000a000  0001a000  2**3CONTENTS, ALLOC, LOAD, DATA11 .bss          0000aa40  000000000000bd00  000000000000bd00  0001bcfc  2**3ALLOC12 .debug_info   000103be  0000000000000000  0000000000000000  0001bcfc  2**0CONTENTS, READONLY, DEBUGGING13 .debug_abbrev 00003fbb  0000000000000000  0000000000000000  0002c0ba  2**0CONTENTS, READONLY, DEBUGGING14 .debug_loc    00015e83  0000000000000000  0000000000000000  00030075  2**0CONTENTS, READONLY, DEBUGGING15 .debug_aranges 00000b70  0000000000000000  0000000000000000  00045f00  2**4CONTENTS, READONLY, DEBUGGING16 .debug_ranges 00000ea0  0000000000000000  0000000000000000  00046a70  2**4CONTENTS, READONLY, DEBUGGING17 .debug_line   00003bde  0000000000000000  0000000000000000  00047910  2**0CONTENTS, READONLY, DEBUGGING18 .debug_str    0000267d  0000000000000000  0000000000000000  0004b4ee  2**0CONTENTS, READONLY, DEBUGGING19 .comment      0000003c  0000000000000000  0000000000000000  0004db6b  2**0CONTENTS, READONLY20 .debug_frame  00002220  0000000000000000  0000000000000000  0004dba8  2**3CONTENTS, READONLY, DEBUGGING

2、TA中的堆的定义

堆空间ta_heap是一个全局数组,全局数组都是分配在bss段的,所以堆ta_heap就是在编译时,分配到bss段种的一块数组

/* Keeping the heap in bss */
uint8_t ta_heap[TA_DATA_SIZE];
const size_t ta_heap_size = sizeof(ta_heap);

堆和栈的大小,都是在User_ta_header_defines.h文件种定义的:

#define TA_STACK_SIZE        (2 * 1024)
#define TA_DATA_SIZE        (4 * 1024 * 1024 + 32 * 1024)

在系统加载TA时init_instance()函数中,将堆空间加入到malloc_poolset链表(内存池)

static TEE_Result init_instance(void)
{trace_set_level(tahead_get_trace_level());__utee_gprof_init();malloc_add_pool(ta_heap, ta_heap_size);_TEE_MathAPI_Init();return TA_CreateEntryPoint();
}
void malloc_add_pool(void *buf, size_t len)
{void *p;size_t l;uint32_t exceptions;uintptr_t start = (uintptr_t)buf;uintptr_t end = start + len;const size_t min_len = ((sizeof(struct malloc_pool) + (SizeQuant - 1)) &(~(SizeQuant - 1))) +sizeof(struct bhead) * 2;start = ROUNDUP(start, SizeQuant);end = ROUNDDOWN(end, SizeQuant);assert(start < end);if ((end - start) < min_len) {DMSG("Skipping too small pool");return;}exceptions = malloc_lock();tag_asan_free((void *)start, end - start);bpool((void *)start, end - start, &malloc_poolset);l = malloc_pool_len + 1;p = realloc_unlocked(malloc_pool, sizeof(struct malloc_pool) * l);assert(p);malloc_pool = p;malloc_pool[malloc_pool_len].buf = (void *)start;malloc_pool[malloc_pool_len].len = end - start;
#ifdef BufStatsmstats.size += malloc_pool[malloc_pool_len].len;
#endifmalloc_pool_len = l;malloc_unlock(exceptions);
}

3、malloc

应用程序调用malloc,其实就是在调用mdbg_malloc,从malloc_poolset链表(内存池)分配内存

#define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size))
#define calloc(nmemb, size) \mdbg_calloc(__FILE__, __LINE__, (nmemb), (size))void *mdbg_malloc(const char *fname, int lineno, size_t size)
{struct mdbg_hdr *hdr;uint32_t exceptions = malloc_lock();/** Check struct mdbg_hdr doesn't get bad alignment.* This is required by C standard: the buffer returned from* malloc() should be aligned with a fundamental alignment.* For ARM32, the required alignment is 8. For ARM64, it is 16.*/COMPILE_TIME_ASSERT((sizeof(struct mdbg_hdr) % (__alignof(uintptr_t) * 2)) == 0);hdr = raw_malloc(sizeof(struct mdbg_hdr),mdbg_get_ftr_size(size), size, &malloc_poolset);if (hdr) {mdbg_update_hdr(hdr, fname, lineno, size);hdr++;}malloc_unlock(exceptions);return hdr;
}

optee应用程序中malloc函数的原理介绍相关推荐

  1. optee内核中malloc函数的原理介绍

    文章目录 1.链接文件和汇编文件的对比分析 2.malloc和calloc 3.optee中的内核栈 ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.链接文件和汇编文件的对比分析 可用查 ...

  2. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

  3. 【转】malloc函数实现原理!

    [转]malloc函数实现原理! https://blog.csdn.net/YEDITABA/article/details/53443792 重载new和delete来检测内存泄漏 posted ...

  4. api中重载函数的原理_小心重载API方法

    api中重载函数的原理 重载方法是API设计中的一个重要概念,尤其是当您的API是流利的API或DSL( 特定于域的语言 )时. 对于jOOQ就是这种情况,在这种情况下,您经常想使用与完全相同的方法名 ...

  5. C语言将字符串s连接到t的后面,下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t..._考试资料网...

    问答题下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t中,然后把s中的字符按逆序连接到字符串t的后面. 例如,当s中的字符串为"ABCDE"时,则t中的 ...

  6. C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入

    例题:下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序.插入法的基本算法是:先对字符串中的头两个元素进行排序:然后把第三字符插入到前两个字符中,插入后前三个字 ...

  7. C语言编程>第二十周 ② 下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调、次最大数和b[1]中的数对调。

    例题:下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调.次最大数和b[1]中的数对调. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. ...

  8. 在c语言程序中main函数的位置,在C语言程序中,main函数的位置_________。

    在C语言程序中,main函数的位置_________. 答:可以放在任意位置 一切邪教组织及其活动都是诡秘的.邪恶的.危害社会的.非法的 答:正确 产品可以根据其耐用性和是否有形而分为( ) 答:非耐 ...

  9. C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:

    例题:下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值: 例如,若n=1000,则应输出0.000155. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. 代码 ...

最新文章

  1. tac rev cat命令使用范例
  2. 英伟达推出Super显卡,老黄再现精准“刀法”,网友:都是被AMD逼的
  3. python学会后月薪-零基础python培训后薪资有多少?
  4. python import_Python Import 详解
  5. 20172326 《程序设计与数据结构》第六周学习总结
  6. CXF WebService 开发文档-目录索引
  7. c# 多线程实现ping 多线程控制控件
  8. Ubuntu Linux下使用锐捷认证的方法
  9. Linux Device Tree
  10. 玩玩AJAX之使用ashx文件响应来自JQuery的JSON请求.
  11. 清华大学操作系统OS学习(七)——进程控制
  12. 小米6Android11刷机包,小米6刷机包MIUI12
  13. DEA模型及matlab应用1:CCR模型与BCC模型
  14. hazy的leetcode刷题笔记(五)
  15. 如何查看电脑的SN码?
  16. 沃丰科技:AI赋能泛CRM,为新企服扬风鼓帆
  17. SpringMvc+饿了么UI组件+七牛云做图片上传
  18. Linux操作系统学习02
  19. python语法速记, Python 3 Cheat Sheet
  20. Typora中(Markdown语法)在符号的上方添加符号或文字

热门文章

  1. 数据中心用多模光纤技术及发展趋势
  2. 问答:双总线并机,可以使用不同品牌的ups吗?
  3. 成功解决absl.flags._exceptions.IllegalFlagValueError: flag --train_size=inf: Expect argument to be a str
  4. 成功解决ModuleNotFoundError: No module named 'HTMLParser'
  5. Mysql升级过程的问题
  6. django学习——通过HttpResponseRedirect 和 reverse实现重定向(转载)
  7. 关于接口 RandomAccess
  8. mybatis 动态 SQL
  9. $(document).ready() $(window).load 及js的window.onload
  10. bzoj1452: [JSOI2009]Count