<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>破碎细胞的垃圾堆</title>
    <description>喜欢捣鼓好玩的计算机</description>
    <link>http://crackcell.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>iBATIS向PostgreSQL插入inet数据的解决方法</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/231366" style="color:red;">http://crackcell.javaeye.com/blog/231366</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>实体的属性类型是String，如果直接插入的话，postgresql会报错。</p>
<p>我这样解决：</p>
<pre name="code" class="sql">INSERT INTO t_licence(l_key,l_passwd,l_client_ip,l_proposer,l_enabled)
VALUES(#key#,#passwd#,'$clientIp$',#proposer#,#enabled#)</pre>
<p>&nbsp;</p>
<p>在上面那个clientIp的部分，用动态sql的方式插入。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/231366#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 22:48:21 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/231366</link>
        <guid>http://crackcell.javaeye.com/blog/231366</guid>
      </item>
          <item>
        <title>正确导入swt包</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/220173" style="color:red;">http://crackcell.javaeye.com/blog/220173</a>&nbsp;
          发表时间: 2008年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>把</p>
<p>eclipse/plugins/org.eclipse.swt_版本.jar</p>
<p>eclipse/plugins/org.eclipse.swt.gtk.linux.版本.jar</p>
<p>导入到工程的build path就可以了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/220173#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Jul 2008 18:58:04 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/220173</link>
        <guid>http://crackcell.javaeye.com/blog/220173</guid>
      </item>
          <item>
        <title>MySQL存储引擎的选择</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/214046" style="color:red;">http://crackcell.javaeye.com/blog/214046</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>一点拙见</strong>
 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这里，我仅仅说说MyISAM、InnoDB、BDB（BerkeleyDB）这3个比较流行的通用引擎。<br />
通用是相对于Heap和Merge等引擎来讲的。<br />
鉴于Falcon还不稳定，这里暂时不考虑，不过可以预见，它将是下一个亮点。<br />
<br />
首先分析具体需求，业务中是否要用到事务，如果要，选择的范围就比较小了，InnoDB和BDB。就主流来讲，就InnoDB吧。BDB还不怎么流行。一般的选择就是InnoDB了<br />
<br />
然后分析业务是否要面对高并发，3个主流的并发性能从小到达排列是MyISAM&lt;BDB&lt;InnoDB。<br />
MyISAM是表锁定的，也就是说，独占锁一次锁住的是一张表。<br />
DBD是页锁定的，每个页为8KB。<br />
InnoDB是行锁定的。<br />
<br />
InnoDB和Oracle、PostgreSQL等一样使用了一种叫做MVCC（multi-version concurrency control）机制来实现的行锁定，但需要注意的是，锁的粒度越小，带来的额外系统开销也就越大。<br />
<br />
所以并不是并发性越好，性能就越好的。选择存储引擎还是要根据具体的需求来看。<br />
<br />
<br />
然后分析表负载中读写比例，如果是读大量多于写或者写大量多于读，我觉得你可以考虑一下MyISAM。虽然MyISAM是表锁定，但它的读（select）是不需要锁的。对于大多数web应用， MyISAM是最佳选择。<br />
此外，MyISAM能使用索引来加速查询。<br />
<br />
可以说MyISAM就是为读而生的。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/214046#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 20:49:12 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/214046</link>
        <guid>http://crackcell.javaeye.com/blog/214046</guid>
      </item>
          <item>
        <title>ORA-01031: insufficient privileges</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/212488" style="color:red;">http://crackcell.javaeye.com/blog/212488</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ORA-01031: insufficient privileges<br /><br />这个错误一般是创建某个对象 (表、视图、存储过程等)的时候缺乏权限。<br /><br />比如可以这样解决：<br /><pre name="code" class="sql">grant create table to tml;</pre><br />把创建表的权限给用户tml<br /><br />如果你是在试图启动一个实例（startup an instance）的时候出现这个错误，说明你当前登录的用户没有加入操作系统中oracle的dba用户组。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/212488#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 21:09:17 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/212488</link>
        <guid>http://crackcell.javaeye.com/blog/212488</guid>
      </item>
          <item>
        <title>ubuntu8.04上建立裸设备</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/210763" style="color:red;">http://crackcell.javaeye.com/blog/210763</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          直接看操作：<br /><br /><pre name="code" class="java">root@tml-laptop:/dev# mkdir raw
root@tml-laptop:/dev# ln -s /dev/.static/dev/rawctl /dev/rawctl
root@tml-laptop:/dev# ln -s /dev/.static/dev/raw/raw1 /dev/raw/raw1
root@tml-laptop:/dev# modprobe raw
</pre><br />最后一个modprobe很重要，不然前面的修改不会生效。<br /><br /><br />绑定一个设备到raw1：<br /><br /><pre name="code" class="java">root@tml-laptop:/dev# raw /dev/raw/raw1 /dev/sda8
/dev/raw/raw1:	bound to major 8, minor 8
</pre><br /><br />再用raw -qa看看状态：<br /><br /><pre name="code" class="java">root@tml-laptop:/dev# raw -qa
/dev/raw/raw1:	bound to major 8, minor 8
</pre><br /> ok，有了。<br /><br /><br />将上面的命令加到/etc/rc.local里面去，就可以在开机的时候自动设置了。<br /><br />下面是我的rc.local中的相关部分：<br /><br /><pre name="code" class="java">#Setup raw device
mkdir /dev/raw
ln -s /dev/.static/dev/rawctl /dev/rawctl
ln -s /dev/.static/dev/raw/raw1 /dev/raw/raw1
ln -s /dev/.static/dev/raw/raw2 /dev/raw/raw2
modprobe raw
raw /dev/raw/raw1 /dev/sda8
raw /dev/raw/raw2 /dev/sda9
#Setup raw device</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/210763#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 20:10:59 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/210763</link>
        <guid>http://crackcell.javaeye.com/blog/210763</guid>
      </item>
          <item>
        <title>编译安装MySQL</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/209759" style="color:red;">http://crackcell.javaeye.com/blog/209759</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>configure参数：</p>
<pre name="code" class="java">CFLAGS=&quot;-O3 -mpentiumpro&quot; CXX=gcc CXXFLAGS=&quot;-O3 -mpentiumpro \
-felide-constructors -fno-exceptions -fno-rtti&quot; ./configure \
--prefix=/opt/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static</pre>
<p>如果configure时候出现错误No curses/termcap library found</p>
<p>则：</p>
<pre name="code" class="java">apt-get install libncurses5-dev</pre>
<p>然后make并用管理员身份make install</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/209759#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 14:34:47 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/209759</link>
        <guid>http://crackcell.javaeye.com/blog/209759</guid>
      </item>
          <item>
        <title>jdeveloper:can't recognize the JDK version错误</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/208066" style="color:red;">http://crackcell.javaeye.com/blog/208066</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1.修改jdev脚本文件</strong>
<br />
找到并删除一下内容：</p>
<pre name="code" class="c">if [ `expr &quot;$s&quot; : 'java version \&quot;1\.[0-5].*\&quot;'` -le 0 ]
then
echo &quot;Error: JDeveloper can't recognize the JDK version&quot;                
fi
</pre>
&nbsp;
<p><strong>2.修改jdev.conf</strong>
</p>
<p>找到并删除一下内容：</p>
<pre name="code" class="java">SetJavaVM hotspot</pre>
&nbsp;
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/208066#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 00:48:46 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/208066</link>
        <guid>http://crackcell.javaeye.com/blog/208066</guid>
      </item>
          <item>
        <title>Oracle读书笔记(1)-存储层次</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/208010" style="color:red;">http://crackcell.javaeye.com/blog/208010</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.数据库由一个或多个表空间组成</p>
<p>2.表空间由一个或多个数据库文件组成，表空间中包含段</p>
<p>3.段（表、索引等）由一个或多个盘区组成。段存在于表空间中，但是表空间中可以有许多数据文件中的数据</p>
<p>4.块是数据库中最小的分配单位，最小的I/O单位</p>
<p>&nbsp;</p>
<p><strong>表空间</strong>
</p>
<p>用户使用的最大逻辑存储结构</p>
<p>用户可以使用一个默认表空间和一个临时表空间</p>
<p>建表时若无指定表空间，则使用默认表空间存储表</p>
<p>建立表空间的命令：</p>
<pre name="code" class="sql">CREATE TABLESPACE 表空间名 DATAFILE '数据文件（*.dbf）的绝对路径' SIZE 大小（如，100M）</pre>
&nbsp;
<p><strong>段</strong>
</p>
<p>段是用户建立的数据库对象的存储表示</p>
<p>用户建立的每个表都会有一个在表空间中存储的逻辑段</p>
<p>段有3个种类型：数据段、临时段 和 回滚段（也称为&ldquo;撤销段&rdquo;）</p>
<p>&nbsp;</p>
<p>数据段：存放表示、索引、簇、表分区等常规应用数据</p>
<p>临时段：存放临时表、引起内存页交换的SQL语句等</p>
<p>回滚段：用于管理undo数据。</p>
<p>&nbsp;</p>
<p>在表空间mytp1里面建立回滚段：</p>
<pre name="code" class="sql">CREATE ROLLBACK SEGMENT tbs_rs01 TABLESPACE mytp1
STORAGE(INITIAL 100K NEXT 100K MINEXTENTS 10 OPTIMAL 1000K)</pre>
<p>&nbsp;</p>
<p><strong>数据块</strong>
<br />
<br />
包括 <em>数据标题块、表目录、行目录、自由空间 </em>
和<em> 行数据</em>
<br />
<br />
<em>数据标题块</em>
：存储数据类型（段类型）和块物理位置等信息<br />
<em>表目录</em>
：在一个数据块中可以存储多个表中的数据。表目录告诉Oracke在数据块中存储了哪些表。<br />
<em>行目录</em>
：告诉Oralce数据库中各行的物理位置<br />
<em>自由空间</em>
：当第一次分配数据块时，该数据块只有自由空间，没有行数据。随着行被插入，自由空间就会变得越来越小，直到数据块被完全充满为止。<br />
<em>行数据</em>
：这事数据块中实际存储数据行的地方。<br />
<br />
<strong>重做日志文件</strong>
<br />
<br />
数据库的事物日志，仅用于恢复数据库<br />
如果 关掉电源造成的实例失败， Oracle使用联机重做日志<br />
如果 包含数据文件的磁盘发生永久性故障，使用归档的重做日志<br />
如果 意外地丢失了一个表，或删除了一些关键信息，并且已提交了这些操作，可以通过联机重做日志和归档重做日志来恢复备份<br />
<br />
每个数据库实例至少有2个重做日志文件组，每一个重做日志文件组，每个组都有一个单独的成员。<br />
一般建议为每个实例创建至少4个重做日志文件组，每个组至少2个成员。将每个组成员物理地分开，确保每个组成员存储在不同的文件系统、不同的磁盘和不同的控制器等设备上<br />
Oracle采用轮询方式写重做日志文件<br />
每个日志组都会有一个唯一的序列号<br />
<br />
当日志写满后，关闭日志文件，然后寻找另一个可用的日志文件，并对旧文件完成下面2项工作：<br />
1、如果数据库处于archivelog模式，则通知ARCn进程将重做日志移动到所有已经定义并可使用的归档重做日志文件的位置<br />
2、如果处于noarchivelog模式，则在重新使用重做日志前，DBWR进程需要将所有的数据改变写到数据文件中。该操作也需要在archivelog模式下进行。如果不在archivelog模式下，则直到DBWR进程处于归档模式之后，数据库才可以继续运行<br />
<br />
使用alter database命令重做日志组的实例：</p>
<pre name="code" class="sql">ALTER DATABASE ADD LOGFILE GROUP 日志组序号
('路径***_1.log',
'路径***_2.log',
'路径***_3.log') SIZE 100m;</pre>
&nbsp;
<p><br />
<br />
删除日志组：<br />
ALTER DATABASE DROP LOGFILE GROUP 日志组号;<br />
但不允许对正在使用的日志组使用删除命令，之前需要强制切换日志组：<br />
ALTER DATABASE SWITCH LOGFILE;<br />
<br />
日志组相关视图：<br />
v$logfile 重做日志文件状态<br />
v$log 重做日志文件组的信息<br />
v$log_history 重做日志的历史信息</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/208010#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 21:00:31 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/208010</link>
        <guid>http://crackcell.javaeye.com/blog/208010</guid>
      </item>
          <item>
        <title>Oracle表空间</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/207700" style="color:red;">http://crackcell.javaeye.com/blog/207700</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>基本概念</strong>
<br />
ORACLE数据库被划分成称作为表空间的逻辑区域&mdash;&mdash;形成ORACLE数据库的逻辑结构。一<br />
个ORACLE数据库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的数据库<br />
文件。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引<br />
、聚簇、回退段和临时段等。<br />
每个ORACLE数据库均有SYSTEM表空间,这是数据库创建时自动创建的。SYSTEM表空间<br />
必须总要保持联机,因为其包含着数据库运行所要求的基本信息(关于整个数据库的数据字<br />
典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE<br />
软件产品要求的表)。<br />
一个小型应用的ORACLE数据库通常仅包括SYSTEM表空间,然而一个稍大型应用的ORACL<br />
E数据库采用多个表空间会对数据库的使用带来更大的方便。<br />
作用<br />
表空间的作用能帮助DBA用户完成以下工作:<br />
1.决定数据库实体的空间分配;<br />
2.设置数据库用户的空间份额;<br />
3.控制数据库部分数据的可用性;<br />
4.分布数据于不同的设备之间以改善性能;<br />
5.备份和恢复数据。<br />
用户创建其数据库实体时其必须于给定的表空间中具有相应的权力,所以对一个用户来<br />
说,其要操纵一个ORACLE数据库中的数据,应该:<br />
1.被授予关于一个或多个表空间中的RESOURCE特权;<br />
2.被指定缺省表空间;<br />
3.被分配指定表空间的存储空间使用份额;<br />
4.被指定缺省临时段表空间。<br />
维护<br />
表空间的维护是由ORACLE数据库系统管理员DBA通过SQL*PLUS语句实现的,其中表空间<br />
创建与修改中的文件名是不能带路径的,因此DBA必须在ORACLE/DBS目录中操作。<br />
1.新表空间的创建<br />
语法格式:CREATE TABLESPACE 表空间名<br />
DATAFILE 文件标识符[,文件标识符]...<br />
[DEFAULT STORAGE(存储配置参数)]<br />
[ONLINE\OFFLINE];<br />
其中:文件标识符=&rsquo;文件名&rsquo;[SIZE整数[K\M][REUSE]<br />
2.修改表空间配置<br />
语法格式:ALTER TABLESPCE 表空间名<br />
(ADD DATAFILE 文件标识符[,文件标识符]...<br />
\RENAME DATAFILE &rsquo;文件名&rsquo;[,&rsquo;文件名&rsquo;]...<br />
TO &rsquo;文件名&rsquo;[,&rsquo;文件名&rsquo;]...<br />
\DEFAULT STORAGE(存储配置参数)<br />
\ONLINE\OFFLINE[NORMAL\IMMEDIATE]<br />
\(BEGIN\END)BACKUP);<br />
3.取消表空间<br />
语法格式:DROP TABLESPACE表空间名[INCLUDING CONTENTS];<br />
4.检查表空间使用情况<br />
(1)检查当前用户空间分配情况<br />
SELECT tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)<br />
FROM user_segments<br />
GROUP BY tablespace_name<br />
(2)a.检查各用户空间分配情况<br />
SELECT owner,tablespace_;<br />
(2)b.检查各用户空间分配情况<br />
SELECT owner,tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)<br />
FROM dba_segments<br />
GROUP BY owner,tablespace_name;<br />
(3) 检查当前用户数据库实体空间使用情况<br />
SELECT tablespace_name,segment_name,segment_type,<br />
COUNT(extent_id),SUM(blocks),SUM(bytes)<br />
FROM user_extents<br />
GROUP BY tablespace_name,segment_name,segment_type;<br />
(4)检查各用户空间使用情况<br />
SELECT owner,tablespace_name,COUNT(extent_id),SUM(blocks),<br />
SUM(bytes) FROM user_extents<br />
GROUP BY owner,tablespace_name;<br />
(5)检查数据库空间使用情况<br />
SELECT tablespace_name,COUNT(extent_id),SUM(blocks),SUM(bytes)<br />
FROM user_extents<br />
GROUP BY tablespace_name;<br />
(6)检查当前用户自由空间情况<br />
SELECT tablespace_name,COUNT(block_id),SUM(blocks),SUM(bytes)<br />
FROM user_free_space<br />
GROUP BY tablespace_name;<br />
(7)检查数据库自由空间情况<br />
SELECT tablespace_name,COUNT(block_id),SUM(blocks),SUM(bytes)<br />
FROM dba_free_space<br />
GROUP BY tablespace_name;<br />
四、结论<br />
表空间是ORACLE数据库系统维护的主要对象,通过本文能详细了解它的基本概念与作用<br />
,并掌握其日常维护知识,从而保证ORACLE数据库系统的正常运行。<br />
<br />
原文出处：<a href="http://canni3268.blog.163.com/blog/static/30692206200821322027260/">http://canni3268.blog.163.com/blog/static/30692206200821322027260/</a>
</p>
<p>建立表空间</p>
<p>CREATE TABLESPACE data01<br />
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M<br />
UNIFORM SIZE 128k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #指定区尺寸为128k,如不指定，区尺寸默认为64k</p>
<p>删除表空间</p>
<p>DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;</p>
<p><br />
一、建立表空间</p>
<p>CREATE TABLESPACE data01<br />
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M<br />
UNIFORM SIZE 128k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #指定区尺寸为128k,如不指定，区尺寸默认为64k</p>
<p>二、建立UNDO表空间</p>
<p>CREATE UNDO TABLESPACE UNDOTBS02<br />
DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M</p>
<p>#注意：在OPEN状态下某些时刻只能用一个UNDO表空间，如果要用新建的表空间，必须切换到该表空间:</p>
<p>ALTER SYSTEM SET undo_tablespace=UNDOTBS02;</p>
<p>三、建立临时表空间</p>
<p>CREATE TEMPORARY TABLESPACE temp_data<br />
TEMPFILE '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 50M</p>
<p>四、改变表空间状态</p>
<p>1.使表空间脱机</p>
<p>ALTER TABLESPACE game OFFLINE;</p>
<p>如果是意外删除了数据文件，则必须带有RECOVER选项</p>
<p>ALTER TABLESPACE game OFFLINE FOR RECOVER;</p>
<p>2.使表空间联机</p>
<p>ALTER TABLESPACE game ONLINE;</p>
<p><br />
3.使数据文件脱机</p>
<p>ALTER DATABASE DATAFILE 3 OFFLINE;</p>
<p>4.使数据文件联机</p>
<p>ALTER DATABASE DATAFILE 3 ONLINE;</p>
<p>5.使表空间只读</p>
<p>ALTER TABLESPACE game READ ONLY;</p>
<p>6.使表空间可读写</p>
<p>ALTER TABLESPACE game READ WRITE;</p>
<p>五、删除表空间</p>
<p>DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;</p>
<p>六、扩展表空间</p>
<p>首先查看表空间的名字和所属文件</p>
<p>select tablespace_name, file_id, file_name,<br />
round(bytes/(1024*1024),0) total_space<br />
from dba_data_files<br />
order by tablespace_name;</p>
<p>1.增加数据文件<br />
&nbsp;&nbsp;  ALTER TABLESPACE game<br />
&nbsp;&nbsp;  ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;</p>
<p>2.手动增加数据文件尺寸<br />
&nbsp;&nbsp;  ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'<br />
&nbsp;&nbsp;  RESIZE 4000M;</p>
<p>3.设定数据文件自动扩展<br />
&nbsp;&nbsp;  ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf<br />
&nbsp;&nbsp;  AUTOEXTEND ON NEXT 100M<br />
&nbsp;&nbsp;  MAXSIZE 10000M;</p>
<p>设定后查看表空间信息</p>
<p>
&nbsp;&nbsp;  SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,<br />
&nbsp;&nbsp;  (B.BYTES*100)/A.BYTES &quot;% USED&quot;,(C.BYTES*100)/A.BYTES &quot;% FREE&quot;<br />
&nbsp;&nbsp;  FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C<br />
&nbsp;&nbsp;  WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME; </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/207700#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 01:06:32 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/207700</link>
        <guid>http://crackcell.javaeye.com/blog/207700</guid>
      </item>
          <item>
        <title>Oracle各种启动程序方式详细介绍</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/207195" style="color:red;">http://crackcell.javaeye.com/blog/207195</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1、startup nomount</strong>
