- 博客(44)
- 收藏
- 关注
原创 mina架构分析
使用的版本是2.0.9IoService分析AbstractIoAcceptor定义了所有的public接口,并定义了子类需要实现的bindInternal函数,AbstractPollingIoAcceptor作为它的一个派生类,主要就是实现bindInternal函数,AbstractPollingIoAcceptor类定义了bindInternal的实现框
2014-12-18 17:18:02 2648
原创 ubuntu12.04LTS编译chromium记
最近想调试下chromium,所以按照chromium.org上的文档按部就班的下载,编译,发现总是编译不过,经过一番折腾,终于成功编译通过,如下做个记录,以飨来者。chromium的编译跟几个内容相关,需要特别注意1.所使用的操作系统2.下载的chromium我用的是ubuntu12.04LTS,开始用14.04总是卡在安装依赖包上,还有就是chromium的
2014-11-12 22:28:04 1244
翻译 Refptr and PassRefPtr basic
http://www.webkit.org/coding/RefPtr.htmlRefptr and PassRefPtr basicWebkit中的很多对象都是引用计数的,所使用的方法是在类中加入ref和deref成员函数用于增加和减小引用计数。调用ref的次数一定要和调用deref的次数相同,当引用计数deref到1的时候,该对象会被释放。Webkit中的很多类通过继承RefCount
2014-03-13 22:48:04 896
原创 金山快盘ubuntu shell客户端
一直在用金山快盘存储文件,但是在ubuntu下一直没有好用的工具,过年的时候终于有时间可以写一个python客户端了,但是悲催的是完成了大部分的时候,笔记本突然坏掉了,后来换了主板,继而又发现硬盘盘片也坏掉了,修笔记本的小姑娘一直问我到底是什么功夫把笔记本坏的这么彻底的,我faint。幸好在git上备份了一些代码,今天终于完成了基本功能,说明如下:环境:python 2.7代码:https
2014-03-10 00:48:24 1349
转载 伪指令LTORG
转自:http://blog.csdn.net/lemon_fantasy/article/details/2612860LTORG用于声明一个数据缓冲池,(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。语法LTORG使用说明:当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止
2014-03-06 13:34:12 590
原创 S3C2440 clock研究
Clock研究关键字PLL锁相环,用于产生高频率时钟,有两种锁相环,MPLL和UPLLMPLL用于对CPU产生高频率的锁相环UPLL用于对USB设备产生高频率的锁相环XTIpll外部晶振EXTCLK外部时钟OSC振荡器FCLK CPU系统时钟HCLK AHB高速总线时钟PCLK APB外围设备总线时钟 Clock框图
2014-03-03 13:42:08 628
原创 运行时环境笔记
《编译原理与实践》第七章名词:活动记录(Activation Record):包括参数,状态信息,local data,临时数据stack frames:存储在stack上的ARframe pointer:专门用于指向AR的寄存器argument pointer(ap):专门用于指向AR中参数部分的寄存器调用序列(calling sequence):包括AR的内存分配,参数
2014-03-02 22:09:15 903
原创 IA-32运行时环境
参考链接:http://mentorembedded.github.io/cxx-abi/abi.html#calls现在来看看实际的运行时环境的实现,如下的PDF中给出了几种CPU的函数调用规范,我们现在只对ia-32进行分析其中linkage area存放caller的下一条指令的地址saved frame pointer:caller的stack frame的地址
2014-03-02 22:08:31 629
原创 《自己动手编写操作系统》笔记
2013-3-26这两天在学习编写操作系统,略记于下1. 描述符和选择子结构细节说明 描述符和选择子的结构如上,从描述符结构上看,段基址是4字节32b
2014-03-02 22:06:59 840
原创 S3c2440的sdram
首先要明白几个概念,S3C2440是处理器,是芯片,其中包含了ARM核和各种硬件控制器,这些控制器中就包括内存控制器,而处理器要想使用内存硬件就需要程序员通过代码把该内存设备的参数告诉内存控制器,这也就是内存初始化要做的事情,下面我们从CPU地址空间,sdram工作原理和内存控制器的寄存器设置三方面来说明如何使用sdram1.CPU的地址空间S3C2440使用了ADDR0-ADDR26,共27
2014-03-02 22:05:40 1176
原创 MMU
本文主要从以下几个方面对于ARM和Intel cpu的MMU1.逻辑地址,虚拟地址,物理地址的概念2.逻辑地址,虚拟地址,物理地址的转换3.哪些是CPU自动完成的,哪些是操作系统做的,哪些是用户程序做的逻辑地址在编译应用程序的时候,为了让应用程序能够不依赖于某个全局地址,所以对应用程序中的代码和数据都是采用相对地址编译的,也就是说,在用户空间,指令和数据的地址都是从0地址开始的,这就是
2014-03-02 22:04:48 588
原创 S3C2440 clock研究
Clock研究关键字PLL锁相环,用于产生高频率时钟,有两种锁相环,MPLL和UPLLMPLL用于对CPU产生高频率的锁相环UPLL用于对USB设备产生高频率的锁相环XTIpll外部晶振EXTCLK外部时钟OSC振荡器FCLK CPU系统时钟HCLK AHB高速总线时钟PCLK APB外围设备总线时钟 Clock框图
2014-03-02 22:03:55 788
原创 Linux0.12内核读书笔记
实践一.准备工作1.代码下载http://oldlinux.org/Linux.old/kernel/0.1x/linux-0.12.tar.gz读书笔记第六章 引导启动程序Boot1.PC在电源开启后,80x86 CPU将进入实模式,并从地址0xFFFF0开始自动执行程序代码,这里通常是BIOS的地址,它首先执行某些系统检测,然后在0地址处初始化中断向量,注意这里的中断向量号是BI
2014-03-02 22:01:42 1574
原创 python的类及对象
python中一切皆为对象,不管是类,还是实例,甚至是创建类的元类名字空间类和函数很相似,他们都定义了名字空间,他们都允许在声明中创建函数和闭包类的属性类有数据属性和非数据属性,数据属性相当于C++中的类变量,非数据属性一般就是类的方法。类有很多特殊的数据属性,例如__dict__属性,它是一个字典,包含了所有类的属性及其值,__module__属性存储
2014-03-02 21:58:01 1027
原创 v8的Frame
一.何为frameframe是一个代码运行期的概念,同时,在编译期又会用到它,它是一个active record,它记录了函数当前运行的信息。我们使用IDE进行调试的时候,用到的call stack,就是通过frame链表得到的。简单来说,每次的函数调用就会在栈上形成一个frame,同时该frame会连接到frame链表中成为当前的frame。一般来说,cpu会有一个专门的寄存器来保存当前fr
2014-03-02 21:54:54 2145 2
原创 JSReceiver及其派生类的内存布局
对象属性的访问,可参看 HeapObject解析,看类的派生关系这些类的内存布局依次如下:在JSFunction类中,有一个shared字段,它指向一个SharedFunctionInfo实例,该类主要是存储JSFunction实例中一些共同的内容
2014-03-02 21:53:17 1492
原创 v8中builtins的初始化
builtins定义于builtins.h,它的实例存在于isolate中,在isolate的init函数中,调用builtins.SetUp函数初始化builtins,builtins内部有一个Object* builtins_[builtin_count],所有的初始化操作,主要就是为了初始化这个对象指针数组,这个数组的每个指针指向的都是一个Code对象,也就是它是一段被编译过的代码。一.
2014-03-02 21:52:06 2118
原创 v8的Heap中RootObject的初始化
Heap类中有一个Object* root_[],这个数组是在Heap::CreateHeapObjects方法中初始化的,root_数组非常重要,其中包含了各种类的Map对象,和其他非常重要的全局对象。对于root_数组的存取,Heap一以贯之的使用了宏定义的方式1.root_数组的索引 enum RootListIndex {#define ROOT_INDEX_DECLARAT
2014-03-02 21:51:15 1334
原创 v8的HeapObject解析
一.HeapObject之内存结构v8使用HeapObject作为js object的基类,其优点是一方面可以加快访问速度,另外还可以通过垃圾回收进行管理,所有从HeapObject派生的类,都是原始的struct结构,它使用四字节作为一个字段,第一个四字节字段是map指针,指向一个map对象,当然这个map对象也是从HeapObject派生的,我们可以从这样的派生类定义中看到其内存结构。以S
2014-03-02 21:49:44 2472 1
原创 v8中Heap的初始化
一.Heap中的sizeHeap实例存在于Isolate中,它的构造函数和ConfigureHeap函数对以下一些重要的size进行了初始化: // Returns the maximum amount of memory reserved for the heap. For // the young generation, we reserve 4 times the amou
2014-03-02 21:48:25 1382
原创 v8的初始化
isolate.cc中定义的struct StaticInitializer { StaticInitializer() { Isolate::EnsureDefaultIsolate(); }} static_initializer;这个变量是一个Global变量,在C++初始化,早于main函数被调用之前就被调用了。Isolate::EnsureDefau
2014-03-02 21:47:34 2702
原创 v8的Handle
Handle是v8中最为基础的类,v8为了保证数据访问的正确性和垃圾回收,设计了Handle类涉及的文件:include/v8.hsrc/handles.hsrc/handles-inl.hsrc/handles.ccsrc/global-handles.hsrc/global-handles.ccsrc/api.hHandle的分类
2014-03-02 21:46:30 3795
原创 v8中的visitor模式
在设计模式中,有一种visitor模式,它给出了一种在编译器构造时使用的经典模式,如下图所示:语法树的节点存在不同的类型,在不同的编译阶段对这些节点的操作是不同的,为了避免操作与数据的耦合,产生了visitor模式,如下图所示:实际上,基于以下的矩形空间考虑,可以理解的更加清楚 AssignmentNodeVariableNodeType
2014-03-02 21:45:03 1308
原创 v8::internal::Parser中的Expression解析
首先需要参考Ecma-262文档中的附录A.3Expression中的产生式,v8中的代码是据此进行语法分析的,它采用的算符优先的语法分析方法,在token.h中给出了各种算符的precedence,关于算符优先算法,wiki中给出如下的伪代码http://en.wikipedia.org/wiki/Operator-precedence_parserparse_expression
2014-03-02 21:44:06 710
原创 v8::StringObject的内存布局
使用该内存布局来查看内存数据,编译器watch中看不到这样的对象特别需要说明的是length字段,它是一个smi对象,注意不是对象指针,而是对象,该类在objects.h中定义,对于32bit系统,它的最低位必须是0,也就是说它的取值需要右移一位。例如,在编译js过程中,使用到了source->length(),其中source是Handle,该函数调用如下:SMI_ACCESSO
2014-03-02 21:43:10 1577
原创 v8::internal::Utf16CharaterStream类
Ecma-262中规定要求使用utf16来分析javascript,如上的一系列类就是把源数据作为一个流输入。基类Utf16CharacterStream提供基本的advance和pushback,seekforward方法,BufferedUtf16CharacterStream类中加入了一个buffer用于缓冲从数据中的读取到的数据GenericStringUtf16Character
2014-03-02 21:41:53 701
原创 v8的Zone内存机制
在编译过程中使用的内存分配机制,不同于javascript运行期的垃圾回收机制,由于在编译过程中,尤其是生成AST(Abstract Syntax Tree)的过程中,要使用大量的小内存,V8使用了Zone类,它通过malloc得到一块内存,然后从中分配小内存给用户,并对这些内存进行管理,用 户不需要释放这些内存,而是统一由Zone类进行释放。Zone本身通过Segment类来管理内存,实际上Zo
2014-03-02 21:40:45 1331
原创 Activity研究报告
Activity与Surface这篇文章主要描述从Activity的创建,直到Surface显示的过程一.Activity的创建1.进程的创建创建Activity的过程,首先要从创建Activity所在的进程说起。在用户请求启动某个应用程序的时候,会调用ActivityManagerService.startProcessLockedActivityManagerService.star
2014-03-02 21:38:51 1077
原创 《深度探索C++对象模型》读书笔记
第一章关于对象C++的模型可以有多种实现方式,例如表驱动,对象模型等,如下是对象模型的实例,其中类的静态变量和静态函数单独放在类之外,包含类的虚函数的函数指针放在一个称为virtual table的虚表中,该虚表中的第一个指针通常指向类的类型信息,用于实现RTTI(runtime type information)第二章 The semantics of Consructors构造函数
2014-03-02 21:28:39 652
原创 SystemServer研究报告
一.SystemServer的启动SystemServer是由Zygote启动的进程,它运行java代码,在该进程中启动其他的Java层服务。SystemServer首先从SystemServer.main开始[java code]1.SystemServer.main----->System.loadLibrary("android_servers");-
2014-03-02 21:26:04 943
原创 Surface研究报告
Surface研究报告这篇文章主要描述从 Surface的创建,即客户数据是如何通过 Surface进行显示的。一.从 Activity的创建说起1.进程的创建创建 Activity的过程,首先要从创建Activity所在的进程说起。在用户请求启动某个应用程序的时候,会调用 ActivityManagerService.startProcessLockedActivityMan
2014-03-02 21:24:06 1114
原创 SurfaceFlinger研究报告
SurfaceFlinger研究报告SurfaceFlinger研究报告 1一.综述与SurfaceFlinger的类结
2014-03-02 21:22:30 1497
原创 Android GDB调试
一.使用GDB调试native代码使用GDB调试native代码基本上需要分为两步走:1.启动gdbserver首先要确保emulator或者真机上存在gdbserver程序其次你需要指定一个端口,该端口即是adb监听的端口,也是emulator上gdbserver监听的端口,实际上adb就是把在这个端口上监听到的数据发送给gdbserver的,即执行如下的命令adb forw
2014-03-02 21:19:31 804
原创 RIL研究报告
一.整体架构综述ril用于实现打电话,发短信等通信业务功能,它主要通过AT命令与硬件模块交互实现功能。 这里一共涉及两个进程,一个是Phone process,一个是ril进程,Phone显然是上层进程,ril是负责与硬件打交道的进程。在ril中有四个线程,rild启动了一个主线程和一个eventLoop线程,主线程一直处于休眠状态,eventLoop线程在接收到Phone进
2014-03-02 21:18:58 836
原创 Binder驱动初探
Binder驱动初探一.Binder驱动涉及的基本数据结构1.binder_buffer对mmap分配的内存进行管理的基本节点struct binder_buffer { struct list_head entry; /* free and allocated entries by addesss */ struct rb_node rb_node
2014-03-02 21:15:22 952
原创 Binder研究报告
Binder作为Android系统进程间通信的机制是各种service能够提供服务的基础,本文从mediaserver入手,试分析Binder机制的实现一.综述Binder机制的功能有二:1.管理手机上的各种服务2.应用程序通过Binder使用service提供的服务为此,在手机启动过程中,需要注册各种服务到ServiceManager。之后,应用程序可以查询服务,并选择和某种
2014-03-02 21:13:55 634
原创 Zygote研究报告
一.Zygote的前世今生1.前世在init.rc中,zygote作为一个service被启动,其配置为:service zygote /system/bin/app_process --zygote /system/bin --zygote --start-system-server其中:app_process命令是frameworks/base/cmds/app_proce
2014-03-02 21:11:36 865
转载 ARM 指令集版本和ARM 版本
摘自:http://blog.sina.com.cn/s/blog_602f87700100kaa3.html常常能看到ARM7,ARM9,ARM11,以及armv6k等不同的表达。且在GCC编译中,常常要用到 -march,-mcpu等。他们分别表达什么涵义呢?Sam自己也不很清楚,只是大概有个模糊的概念。今天就仔细研究一下。 ARM(Advanced RISCMachines)
2013-12-24 10:37:57 1700
转载 【整理】crosstool-ng中的Architecture level,Emit assembly for CPU,Tune for CPU对于TQ2440的S3C2440的ARM920T填写何值
摘自【整理】crosstool-ng中的Architecture level,Emit assembly for CPU,Tune for CPU对于TQ2440的S3C2440的ARM920T填写何值【背景】折腾:【记录】Cygwin下为arm920t配置crosstool-ng期间,需要对于TQ2440的S3C2440的ARM920T,搞清楚Architecture l
2013-12-24 10:34:57 910
原创 Qemu模拟arm cpu运行Linux
Qemu模拟arm cpu运行Linux系统本文介绍使用qemu虚拟arm cpu来运行和调试Linux系统的一般方法一.首先需要构建tool-chain可以使用crosstool-ng构建,从官网下载1.9.3版本,解压后在源代码根目录运行,并假设$CTNG为安装目录./configure --prefix=$CTNGmake;make install在源代码目录的sam
2013-12-23 00:49:57 2262 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人