04 2012 档案
摘要:从上面已经看到movpc,r4语句,就知道把解压后内核的执行地址r4给了pc程序计数器,意味着解压的内核已经把运行控制权交给解压后的内核代码进行运行了。这时内核已经在正确的物理地址上运行,但是它还是未长大的孩子,还有很多东西都没有准备好,比如内存管理、中断管理等等。同时内核还需要再次映射合适的虚拟地址,以便打开MMU访问内核所有的代码和数据。从这里开始正式进入内核运行起点,是从文件kernel/arch/arm/kernel/head.S开始。为什么是从这个文件开始,而不是别的文件开始呢?其实这是从连接文件vmlinux.lds里决定的,它里面指定如下内容:OUTPUT_ARCH(arm)EN
阅读全文
摘要:和ROWNUM一样,ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中。每一个表都有一个ROWID列,一个ROWID值用于唯一确定数据库表中的的一条记录。因此通过ROWID 方式来访问数据也是 Oracle 数据库访问数据的实现方式之一。一般情况下,ROWID方式的访问一定以索引访问或用户指定ROWID作为先决条件,因为所有的索引访问方式最终都会转换为通过ROWID来访问数据记录。(注:index full scan 与index fast full scan除外)由于Oracle ROWID能够直接定位一条记录,因此使用ROWID方式来访问数据,极大提高数据的访问效率。.
阅读全文
摘要:有了文件的格式,就可以按图索骥,也就是根据文件的格式来分析压缩数据了。但文件格式只是一种存储的格式,还需要算法才可以把数据解压出来,下面就来理解gzip的压缩算法。gzip使用deflate的压缩算法来进行压缩数据,这是一种无损的压缩算法,主要组合LZ77和Huffman的压缩算法。LZ77算法是基于这样的思路:当一串字符中,如果后面的字符串已经在前面出现,那么后面的字符串只需要使用前面的位置和长度就表达相同的字符串,从而达到字符串使用最少的空间。现在看一个简单的例子,如下的字符串:AABABBBABAABABBBABBABB在这个串中可以这样表示,第一个块A写作(0,A),第二个块AB,就可
阅读全文
摘要:在函数decompress_kernel里看到调用gunzip函数来解压内核代码,你也许比较好奇,这个gunzip函数里究竟是怎么样把内核代码解压出来的呢?为了深入地理解解压的代码,就得学习gzip文件格式,压缩的原理,才会理解其中的奥秘。现在就先看看gzip的文件格式,如下:2bytes GZIP标志字节:0x1f,0x8b (\037 \213) 1byte 压缩方法:(0..7 reserved, 8 =deflate)1byte 标志位: bit 0 set: 文件可能是ASCII文本文件 bit 1 set: 附加多个gzip文件部...
阅读全文
摘要:从前面那段代码,就可以看到调用decompress_kernel函数来把内核压缩的代码解压出来,那么你也许问传给解压函数decompress_kernel的四个参数是什么呢?由于ARM里编译时就决定这四个参数是使用四个寄存器来传送,分别为r0,r1,r2,r3等四个寄存器。因此,只需要搞清楚这四个寄存器是什么样的内容,就知道传送给函数什么值了。从代码上看到r0的值与r2、r5的值一样,都是指向栈后面64K的位置。r1是指向栈的开始位置。r3是等于r7的值,由于r7里保存着内核的架构ID,因此r3就是CPU的架构ID。这样这四个参数就传送给下面的函数调用:ulgdecompress_kernel
阅读全文
摘要:INDEX FULL SCAN 与 INDEX FAST FULL SCAN两个长相差不多,乃是一母同胞,因此既有其共性,也有其个性。两者来说其共性是不用扫描表而是通过索引就可以直接返回所需要的所有数据。这对提高查询性能而言,无疑是一个难得的数据访问方式之一,因为索引中存储的数据通常是远小于原始表的数据。下面具体来看看两者之间的异同。一、何时INDEX FULL SCAN 或 INDEX FAST FULL SCAN 1、select 与where子句中出现的所有列必须存在索引 2、查询返回的数据行总数占据整个索引10%以上的比率。取决于db_file_multiblock_read_cou.
阅读全文
摘要:经过上面打开MMU代码之后,就进入了另一个主要环节,就是把压缩的内核代码解压出来,变换回原来可执行代码的模样,这样才可以让CPU理解并执行相应的指令。由于加载压缩的内核就占用了一定的内存空间,如果这个压缩的内核比较大,而物理内存比较小,那么解压后的内核就会把未解压部份的内核数据覆盖,否则就可以采用更简单的方法来解压了,直接写入相应的位置就行了。下面这段代码里,r4是解压内核的开始地址,r5是未解压正在执行的内核文件开始位置,r2是未解压正在执行的内核文件堆栈位置偏移64K的位置。当r4大于等于r2时,就是意味着解压后的内核在目前执行文件后面,因此直接写入就可以,不用考虑覆盖的问题,跳到wont
阅读全文
摘要:Oracle SQL语句的运行环境分为多个不同的层次,主要包括实例级别,会话级别,语句级别,其优先级依次递增。即语句级别的执行环境具有最高的优先权,会话级别次之,实例级别最低。反过来,实例级别的环境设置影响全局,而会话级别的则影响当前会话,语句级别的设置当然也就只影响当前语句。由此可知,运行环境中每一个环节的参数都对最终的数据库性能或所执行的SQL语句有直接的影响。因此在对数据库优化或调试SQL时,获得当前SQL语句运行环境显得尤为重要。为此,Oracle提供了三个重要的视图来获取不同级别的参数信息。一、优化器性能视图名字--下面的三个性能视图分别对应到不同的级别
scott@ORCL>
阅读全文
摘要:在NULL值与索引(一)中讲述了null值与索引的一些基本情况。其主要的内容为,基于允许存在null值的索引列,其索引值不会被存储;其次是由于这个特性导致了我们在使用is null时索引失效的情形;最后则是描述的通过为null值列添加not null约束来使得is null走索引。尽管我们可以通过添加not null来解决is null走索引,当现实中的情况是仍然很多列根本是无法确定的,而必须保持其null特性。对于此种情形该如何解决呢?一、通过基于函数的索引来使得is null使用索引-->演示环境
scott@ORCL> select * from v$version wher
阅读全文
摘要:NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的。由于NULL存在着无数的可能,因此NULL值也不等于NULL值,所以与NULL值相关的操作同样都为NULL值。正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。注:本文仅仅讨论的是B树索引上的NULL值,位图索引不在此范围之内。一、null值与索引的关系scott@ORCL> create ta
阅读全文
摘要:看到这样一则故事,讲述的是众人千里迢迢前往千年古刹寻高僧指点迷津的事,更有甚者想向大师学习武功秘籍。下面是其描述。 当众人到达深山的时候,发现大师正从山谷里挑水。他挑得不多,两只木桶里的水都没有装满。按他们的想象,大师应该能够挑很大的桶,而且挑得满满的。 众人不解地问:“大师,这是什么道理?” 大师说:“挑水之道并不在于挑多,而在于挑得够用。一味贪多,适得其反。” 众人越发不解。大师从他们中找了一个人,让他重新从山谷里打了两满桶水。那人挑得非常吃力,摇摇晃晃,没走几步,就跌倒在地,水全都洒了,那人的膝盖也摔破了。 “水洒了,岂不是还得回头重打一桶吗?膝盖破了,走路艰难,岂不是比刚才挑得更少..
阅读全文
摘要:SQL是的全称是Structured Query Language(结构化查询语言)。SQL是一个在80年代中期被使用的工业标准数据库查询语言。不要把SQL语言与商业化产品如Microsoft SQL server或开源产品MySQL相混淆。所有的使用SQL缩略词的这些都是SQL标准的一部分。一、SQL tuning之前的调整 下面这个粗略的方法能够节省数千小时乏味的SQL tuning,因为一旦调整它将影响数以百计的SQL查询。记住,你必须优先调整它,否则后 续的优化器参数改变或统计信息可能不会有助于你的SQL调整。 记住,你应当总是优先考虑系统级别的SQL tuning,否则在SQL t.
阅读全文