<br />
<br />
非安装启动，这种方式启动下可执行：重建控制文件、重建数据库读取init.ora文件，启动instance，即启动SGA和后台进程，这种启动只需要init.ora文件。<br />
<br />
<strong>2、startup mount dbname</strong>
<br />
<br />
安装启动，这种方式启动下可执行：<br />
<br />
数据库日志归档、<br />
<br />
数据库介质恢复、<br />
<br />
使数据文件联机或脱机，<br />
<br />
重新定位数据文件、重做日志文件。<br />
<br />
执行&ldquo;nomount&rdquo;，然后打开控制文件，确认数据文件和联机日志文件的位置，但此时不对数据文件和日志文件进行校验检查。<br />
<br />
<strong>
3、startup open dbname</strong>
<br />
<br />
先执行&ldquo;nomount&rdquo;，然后执行&ldquo;mount&rdquo;，再打开包括Redo log文件在内的所有数据库文件，这种方式下可访问数据库中的数据。<br />
<br />
<strong>
4、startup，等于以下三个命令</strong>
<br />
<br />
startup nomount<br />
<br />
alter database mount<br />
<br />
alter database open<br />
<br />
<strong>
5、startup restrict</strong>
<br />
<br />
约束方式启动<br />
<br />
这种方式能够启动数据库，但只允许具有一定特权的用户访问<br />
<br />
非特权用户访问时，会出现以下提示：<br />
<br />
ERROR：<br />
<br />
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用<br />
<strong><br />
6、startup force</strong>
<br />
<br />
强制启动方式,当不能关闭数据库时，可以用startup force来完成数据库的关闭,先关闭数据库，再执行正常启动数据库命令<br />
<br />
<strong>
7、startup pfile=参数文件名</strong>
<br />
<br />
带初始化参数文件的启动方式<br />
<br />
先读取参数文件，再按参数文件中的设置启动数据库<br />
<br />
例：startup pfile=E:\Oracle\admin\oradb\pfile\init.ora<br />
<strong><br />
8、startup EXCLUSIVE</strong>
</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/207195#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 18:27:46 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/207195</link>
        <guid>http://crackcell.javaeye.com/blog/207195</guid>
      </item>
          <item>
        <title>Ubuntu启动项编辑器</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/206778" style="color:red;">http://crackcell.javaeye.com/blog/206778</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          sudo apt-get install sysv-rc-conf<br />sudo sysv-rc-conf
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/206778#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 23:54:36 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/206778</link>
        <guid>http://crackcell.javaeye.com/blog/206778</guid>
      </item>
          <item>
        <title>关闭vmware6.5的debug模式</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/206178" style="color:red;">http://crackcell.javaeye.com/blog/206178</a>&nbsp;
          发表时间: 2008年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          vm6.5 默认是debug运行的，很慢。<br /><br />这样解决：<br /><br />在ubuntu里面这样做：<br /><br />cd /usr/lib/vmware/bin<br />sudo cp vmware-vmx-debug vmware-vmx-debug-old<br />sudo cp -a vmware-vmx vmware-vmx-debug
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/206178#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Jun 2008 13:09:10 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/206178</link>
        <guid>http://crackcell.javaeye.com/blog/206178</guid>
      </item>
          <item>
        <title>保护模式学习笔记(3) - 系统地址寄存器</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/204625" style="color:red;">http://crackcell.javaeye.com/blog/204625</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新一篇: Erlang学习笔记(1) - 入门<br />3.1概述<br /><br />GDT、LDT、IDT非常重要，为了快速丁伟这些段，处理器采用一些特殊的寄存器来保存这些段的基址和界线。我们把这些寄存器称为系统地址寄存器。<br /><br />3.2全局描述符表寄存器GDTR<br /><br />GDTR长48位，高32位存段基址，低16位存段界线。段界线的单位为字节。<br /><br /><br />3.3局部描述符表寄存器LDTR<br /><br /><br />3.4中断描述符表寄存器IDTR<br /><br />IDTR长48位，高32位存段基址，低16位存段界线。由于80386只支持256个中断/异常，所以IDT表的最大长度是2K，以字节位单位的段界线为7FFH。IDTR表示IDT表的方式与GDTR表示GDT表的方式相同。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/204625#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 11:24:59 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/204625</link>
        <guid>http://crackcell.javaeye.com/blog/204625</guid>
      </item>
          <item>
        <title>保护模式学习笔记(2) - 控制寄存器</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/204624" style="color:red;">http://crackcell.javaeye.com/blog/204624</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          2.1概述<br /><br />80386有4个控制寄存器，分别是CR0,CR1,CR2,CR3。CR1被保留，供以后的处理器使用，在80386中,不能使用CR1。CR0包含指示处理器工作方式的控制位，包括启用和禁用分页的控制位，控制浮点协处理器操作的控制位。CR2和CR3由分页机制使用。 CR0中的5到30位以及CR3中的0到11位是保留位，这些位的值必须是0。<br /><br /><br />2.2保护控制位<br /><br />CR0的位0用 PE标示，位31用PG标示，这2个位控制分段和分页，所以它们称为保护控制位。PE控制分段管理机制，PE=0，处理器运行于实模式;PE=1，处理器运行与保护模式。PG控制分页机制。PG=0，禁用分页管理机制，此时线性地址直接作为物理地址使用;PG=1，启用分页管理机制，此时线性地址经过分页管理机制转换成物理地址。<br />下面列出了PE和PG的组合方式所对应的工作方式：<br />PG 	PE 	处理器工作方式<br />0 	0 	实模式<br />0 	1 	保护模式，禁用分页<br />1 	0 	非法组合<br />1 	1 	保护模式，启用分页<br /><br /><br />2.3协处理器控制位<br /><br />CR0中的位1~4分别标记位MP（算术存在位）、EM（模拟位）、TS（任务切换位）和ET（扩展类型位），它们控制浮点协处理器的操作。<br /><br />以下操作有硬件自动执行：<br />如果系统中有80387协处理器，那么ET被置为1;如果系统中有80287协处理器或不存在协处理器，那么ET被置为0。<br />EM位控制浮点指令的执行是用软件模拟，还是硬件执行。EM=0时，硬件控制浮点指令传送到协处理器;EM=1时，浮点指令由软件模拟。<br />TS位用于加快任务切换。当进行任务切换时，处理器把TS置为1。TS=1时，浮点指令将产生设备不可使用（DNA）异常。MP位控制WAIT指令在TS=1时，是否产生DNA异常。MP=1和TS=1时，WAIT产生异常;MP=0时，WAIT指令忽略TS条件。<br /><br />2.4CR2和CR3<br />CR2和CR3是用于分页管理机制的。<br /><br />在发生分页异常时，处理器将引发异常的线性地址存于CR2中。操作系统可中的异常处理程序可以检查CR2的内容，从而查出线性地址中的哪一页引起本次异常。<br /><br />CR3用于保存页目录表的其实物理地址。由于目录是页对齐的，所以仅高20位有效，低12位被保留未用。向CR3中装入新值时，低12位必须是0;但从CR3中取值时，低12位被忽略。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/204624#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 11:24:29 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/204624</link>
        <guid>http://crackcell.javaeye.com/blog/204624</guid>
      </item>
          <item>
        <title>保护模式学习笔记(1) - 分段</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/204623" style="color:red;">http://crackcell.javaeye.com/blog/204623</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          保护模式一直没搞得太清楚，这次运气好借到了杨季文的《80X86汇编语言程序设计教程》，颇有收获。<br /><br />1.分段管理<br /><br />1.1<br />分段机制实现了逻辑地址向线性地址的转换。<br />每个段有三个参数：段基址（Base Addr）、段界线（Limit）、段属性（Attib）<br /><br />1.1段基址<br />段基址表示段开始的地址，有32位。它可以从32位地址线中的任何一位开始。<br /><br />1.2段界线<br />段界线表示段的长度，有20位。单位可以是字节或4K，具体是多少由段属性中的一位定义。我们称之为“粒度”，用G表示。G=0表示以字节为单位，G=1表示以4K为单位。G=0时，20位的表示范围为1字节到1M;G=1时，范围为4K到4G。<br />但对于4K的情况，需要特别注意，这时候的实际段界线计算公式为：<br />LIMIT=Limit*4K+0FFFH=(Limit&lt;&lt;12)+0FFFH<br /><br />改变段界线可以扩展段的大小。对于普通段，增长方向是由低位到高位，而堆栈段则正好相反。段属性里面有一位被称作ED位，就是用来控制增长方向的。ED=0表示向高增长，ED=1表示向低增长。<br /><br />1.3段属性<br />表示此段的属性，这里简单记下：<br />P 	存在位 (1 = Yes)<br />DPL 	特权级 - Ring 0 - 3<br />DT 	描述符类型<br />Type 	段类型 - 代码段 / 数据段<br />G 	粒度 (0 = 1 字节, 1 = 4K字节)<br />D 	操作数尺寸 (0 = 16bit, 1 = 32bit)<br />0 	始终为零<br />AVL 	软件可用 (始终为零)<br /><br />1.4全局描述表（GDT）和局部描述表（LDT）<br /><br />若干个描述符组合在一起形成描述表。操作系统在全局范围内准备了一个全局描述表，用来方便所有程序共享数据。每个程序可以有一个自己的局部描述表，用来存放私有的数据。<br /><br />1.5段选择子<br /><br />在实模式下存储单元的地址为 段：段内偏移，保护模式下，段选择子代替了段。<br />选择子为16位。高15到3位表示描述符索引INDEX，所以一个程序最多可以有2^12（8096）个描述符。次低1位为TI，TI=0表示全局描述符，TI=1表示局部描述符。最低的2位表示RPL，即，请求权限级，Request Privilege Level。用来和段的权限级CPL相匹配。<br /><br />要特别注意的是，第一个选择子为空选择子（NULL），它的INDEX=0,TI=0,RPL可以为任意值。但当TI=0时，INDEX为0的选择子不是空的，而是指向LDT的0项。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/204623#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 11:23:51 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/204623</link>
        <guid>http://crackcell.javaeye.com/blog/204623</guid>
      </item>
          <item>
        <title>我编译带gVim的vim的参数</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203456" style="color:red;">http://crackcell.javaeye.com/blog/203456</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">./configure --with-x --enable-cscope --enable-xim --enable-fontset --enable-multibyte </pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203456#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 11:56:36 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203456</link>
        <guid>http://crackcell.javaeye.com/blog/203456</guid>
      </item>
          <item>
        <title>解决RHEL5的Firefox的libstdc++.so.5问题</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203452" style="color:red;">http://crackcell.javaeye.com/blog/203452</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          把光盘中的compat-libstdc++-33-3.2.3-61.i386.rpm这个包装上去就可以了。<br />我的是64位的系统，可是还是得装这个32位的包，装那个64的都不行，估计是Firefox是32的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203452#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 11:45:17 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203452</link>
        <guid>http://crackcell.javaeye.com/blog/203452</guid>
      </item>
          <item>
        <title>解决RHEL5/CentOS5安装Nvidia驱动后缩放窗口出现黑框的问题</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203451" style="color:red;">http://crackcell.javaeye.com/blog/203451</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          修改/etc/X11/xorg.conf<br /><br />找到<br /><pre name="code" class="java">Section "Module"</pre><br /><br />将<br /><pre name="code" class="java">Section "Module"
    Load           "glx"
