aosp源码编译与阅读

下载源码 国内从google下载aosp源码需要翻墙,很不方便。可以使用清华大学开源软件镜像站提供的镜像地址进行下载,同步代码. 下载,检出代码按照清华镜像站的地址说明一步步操作就可以了. 可能的错误 初始化包比较大,下载后记得进行md5校验. 使用迅雷中断后续传,发现md5值不匹配,推荐使用uget之类的工具在晚上下载,一次成功. aosp编译 官方指导 建立编译环境 编译 Android 编译很简单, aosp源码中prebuilts目录下集成了所有编译会用到的工具,包括clang, jdk等,不需要额外下载. 编译脚本只支持python2,环境上安装一下python2就可以了. 在Ubuntu 18.04上使用如下步骤进行编译: 设置环境变量等 source build/envsetup.sh 设置编译目标版本 lism@lism-u18:~/android/aosp$ lunch aosp_x86_64-eng ============================================ PLATFORM_VERSION_CODENAME=R PLATFORM_VERSION=R TARGET_PRODUCT=aosp_x86_64 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_ARCH=x86_64 TARGET_ARCH_VARIANT=x86_64 TARGET_2ND_ARCH=x86 TARGET_2ND_ARCH_VARIANT=x86_64 HOST_ARCH=x86_64 HOST_2ND_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-5.0.0-37-generic-x86_64-Ubuntu-18.04.3-LTS HOST_CROSS_OS=windows HOST_CROSS_ARCH=x86 HOST_CROSS_2ND_ARCH=x86_64 HOST_BUILD_TYPE=release BUILD_ID=QD1A.190821.011 OUT_DIR=out ============================================ 如果不清楚需要输入什么版本, 输入lunch后会自动列出支持的版本信息. lism@lism-u18:~/android/aosp$ lunch You're building on Linux Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_blueline-userdebug 4. aosp_bonito-userdebug 5.……

阅读全文

I/O模型

I/O处理过程 系统调用 操作系统出于安全的考虑,将进程的内存空间划分为用户空间(0~3G)和内核空间(3-4G)。进程在执行用户自己的代码时处于用户态(ring3); 当用户代码需要操作系统资源时, 可以通过调用操作系统提供的标准接口(POSIX)进行访问, 此时进程从用户态切换到内核态. 操作系统提供的这些接口称为系统调用. 使用top命令时, Cpu后面的us就对应用户态使用的cpu, sy就对应内核态使用的cpu. %Cpu(s): 1.2 us, 0.7 sy, 0.0 ni, 98.0 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st 硬盘, 网卡等等这些设备, 用户代码都是无法直接访问的, 需要通过操作系统提供的标准系统调用进行访问. 对于linux系统, 将所有的设备都抽象成文件, 因此, 对于这些设备的访问都可以归类为IO操作. 文件读取过程 用户程序读取磁盘或网卡上的数据, 执行read系统调用时可以分为2个过程: 操作系统需要将磁盘或网卡上的数据先拷贝到内核缓冲区 操作系统再将内核缓冲区的数据拷贝到用户缓冲区 内核缓冲区 我们知道, 硬盘等外设因为硬件原因, 读写相对内存来说是要慢几个数量级的. 如果内核一有数据就立即写入磁盘, 就需要频繁的调用驱动的硬件.操作系统为了提高与硬件交互的效率, 并不会一有数据就立即写入, 而是等攒够一些数据之后再批量写入. 因此, 内核缓冲区时为了减少内核与外部硬件交互的次数. 用户缓冲区 操作系统进行系统调用是有一定开销的, 而且相对开销很大. 回想读取文件时, 我们都会先申请一个buffer数组, 然后循环每次read len大小的数据, 之后代码对buffer内容进行处理. 这么做的原因是为了避免频繁的进行系统调用. 关于len为什么取1024或4096, «UNIX环境高级编程»中专门有讨论, 这个取值是基于统计分析出来的最佳大小. 因此, 用户缓冲区是为了减少系统调用次数.……

阅读全文

自己动手组装台式机

双十一买了一个34'的21:9超宽屏显示器,回来之后接上笔记本,越来越觉得笔记本有点儿带不动。正好最近学习android需要编译aosp, 然后就研究了一下攒机,预算3000,组一台linux编译机。于是趁着双十二买了一堆零件自己组了一台电脑。 配置单 先说说最终的配置: 配件 型号 价格 CPU ryzen 3700x 主板 MSI B450M mortar max 主板+CPU套装 ¥2514 内存 海盗船 DDR4 3600MHz 16G x 2 ¥1038 固态硬盘 阿斯加特 M.2 NVMe 500G ¥343 显卡 二手铭暄 GTX 960 2G ¥399 电源 酷冷至尊 MWE 550 铜牌 ¥312 机箱 先马 征途 中塔机箱 送5把RGB机箱风扇 ¥164 显示器 小米 34’ 曲面显示器 ¥1999 无线网卡 腾达U10 USB无线网卡 ¥59 dp线 绿联 DP 1.……

阅读全文

Making debugger for Golang

转载自 Making debugger for Golang (part I) The goal of this series is not to write full-featured debugger for Go programming language. If you’re looking for some then please take a look at Delve. We’ll try to understand here how debuggers work in general and how to implement basic one on Linux which takes into account Golang’s features like goroutines. Creating debugger isn’t easy though. We won’t even strive to cover this topic within a single story.……

阅读全文

Making debugger for Golang

转载自 Making debugger for Golang (part II) During the first part we’ve bootstrapped development environment and made a simple program (tracer) which stops child process (tracee) at the very beginning and then continues it execution together with showing its standard output. Now it’s time to extend its basic capabilities. Usually debuggers allow to single-step through debugged program. It can be done using ptrace PTRACE_SINGLESTEP request which tells tracee to stop after execution of single instruction:……

阅读全文

Making debugger for Golang

转载自 Making debugger for Golang (part III) So far we’ve learned how to single-step ptraced process (tracee) and get some debugging info out of binary (read it here if you haven’t done it yet). Now it’s time to set a breakpoint at desired place, wait until reached and then investigate process state. Let’s start with assembly code used before: section .data msg db "hello, world!", 0xA len equ $ - msg section .……

阅读全文