自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 问答 (7)
  • 收藏
  • 关注

原创 MMAP内存映射学习笔记

fd : 要映射到内存中的文件描述符。如下图,除了固定的代码段、数据段、BSS段、堆、栈,还有一个MMAP 段,此段为程序员自己通过mmap()函数主动生成的一个段,用于将磁盘文档映射到内存中以增加文件访问效率(也可进行进程通信)的一种手段。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。最终被映射文件的内容的长度不会超过文件本身的初始大小,即映射不能改变文件的大小。

2023-03-27 17:36:58 237

原创 虚拟内存管理简要分析

系统侧帮我们解决了,系统帮我们动态分配和释放物理内存。程序运行时,给每个进程虚出一整块虚拟内存,而且可能比实际物理内存还大,让我们认为每个进程自己独占所有的物理内存,我们只管写代码,申请和使用内存,而不用管内存是否足够(当然也不能这么任性)。让程序员认为所有内存都是自己的。今天我们以32位系统为例,系统为每个进程虚拟出4G内存空间,其中3G为用户空间,1G内核工具大家共享。于是这样就解决了我们之前提出来的前两个问题。

2023-03-27 17:35:57 139

原创 C语言 作用域、存储期、链接属性汇总

静态内链接 静态 文件 内链接 所有函数外,用static修饰。静态无链接 静态 块 无链接 块内,使用static修饰。动态存储期:就是用new 或者malloc分配的内存,如果不主动释放,在整个程序都占有内存。内链接:即在从声明到文件结束都是可见的。

2023-03-27 17:33:55 83

原创 C语言文件操作随笔

打开文件时,会将文件的数据读到上述结构体中,读取文件就是从缓冲区读取。当缓冲区数据读完了就再次将文件中的数据读到缓冲区,然后从缓冲区读数据。但是如果二级调用中return只是返回上一级调用,但是exit表示结束进程。在main中return 与exit 两个返回是等效的,都是结束进程。1、return 与exit的区别。写文件动作相反,写到缓冲区。

2023-03-27 17:32:31 56

原创 FORK 创建进程的过程分析

fork创建一个进程,实际上就将父进程的进程信息拷贝给子进程,子进程的起点就是父进程系统调用结束的位置。下面我们来跟踪fork内核执行过程,我们断住主要函数do_fork、copy_process、dup_task_struct、copy_thread 、如上图所示,前面两个调用为申请task_struct、thread_info 的内存,arch_dup_task_struct就是将父进程的。setup_thread_stack:这个函数是将父进程的堆栈thread_info拷贝给子进程。

2023-03-27 17:30:27 321

原创 进程上下文切换分析

"jmp __switch_to\n" /* regparm call */ \ ——新进程的eip 写入eip寄存器,下面就正式切换到新进程了 ,这个为啥jmp __switch_to,不用call?如上图,schedule——>__schedule——>pick_next_task().,pick_next_task这个函数封装了进程调度算法,他返回下一个需要调度的进程。我今天分析一下进程的上下文切换,也就是进程调度时,怎么由当前进程切换到另一个进程的。

2023-03-27 17:29:47 75

原创 系统调用软中断处理程序SYSTEM_CALL分析

3、system_call分析:D:\学习资料\linux\linux-3.18.6\linux-3.18.6\arch\x86\kernel\entry_32.S。上一篇博客分析了用户空间部分:API——封装例程。system_call主要流程:save_all——系统调用应用程序——restore_all。最近学习了系统调用的整个流程,这里总结并记录。系统调用整个过程为:API——封装例程——system_call——系统调用程序。可以看到,我们将系统调用处理函数断住后,当使用系统调用,就会断住。

2023-03-27 17:29:30 99

原创 进程装载过程分析(EXECVE系统调用分析)

如上图可以看到在start_thread函数中将新的进程的入口函数加载到堆栈中了,而进程入口就是进行elf文件中的entry point address.于是当进程返回用户空间时,就从新的进程入口开始执行了,于是进程就被替换成新的进程了——偷梁换柱。然后“elf_entry”这个就是新的进程的入口,也就是这里是在准备新进程的堆栈信息、执行环境,实际上start_thread就是将原来的进程的堆栈信息全给替换为了新的进程的堆栈.我们进程的加载都是通过exec系统调用在内核中通过堆栈的替换 来偷梁换柱完成的。

2023-03-27 17:29:05 133

原创 LINUX 系统调用分析

通常用户空间是无法直接访问内核空间的,但是有时候确实需要这样做,于是就产生的系统调用,系统调用是操作系统对用户空间提供的访问内核空间的API。用户态调用系统调用API时,调用到系统调用封装例程,例程通过命令触发一个软终端(系统调用专用,中断号:0x80),系统进入内核态,并走到。系统调用分为:系统调用API、封装例程、系统调用处理程序、系统调用服务程序,其中系统调用处理程序和服务程序在内核空间。(3)、使用系统调用时,通过eax 寄存器将系统调用号传递到内核,系统调用的入参通过ebx、ecx……

2023-03-27 17:25:54 91

原创 webrtc 不使用alsa

peerconnect创建的时候(CreatePeerConnectionFactory)一定要创建音频的encode和decode,要不然会崩溃——可能时音频是基础功能吧, 即使后续AddTrack 的时候不添加音频的源。CreatePeerConnectionFactory里面会做相应的检查:支持的编解码、视频设备情况、音频设备情况,在检查音频设备的时候会操作音频设备节点。2、注意上面红色的函数,里面会根据平台来选择不同的音频设备,linux使用alsa(AudioDeviceLinuxALSA)

2023-03-27 17:23:00 83

原创 gcc编译webrtc arm64版

项目需要在arm64平台上跑webrtc,但是提供的工具链是gcc/g++。大家都指定webrtc 默认的编译器是clang++ ,clang++编出来的库,如果第二次开发使用gcc/g++会有很多兼容问题,所以需要将webrtc也用gcc编译。环境:ubuntu16.4 x86目标环境:linux arm641、下载webrtc:设置代理:export http_porxy="http://127.0.0.1:7777"export https_porxy="http://127.0

2022-05-10 17:33:26 2322 2

原创 Webrtc 直接使用alsa,去使能pulseaudio

webrtc 在linux环境下默认是使用的pulseaudio,但是很多嵌入式产品是没有pulseaudio 的,而是alsa,会导致程序崩溃,在这种情况下需要将pulseaudio 去使能。崩溃的日志:看到了其中有一条”pulseaudio is enable“。于是翻开audio_device_impl.cc 代码查看:意思就是通过”rtc_include_pulse_audio“ 这个编译参数来控制是否使用pulseaudio,默认是true,也就是使用pulseaudio,如果

2022-05-06 12:06:29 497

原创 jenkins参数化构建,邮箱配置踩坑

jenkins、参数化构建、发邮件

2021-12-24 15:43:37 507

原创 ndk 的makefile ,加了静态参数,编译出来还是动态的,跪求指点

ndk 的makefile ,加了静态参数,编译出来还是动态的,跪求指点下面是我的makefile。也加了Application.makLOCAL_PATH:=$(call my-dir)Android_Ver := 4.8prebuilt_stdcxx_PATH := $(NDK_ROOT)/sources/cxx-stlinclude $(CLE

2017-12-11 19:29:58 540 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除