EndSection</pre><br />改成<br /><pre name="code" class="java">Section "Module"
    Load           "glx"
    Load           "extmod"
EndSection</pre><br />就OK了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203451#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 11:44:12 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203451</link>
        <guid>http://crackcell.javaeye.com/blog/203451</guid>
      </item>
          <item>
        <title>ubuntu下用Fcitx更换scim</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203450" style="color:red;">http://crackcell.javaeye.com/blog/203450</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu7.10 下的scim总是有点问题，比如不能重命名等。<br />换成fcitx后就好多了。<br /><br />按照网上的方法做，很多是不可行的。<br /><br />我这样做的<br />1.<br />sudo apt-get install im-switch fcitx<br /><br />2.<br />im-switch -c<br />选择fcitx所在的编号<br /><br />3.<br />sudo gedit /usr/lib/gtk-2.0/2.10.0/immodule-files.d/scim-gtk2-immodule.immodules<br />将<br /># automatically generated by dh_gtkmodules, do not edit<br />“/usr/lib/gtk-2.0/2.10.0/immodules/im-scim.so”<br />“scim” “SCIM Input Method” “scim” “/usr/share/locale” “ja:ko:zh”<br /><br />中的ja:ko:zh改为ja:ko就可以了，这样可以防止scim在中文环境中启动，占着茅坑不拉屎，fcitx起来了也用不了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203450#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 11:42:55 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203450</link>
        <guid>http://crackcell.javaeye.com/blog/203450</guid>
      </item>
          <item>
        <title>ubuntu下Xfce4启动卡住的问题</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203447" style="color:red;">http://crackcell.javaeye.com/blog/203447</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          /usr/share/xsession中有个启动文件,好像叫xfce**.desktop,里面有一行是exec /usr/bin/startxfce4程序,把这里的startxfce4改为xfce4-session就可以了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203447#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 11:41:27 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203447</link>
        <guid>http://crackcell.javaeye.com/blog/203447</guid>
      </item>
          <item>
        <title>Erlang学习笔记(1) - 入门</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203353" style="color:red;">http://crackcell.javaeye.com/blog/203353</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.1变量</strong><br /><br />Erlang的变量只能赋值一次，不能改变。<br />“=”号在Erlang中实际上是个类型匹配操作符（Pattern matching operator）。它在给一个未绑定值的变量绑定值的时候表现就像一个赋值符号。“=”先计算右边的表达式的类型，然后和左边的表达式匹配。<br />在下面的情况里：<br /><pre name="code" class="java">X=123.</pre><br />X未绑定值。此时Erlang就这样认为，左边的X没有值，怎样能使这个表达式为真呢？只有把123绑定给X。<br /><strong><br />1.2浮点数</strong><br /><br />“/”始终返回一个浮点数。<br />eg. <pre name="code" class="java">5/3=1.66667</pre><br /><br />“div”为整除，返回整型<br />eg. <pre name="code" class="java">5 div 3=1</pre><br /><br />“rem”为取余，返回整型<br />eg. <pre name="code" class="java">5 rem 3=2</pre><br /><strong><br />1.3原子型（Atom）</strong><br /><br />原子型用来表示非数值常量。类似于java、c里面的枚举型。<br />在Erlang中，原子型为全局有效的。<br /><br /><strong>1.4元组（Tuple）</strong><br /><br /><strong>1.4.1元组和c中的结构体相似。</strong><br />eg. <pre name="code" class="java">P={12,13}.</pre><br /><br /><strong>1.4.2元组的定义嵌套。</strong><br />eg.<br /><pre name="code" class="java">Person={person,
    {name,joe},
    {age,19},
    {eyecolor,brown}}.</pre><br /><br /><strong>1.4.3将元素从元组中取出来。</strong><br /><br />eg. <pre name="code" class="java">P={12,13}.
{X,Y}=P.</pre><br />则X和Y分别与12和13绑定了。<br /><br />若元组很复杂，而只想取一个元素，则可使用模式<br />eg<br /><pre name="code" class="java">TML = {{name,tml},{age,20},hehe}.
{{_,NAME},_,_}=TML.</pre><br />这样NAME就和tml绑定了，“_”类似于通配符。<br /><br /><strong>1.5列表（List）</strong><br /><br />eg.<br /><pre name="code" class="java">ThingsToBuy = [{apples,10},{pears,6},{milk,3}</pre>].<br /><br /><strong>1.5.1将元素从列表中取出来</strong><br /><br />eg.<br /><pre name="code" class="java">ThingsToBuy = [{apples,10},{pears,6},{milk,3}].
[Buy1|ThingsToBuy1] = ThingsToBuy.</pre><br /><br />这样，Buy1就和{apples,10}绑定了。ThingsToBuy1就和[{pears,6},{milk,3}]绑定了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203353#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 01:21:44 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203353</link>
        <guid>http://crackcell.javaeye.com/blog/203353</guid>
      </item>
          <item>
        <title>RabbitOS代码注释(2) - 代码结构</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/203033" style="color:red;">http://crackcell.javaeye.com/blog/203033</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这篇文章中，我简单介绍一下RabbitOS的源代码结构。<br /><br />根目录<br />|--boot&nbsp; 启动部分代码<br />|--include 系统头文件<br />|--|<br />|--|--asm 和机器相关的汇编代码<br />|--|--boot 启动部分的头文件<br />|--|--init&nbsp; 内核加载器的头文件<br />|--|--rabbit 内核头文件<br />|--|--sys&nbsp; 平台相关的头文件<br />|--init&nbsp; 内核加载器<br />|--kernel 内核<br />|--fs&nbsp; 文件系统<br />|--mm 内存管理<br />|--(...继续扩充中...)<br /><br /><br />未完。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/203033#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 16:38:30 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/203033</link>
        <guid>http://crackcell.javaeye.com/blog/203033</guid>
      </item>
          <item>
        <title>RabbitOS代码注释(3) - /boot/boot.s</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/202642" style="color:red;">http://crackcell.javaeye.com/blog/202642</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>路径：/boot/boot.s</strong><br /><br />由于RabbitOS没有自己的引导器，而是采用grub作为bootloader，所以boot.s就首先要符合multiboot规范（<a href="http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Boot-information-format" target="_blank">http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Boot-information-format</a>）<br /><br />所以在代码的开头就有这样的代码：<br /><br />先定义启动头的symbol：<br /><pre name="code" class="java">
