1.ptmalloc2 源码剖析3 -- 源码剖析
2.鸿蒙轻内核M核源码分析:LibC实现之Musl LibC
3.å¦ä½ä½¿ç¨cygwinç¼è¯ ffmpeg
4.å¦ä½è§£å³bus error
ptmalloc2 源码剖析3 -- 源码剖析
文章内容包含平台配置、源码malloc_state、源码arena实例、源码new_arena、源码arena_get、源码arena_get2、源码阿里weex源码解析heap、源码new_heap、源码grow_heap、源码heap_trim、源码init、源码malloc_hook、源码malloc_hook_ini、源码ptmalloc_init、源码malloc_consolidate、源码public_mALLOc、sYSMALLOc、freepublic_fREe、systrim等关键模块。
平台配置为 Debian AMD,使用ptmalloc2作为内存分配机制。奇妙源码地址
malloc_state 表征一个arena,全局只有一个main_arena实例,arena实例通过malloc_init_state()函数初始化。
当线程尝试获取arena失败时,通过new_heap获取内存区域,构建非main_arena实例。
arena_get和arena_get2分别尝试线程的私有实例和全局arena链表获取arena,若获取失败,则创建new_arena。
heap表示mmap映射连续内存区域,负数变源码每个arena至少包含一个heap,且起始地址为HEAP_MAX_SIZE整数倍。
new_heap尝试mmap映射内存,实现内存对齐,确保起始地址满足要求。
grow_heap用于内存扩展与收缩,依据当前heap状态调用mprotect或mmap进行操作。
heap_trim释放heap,条件为当前heap无已分配chunk或可用空间不足。
init阶段,zks开源码通过malloc_hook、realloc_hook和__memalign_hook函数进行内存分配。
malloc_consolidate合并fastbins和unsortedbin,优化内存分配。
public_mALLOc作为内存分配入口。
sYSMALLOc尝试系统申请内存,实现内存分配。
freepublic_fREe用于释放内存,针对map映射内存调用munmap,其他情况归还给对应arena。dojo空投源码
systrim使用sbrk归还内存。
鸿蒙轻内核M核源码分析:LibC实现之Musl LibC
本文探讨了LiteOS-M内核中Musl LibC的实现,重点关注文件系统与内存管理功能。Musl LibC在内核中提供了两种LibC实现选项,使用者可根据需求选择musl libC或newlibc。本文以musl libC为例,深度解析其文件系统与内存分配释放机制。
在使用musl libC并启用POSIX FS API时,开发者可使用文件kal\libc\musl\fs.c中定义的文件系统操作接口。这些接口遵循标准的POSIX规范,具体用法可参阅相关文档,或通过网络资源查询。例如,mount()函数用于挂载文件系统,而umount()和umount2()用于卸载文件系统,后者还支持额外的卸载选项。open()、close()、unlink()等文件操作接口允许用户打开、关闭和删除文件,其中open()还支持多种文件创建和状态标签。read()与write()用于文件数据的读写操作,lseek()则用于文件读写位置的调整。
在内存管理方面,LiteOS-M内核提供了标准的POSIX内存分配接口,包括malloc()、free()与memalign()等。其中,malloc()和free()用于内存的申请与释放,而memalign()则允许用户以指定的内存对齐大小进行内存申请。
此外,calloc()函数在分配内存时预先设置内存区域的值为零,而realloc()则用于调整已分配内存的大小。这些函数构成了内核中内存管理的核心机制,确保资源的高效利用与安全释放。
总结而言,musl libC在LiteOS-M内核中的实现,通过提供全面且高效的文件系统与内存管理功能,为开发者提供了强大的工具集,以满足不同应用场景的需求。本文虽已详述关键功能,但难免有所疏漏,欢迎读者在遇到问题或有改进建议时提出,共同推动技术进步。感谢阅读。
å¦ä½ä½¿ç¨cygwinç¼è¯ ffmpeg
4ï¼ç¶åå¨mingwçæ§å¶å°ä¸è¿å ¥ffmpegæºç ç®å½ï¼å¹¶æ§è¡å½ä»¤ï¼./configure--enable-memalign-hack çæç¼è¯æ¶æéçMakefileæ件ãç¶åæ§è¡ make å½ä»¤ï¼å°±å¯ä»¥çæç¸åºçexeæ件ï¼å¦ffmpeg.exeã ffplay_g.exeãffmpeg_g.exe çã
å¦ä½è§£å³bus error
ä¸ï¼Bus Error究ç«æ¯æä»ä¹
Bus Errorï¼å³æ»çº¿é误ã
å¼ååå ï¼
CPUå¤äºæ§è½æ¹é¢çèèï¼è¦æ±å¯¹æ°æ®è¿è¡è®¿é®æ¶é½å¿ é¡»æ¯å°å对é½çãå¦æåç°è¿è¡çä¸æ¯å°å对é½ç访é®ï¼å°±ä¼åéSIGBUSä¿¡å·ç»è¿ç¨ï¼ä½¿è¿ç¨äº§ç core dumpãRISCå æ¬SPARCï¼ä¸ç§å¾®å¤çå¨æ¶æï¼é½æ¯è¿ç§ç±»åçè¯çãxç³»åCPUé½æ¯æä¸å¯¹é½è®¿é®ï¼ä¹æä¾äºå¼å ³ç¦ç¨è¿ä¸ªæºå¶ãxæ¶æä¸è¦æ±å¯¹é½è®¿é®çæ¶åï¼å¿ å®ä¼ææ§è½ä»£ä»·ãä¾å¦ï¼å¯¹intç访é®åºè¯¥æ¯4åè对é½çï¼å³å°ååºè¯¥æ¯4çåæ°ï¼å¯¹shortåæ¯2åè对é½çï¼å°ååºè¯¥æ¯2çåæ°ã
Bus Errorä¹æå¯è½æ¯å 为æºå¨ç©çé®é¢æè 访é®æ æç©çå°åï¼ä½è¿ç§æ åµé常å°è§ã
Linuxå¹³å°ä¸æ§è¡malloc()ï¼å¦æ没æ足å¤çRAMï¼Linuxä¸æ¯è®©malloc()失败è¿åï¼èæ¯åå½åè¿ç¨ååSIGBUSä¿¡å·ã
注: 对该ç¹æ§æçæ度ï¼ææºä¼å¯èªè¡æµè¯ç¡®è®¤å½åç³»ç»ååºã
SIGBUSä¸SIGSEGVä¿¡å·çä¸è¬åºå«å¦ä¸:
1) SIGBUS(Bus error)æå³çæéæ对åºçå°åæ¯ææå°åï¼ä½æ»çº¿ä¸è½æ£å¸¸ä½¿ç¨è¯¥æéãé常æ¯æªå¯¹é½çæ°æ®è®¿é®æè´ã
2) SIGSEGV(Segment fault)æå³çæéæ对åºçå°åæ¯æ æå°åï¼æ²¡æç©çå å对åºè¯¥å°åã
äºï¼ä¾åç¨åºï¼
1 int main(){
2
3
4
5
6 #if defined(__GNUC__)
7 # if defined(__i__)
8
9 __asm__("pushf/norl $0x,(%esp)/npopf");
# elif defined(__x___)
__asm__("pushf/norl $0x,(%rsp)/npopf");
# endif
#endif
short array[];
int * p = (int *) &array[1];
*p = 1;
return 1;
}
shortç±»å大å°ä¸º2个åèï¼å ¶å°åå¿ æ¯2çåæ°ãè对äºintæéæ¥è¯´ï¼è½å¤ä½¿ç¨ä»¥è®¿é®æ°æ®çå°ååºè¯¥æ¯4çåæ°ï¼è½¬åarrary[1]çå°å为int *并访é®ï¼ç³»ç»ä¼ååºSIGBUSä¿¡å·ï¼å¯¼è´ç¨åºå´©æºã
wikiä¸çä¾åï¼
http://en.wikipedia.org/wiki/Bus_error#Bus_error_example
#include <stdlib.h>
int main( int argc, char ** argv) {
int * iptr;
char * cptr;
#if defined(__GNUC__)
# if defined(__i__)
__asm__( "pushf/n orl $0x,(%esp)/n popf" ) ;
# elif defined(__x___)
__asm__( "pushf/n orl $0x,(%rsp)/n popf" ) ;
# endif
#endif
cptr = malloc( sizeof ( int ) + 1) ;
iptr = ( int * ) ++ cptr;
* iptr = ;
return 0 ;
}
$ gcc -ansi sigbus.c -o sigbus
$ ./sigbus
Bus error
$ gdb ./sigbus
(gdb) r
Program received signal SIGBUS , Bus error.
0xba in main ()
(gdb) x/i $pc
0xba <main+>: mov DWORD PTR [eax],0x2a
(gdb) p/x $eax
$1 = 0xa
(gdb) p/t $eax & (sizeof(int) - 1)
$2 = 1
ä¸ï¼ç¼è¯å¨å硬件平å°ç¸å ³æ§
ä¸è¿°å·²ç»æè¿°ï¼å¯¹äºxå¹³å°ï¼é»è®¤å 许é对é½è®¿é®ï¼åªä¸è¿ä¼ææ§è½ä»£ä»·ãå¼å¯æ£æµå¯ä»¥ä½¿ç¨ä¸è¿°ä»£ç ä¸çå®ã
è¿æ®µç¨åºå¦æç¨Sun Studioç¼è¯å¨çè¯ï¼è¿è¡å°±æ²¡æé®é¢ãè¿æ¯å 为Sun Studioé»è®¤å¯¹ä½ç¼è¯ä½¿ç¨çåæ°æ¯-xmemalign=8iï¼å ¶ä¸ié项设置æç¡®ææä¸äº§çSIGBUSä¿¡å·ã
ä¸è¿å¦æç¼è¯æä½ç¨åºï¼Sun Studio使ç¨ç-xmemalign=8sï¼å ¶ä¸sé项设置æå³å¯¹è¿ç§é对é½è®¿é®äº§çSIGBUSä¿¡å·ï¼åä»æ§ä¼éå°è¿ä¸ªé误ã
å¦æåæå¨SPARCä¸ä½¿ç¨GCCå»ç¼è¯è¿ç§ä»£ç ï¼å¯ä»¥å¦ä¸è¿è¡ï¼
GCCæä¸ä¸ªType Attributesç¹æ§ï¼ä¾å¦å¨é人工对é½çåéåå ä¸ï¼__attribute__ ((aligned (4))); å ¶æä¹å°±æ¯æå®å移é为4çåæ°ãæ¯å¦ï¼
short array[] __attribute__ ((aligned (4)))ï¼
ä¸è¿è¿ä¸ªå±æ§åªå¯¹Linkerè¿æ¥å¨å¯è§çåéææï¼ä¹å°±æ¯è¯´å¯¹local variableæ æãèä¸è¿ç§ç¹æ§ä½ç¨ç²åº¦æ¯è¾å¤§ï¼æ¯å¦è¿éåªå¯¹ç¬¬ä¸ä¸ªå ç´ æä½ç¨ï¼å¹¶ä¸ä¸ºæ°ç»çæ¯ä¸ªæå设置å移éãå¦æä¸å®è¦é对local variableæè æ°ç»çæ¯ä¸ªæåè¿è¡å移é设置ï¼å¯ä»¥ä½¿ç¨unionç±»å:
union {
short s;
int i;
}