MBOOT_PAGE_ALIGN    equ 1&lt;&lt;0
MBOOT_MEM_INFO      equ 1&lt;&lt;1
MBOOT_HEADER_MAGIC  equ 0x1BADB002
MBOOT_HEADER_FLAGS  equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO
MBOOT_CHECKSUM      equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)</pre><br /><br />紧接着：<br /><pre name="code" class="java">
[GLOBAL mboot];导出mboot，以便能在后面的C代码里面使用
[EXTERN code];text段开始
[EXTERN bss];bss段开始
[EXTERN end]

;一下为多启动头的信息定义和elf文件的格式定义
mboot:
    dd  MBOOT_HEADER_MAGIC
    dd  MBOOT_HEADER_FLAGS
    dd  MBOOT_CHECKSUM
    dd  mboot
    dd  code
    dd  bss
    dd  end
    dd  start
</pre><br /><br />一下是boot.s的主要部分：<br /><pre name="code" class="java">
[GLOBAL start];系统入口
[EXTERN main];导入C部分的main函数（位于/init/main.c）以便能调用。
start:
    ;载入多引导信息
    push    ebx

    ;启动C部分的main函数
    cli       ;关中断
    call main ;调用C部分的main函数
    jmp $    ;死循环
</pre><br /><br />这样，boot.s就搞定了，其实功能很简单，就是让 grub能识别自己，然后将控制权交给C写的main()函数。<br /><br />下一篇文章我就开始分析/init/下的文件了，呵呵。
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/202642#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 21:50:33 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/202642</link>
        <guid>http://crackcell.javaeye.com/blog/202642</guid>
      </item>
          <item>
        <title>《C陷阱与缺陷》读书笔记(1)</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/202331" style="color:red;">http://crackcell.javaeye.com/blog/202331</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1、整型常量前为0表示八进制</strong><br /><br /><strong>2、单引号括起来的是一个整型值，有32位的存储空间，故'ABC'不会被编译器认为是错误。</strong><br /><br /><strong>3、理解(*(void (*)() )0)(</strong>)<br /><br /><pre name="code" class="c">float a
</pre><br />a为一个浮点数float ((a))<br />((a))为一个浮点数，可知，a也为浮点数<br /><br /><pre name="code" class="c">float a()</pre><br />a()为一个浮点数，则a为一个返回浮点数的函数<br /><br /><pre name="code" class="c">float *a</pre><br />*a为一个浮点数，则a为一个指向浮点数的指针<br /><br /><pre name="code" class="c">float *a()</pre><br />*a()为一个浮点数，由于()优先级高于*，则实际为*(a())。<br />a()为一个指向浮点数的指针，<br />a为一个返回浮点数指针的函数<br /><br /><pre name="code" class="c">float (*a)()</pre><br />(*a)()为一个浮点数，<br />(*a)为一个返回浮点数的函数，<br />*a为一个函数<br />a为一个指向返回浮点数函数的指针<br /><br />(float (*)())为一个指向返回值为浮点数的函数的指针的类型转换<br /><br />则，(*(void (*)())0)()的含义为：<br />先将0转换成一个指向返回值为void的指针，然后调用该指针（首地址为0）指向的函数。<br /><br /><strong>4、整数溢出</strong><br />无符号整数没“溢出”一说<br /><br />检测溢出：<br /><pre name="code" class="c">#include&lt;limits.h>

int a,b;
if((unsigned)a+(unsigned)b>INT_MAX)</pre><br /><br />ANSI C标准中，limits.h里面定义了INT_MAX的大小。<br /><br /><strong>5、命名冲突与static修饰符</strong><br />static int a与int a意思一样的，但会忽略来自其它文件的a。<br />static也用于函数。<br /><br /><strong>6、内置宏</strong><br />_FILE_文件名<br />_LINE_所在代码行
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/202331#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 01:49:45 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/202331</link>
        <guid>http://crackcell.javaeye.com/blog/202331</guid>
      </item>
          <item>
        <title>《Effective C++》读书笔记(1)</title>
        <author>crackcell</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crackcell.javaeye.com">crackcell</a>&nbsp;
                    链接：<a href="http://crackcell.javaeye.com/blog/202326" style="color:red;">http://crackcell.javaeye.com/blog/202326</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.改变旧有的C习惯 1.1用指针的引用代替指针的指针<br /></strong><br /><pre name="code" class="c++">int **p;</pre><br />变为：<br /><pre name="code" class="c++">int *&amp;p;</pre><br /><br /><strong>1.2尽量用const和inline代替#define<br /></strong><br />理由：#define容易带来调试的复杂<br /><br />**一个#define错误<br /><br /><pre name="code" class="c++">#define max(a,b) ((a)>(b)?(a):(b))
</pre><br /><br />若：<br /><pre name="code" class="c++">int a=5,b=0;
</pre><br /><pre name="code" class="c++">max(++a,b);
</pre><br />a被加了2次<br /><pre name="code" class="c++">max(++a,b+10);
</pre><br />a被加了1次<br /><br />这里用inline函数代替，则没问题。<br /><br />若用模板，这样写：<br /><pre name="code" class="c++">tamplate&lt;class T>
inline const T&amp; max(const T&amp;a,const T&amp;b)
{
    return a>b?a:b;
}</pre><br /><br /><strong>1.3用&lt;iostream>代替&lt;stdio.h><br /></strong><br />理由：prinf/scanf不是类型安全的。虽然它们性能很好，但在大多数情况下还是别用。<br /><br /><strong>1.4用new/delete代替malloc/free<br /></strong><br />理由：malloc/free不理会对象的构造函数和析构函数。<br /><br /><pre name="code" class="c++">string *a=new string[10];</pre><br /><br />**使用同样样式的new/delete，new中有[]，delete也要有[]。<br /><pre name="code" class="c++">string *a=new string[10];
delete []a;</pre><br /><br />**在每个构造函数中该将指针初始化。如果没有任何一个构造函数将内存配置给指针，那么该指针应该被初始化为0(NULL)。<br />**在析构函数中释放内存。<br /><br /><strong>2.在class中，为保证成员至多只有一个示例，则用static<br /></strong><br /><pre name="code" class="c++">class A
{
private:
    static int COUNT=1;
...
};</pre><br />此为声明而非定义，使用时必须在实现文件中定义：<br /><pre name="code" class="c++">const int A::COUNT;</pre><br /><br />**一些编译器不接受这样的写法，它们不允许一个static class member于声明时就获得初值。此外，这种所谓的in-class initialization只允许对整数类型(int,bool,char等)才成立，而且只对常量成立。此时采用另外一种写法：<br /><br /><pre name="code" class="c++">class A
{
private:
    static const int COUNT;
...
};</pre><br />实现文件中：<br /><pre name="code" class="java">const int A::COUNT=1;</pre><br /><br /><br /><strong>3.为内存不足做好准备</strong><br /><br />当operator new不能分配内存时，会抛出一个异常（std::bad_alloc）出来。健壮的程序需要对这个异常加以处理。<br /><br />可以用一个宏来加强new：<br /><br /><pre name="code" class="c++">#define NEW(PTR,TYPE) \
    try((PTR)=new TYPE;) \
    catch(std::bad_alloc&amp;){assert(0);}</pre><br /><br />assert(int)在&lt;assert.h>中<br />若参数为0，则发出一个错误信息，并abort。<br /><br /><br /><strong>4.如果类内动态分配有内存，请为此类声明一个拷贝构造函数和一个assignment运算符</strong><br /><br />如：类中有 char *p;
          <br/><br/>
          <span style="color:red;">
            <a href="http://crackcell.javaeye.com/blog/202326#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 01:18:10 +0800</pubDate>
        <link>http://crackcell.javaeye.com/blog/202326</link>
        <guid>http://crackcell.javaeye.com/blog/202326</guid>
      </item>
      </channel>
</rss>