<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Wu.Country@侠缘</title><subtitle type="text">勤学似春起之苗，不见其增，日有所长；辍学如磨刀之石，不见其损，日所有亏!</subtitle><id>http://feed.cnblogs.com/blog/u/15485/rss</id><updated>2011-08-20T16:28:04Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15485/rss"/><entry><id>http://www.cnblogs.com/WuCountry/archive/2011/08/21/2147603.html</id><title type="text">【CLFS】记录：</title><summary type="text">CLFS在线文档：http://cross-lfs.org/view/clfs-embedded/arm/index.html1、环境变量准备:export CLFS_HOST=$(echo ${MACHTYPE} | sed &amp;quot;s/-[^-]*/-cross/&amp;quot;)export CLFS=/home/wutiejun/host/clfsexport CLFS_HOST=i686-cross-linuxexport CLFS_TARGET=arm-wap-linux-uclibceabiexport CLFS_PREFIX=/home/wutiejun/host/clfs/c</summary><published>2011-08-20T16:28:00Z</published><updated>2011-08-20T16:28:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2011/08/21/2147603.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2011/08/21/2147603.html"/><content type="html">&lt;p&gt;CLFS在线文档：&lt;br /&gt;&lt;a href="http://cross-lfs.org/view/clfs-embedded/arm/index.html"&gt;http://cross-lfs.org/view/clfs-embedded/arm/index.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、环境变量准备:&lt;br /&gt;export CLFS_HOST=$(echo ${MACHTYPE} | sed "s/-[^-]*/-cross/")&lt;/p&gt;&#xD;
&lt;p&gt;export CLFS=/home/wutiejun/host/clfs&lt;br /&gt;export CLFS_HOST=i686-cross-linux&lt;br /&gt;export CLFS_TARGET=arm-wap-linux-uclibceabi&lt;br /&gt;export CLFS_PREFIX=/home/wutiejun/host/clfs/cross-tools&lt;br /&gt;export CLFS_ARCH="arm"&lt;br /&gt;export CLFS_ENDIAN="little"&lt;br /&gt;export CLFS_FLOAT="soft"&lt;br /&gt;export CLFS_ABI="aapcs-linux"&lt;br /&gt;export CLFS_ARM_ARCH="armv6"&lt;br /&gt;export CLFS_ARM_MODE="arm"&lt;br /&gt;export CLFS_FPU=""&lt;/p&gt;&#xD;
&lt;p&gt;/home/wutiejun/host/clfs/cross-tools/usr/include&lt;/p&gt;&#xD;
&lt;p&gt;arm-wap-linux-uclibceabi-&lt;/p&gt;&#xD;
&lt;p&gt;2、准备内核头文件：&lt;br /&gt;make mrproper&lt;br /&gt;make ARCH=${CLFS_ARCH} headers_check&lt;br /&gt;make ARCH=${CLFS_ARCH} INSTALL_HDR_PATH=${CLFS_PREFIX}/usr/include headers_install&lt;/p&gt;&#xD;
&lt;p&gt;cp -rv dest/include/* ${CLFS}/usr/include&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;3、GMP包编译：&lt;br /&gt;CPPFLAGS=-fexceptions ./configure \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --prefix=${CLFS}/cross-tools&lt;/p&gt;&#xD;
&lt;p&gt;make &lt;br /&gt;make check&lt;br /&gt;make install&lt;/p&gt;&#xD;
&lt;p&gt;3、编译MPFR包：&lt;br /&gt;LDFLAGS="-Wl,-rpath,${CLFS}/cross-tools/lib" \&lt;br /&gt;&amp;nbsp; ./configure --prefix=${CLFS}/cross-tools --enable-shared \&lt;br /&gt;&amp;nbsp; --with-gmp=${CLFS}/cross-tools&lt;/p&gt;&#xD;
&lt;p&gt;make &lt;br /&gt;make install&lt;/p&gt;&#xD;
&lt;p&gt;3、编译MPC包：&lt;br /&gt;LDFLAGS="-Wl,-rpath,${CLFS}/cross-tools/lib" \&lt;br /&gt;&amp;nbsp; ./configure --prefix=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --with-gmp=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --with-mpfr=${CLFS}/cross-tools&lt;/p&gt;&#xD;
&lt;p&gt;make&lt;br /&gt;make install&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;3、编译binutils；&lt;br /&gt;config参数：&lt;/p&gt;&#xD;
&lt;p&gt;../binutils-2.21/configure --prefix=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp;&amp;nbsp; --target=${CLFS_TARGET} --with-sysroot=${CLFS} --disable-nls \&lt;br /&gt;&amp;nbsp;&amp;nbsp; --enable-shared --disable-multilib&lt;/p&gt;&#xD;
&lt;p&gt;make configure-host&lt;br /&gt;make&lt;/p&gt;&#xD;
&lt;p&gt;make install&lt;/p&gt;&#xD;
&lt;p&gt;cp -v ../binutils-2.21/include/libiberty.h ${CLFS}/usr/include&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;4、编译静态gcc：&lt;/p&gt;&#xD;
&lt;p&gt;AR=ar LDFLAGS="-Wl,-rpath,${CLFS}/cross-tools/lib" \&lt;br /&gt;&amp;nbsp; ../gcc-4.6.0/configure --prefix=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp; --build=${CLFS_HOST} --host=${CLFS_HOST} --target=${CLFS_TARGET} \&lt;br /&gt;&amp;nbsp; --with-sysroot=${CLFS} --disable-nls&amp;nbsp; --disable-shared \&lt;br /&gt;&amp;nbsp; --with-mpfr=${CLFS}/cross-tools --with-gmp=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp; --with-mpc=${CLFS}/cross-tools --without-headers --with-newlib \&lt;br /&gt;&amp;nbsp; --disable-decimal-float --disable-libgomp --disable-libmudflap \&lt;br /&gt;&amp;nbsp; --disable-libssp --disable-threads --enable-languages=c \&lt;br /&gt;&amp;nbsp; --disable-multilib --with-abi=${CLFS_ABI} --with-arch=${CLFS_ARM_ARCH} \&lt;br /&gt;&amp;nbsp; --with-mode=${CLFS_ARM_MODE} --with-float=${CLFS_FLOAT} \&lt;br /&gt;&amp;nbsp; --with-fpu=${CLFS_FPU}&lt;/p&gt;&#xD;
&lt;p&gt;make all-gcc all-target-libgcc&lt;/p&gt;&#xD;
&lt;p&gt;make install-gcc install-target-libgcc&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;5、编译uclibc:&lt;br /&gt;declare -x &lt;/p&gt;&#xD;
&lt;p&gt;PATH="/home/wutiejun/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/games:/opt/gnome/bin:/opt&lt;/p&gt;&#xD;
&lt;p&gt;/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin"&lt;/p&gt;&#xD;
&lt;p&gt;export PATH=$PATH:${CLFS_PREFIX}/bin&lt;/p&gt;&#xD;
&lt;p&gt;patch -Np1 -i ../uClibc-0.9.31-configs-2.patch&lt;/p&gt;&#xD;
&lt;p&gt;修改eabi或者oabi&lt;br /&gt;cp -v clfs/config.${CLFS_ARCH}.${CLFS_ENDIAN} .config&lt;br /&gt;if [ "${CLFS_ABI}" == "aapcs" ] || [ "${CLFS_ABI}" == "aapcs-linux" ]; \&lt;br /&gt;&amp;nbsp; then sed -i s/CONFIG_ARM_OABI/CONFIG_ARM_EABI/g .config; fi&lt;/p&gt;&#xD;
&lt;p&gt;make oldconfig&lt;/p&gt;&#xD;
&lt;p&gt;make&lt;/p&gt;&#xD;
&lt;p&gt;make PREFIX=${CLFS} install&lt;/p&gt;&#xD;
&lt;p&gt;6、编译gcc第二次：&lt;/p&gt;&#xD;
&lt;p&gt;AR=ar LDFLAGS="-Wl,-rpath,${CLFS}/cross-tools/lib" \&lt;br /&gt;&amp;nbsp; ../gcc-4.6.0/configure --prefix=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp; --build=${CLFS_HOST} --target=${CLFS_TARGET} --host=${CLFS_HOST} \&lt;br /&gt;&amp;nbsp; --with-sysroot=${CLFS} --disable-nls --enable-shared \&lt;br /&gt;&amp;nbsp; --enable-languages=c --enable-c99 --enable-long-long \&lt;br /&gt;&amp;nbsp; --with-mpfr=${CLFS}/cross-tools --with-gmp=${CLFS}/cross-tools \&lt;br /&gt;&amp;nbsp; --with-mpc=${CLFS}/cross-tools --disable-multilib \&lt;br /&gt;&amp;nbsp; --with-abi=${CLFS_ABI} --with-arch=${CLFS_ARM_ARCH} \&lt;br /&gt;&amp;nbsp; --with-mode=${CLFS_ARM_MODE} --with-float=${CLFS_FLOAT} \&lt;br /&gt;&amp;nbsp; --with-fpu=${CLFS_FPU}&lt;/p&gt;&#xD;
&lt;p&gt;make&lt;/p&gt;&#xD;
&lt;p&gt;make install&lt;/p&gt;&#xD;
&lt;p&gt;cp -v ${CLFS}/cross-tools/${CLFS_TARGET}/lib/libgcc_s.so.1 ${CLFS}/lib&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/WuCountry/aggbug/2147603.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/WuCountry/archive/2011/08/21/2147603.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/11/15/1878050.html</id><title type="text">Linux内核代码学习笔记(2.6.21.7 ARM) -- 内核启动函数start_kernel</title><summary type="text">其实对内核的代码已经分析很久了，早就想自己写些什么，从今天开始，从新继续我的博客！这几年都在与Linux打交道了，而且我觉得我也真正的爱上了Linux，所以就写些Linux的东西吧！Linux的东西很多，就内核而言，已经无法一个人去了解所有的机制和细节了。但好在源码是可以随时取到的，只要你熟悉和了解内核的一些基本特性，还是可以很容易上手的！下面，我就把我自己的一些学习经历写出来和大家分享一下！首选...</summary><published>2010-11-15T15:16:00Z</published><updated>2010-11-15T15:16:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/11/15/1878050.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/11/15/1878050.html"/><content type="html">&lt;p&gt;其实对内核的代码已经分析很久了，早就想自己写些什么，从今天开始，从新继续我的博客！&lt;/p&gt;&#xD;
&lt;p&gt;这几年都在与Linux打交道了，而且我觉得我也真正的爱上了Linux，所以就写些Linux的东西吧！&lt;/p&gt;&#xD;
&lt;p&gt;Linux的东西很多，就内核而言，已经无法一个人去了解所有的机制和细节了。但好在源码是可以随时取到的，只要你熟悉和了解内核的一些基本特性，还是可以很容易上手的！&lt;/p&gt;&#xD;
&lt;p&gt;下面，我就把我自己的一些学习经历写出来和大家分享一下！&lt;/p&gt;&#xD;
&lt;p&gt;首选，内核代码里有大小写重名的文件，所以，从网上下载了内核源码包以后，不能直接在Windows下解压，否则会有些文件被大小写重复的文件名复盖掉！主要是网络相关的。我暂时先不想了解网络相关的内容，所以，就先在Windows下，使用SourceInsight来看代码！如果要看到全部的代码，还是要在Linux系统下解压代码！&lt;/p&gt;&#xD;
&lt;p&gt;另外，我对X86体系结构的代码也暂时不感兴趣，先从ARM入手，不过不同的体系结构，关系并不太大，明白一些机制以后，大部份是一样的！&lt;/p&gt;&#xD;
&lt;p&gt;先从第一个函数入手：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;E:\Projects\kernel\linux-2.6.21.1.src\init\main.c (501/825)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;asmlinkage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;__init&amp;nbsp;start_kernel(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这个函数是内核由引导程序引导以后，由自解压程序解压以后执行的第一个函数，可以认为是整个内核的入口函数，以后我分析的代码全部从这个函数开始！&lt;/p&gt;&#xD;
&lt;p&gt;这个函数做的事情相对比较简单，就是线性的初始化一些内核的基础机制，如中断，内存管理，进程管理，信号，文件系统，KO等！最后就启动一个init线程，init线程再读取文件系统里的init程序，做为系统的第一个进程而存在！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实，start_kernel函数是0是做为0号进程存在的，它在最后就是空转CPU：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('ff5db00d-fd9d-4cd7-9b2e-3c0325a93844')"&gt;&lt;img  id="code_img_opened_ff5db00d-fd9d-4cd7-9b2e-3c0325a93844" style="display: none" onclick="cnblogs_code_hide('ff5db00d-fd9d-4cd7-9b2e-3c0325a93844',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div  id="cnblogs_code_open_ff5db00d-fd9d-4cd7-9b2e-3c0325a93844"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;The&amp;nbsp;idle&amp;nbsp;thread.&amp;nbsp;&amp;nbsp;We&amp;nbsp;try&amp;nbsp;to&amp;nbsp;conserve&amp;nbsp;power,&amp;nbsp;while&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;keep&lt;br /&gt;&amp;nbsp;*&amp;nbsp;overall&amp;nbsp;latency&amp;nbsp;low.&amp;nbsp;&amp;nbsp;The&amp;nbsp;architecture&amp;nbsp;specific&amp;nbsp;idle&amp;nbsp;is&amp;nbsp;passed&lt;br /&gt;&amp;nbsp;*&amp;nbsp;a&amp;nbsp;value&amp;nbsp;to&amp;nbsp;indicate&amp;nbsp;the&amp;nbsp;level&amp;nbsp;of&amp;nbsp;"idleness"&amp;nbsp;of&amp;nbsp;the&amp;nbsp;system.&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;cpu_idle(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local_fiq_enable();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;endless&amp;nbsp;idle&amp;nbsp;loop&amp;nbsp;with&amp;nbsp;no&amp;nbsp;priority&amp;nbsp;at&amp;nbsp;all&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;idle)(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;pm_idle;&lt;br /&gt;&lt;br /&gt;#ifdef&amp;nbsp;CONFIG_HOTPLUG_CPU&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(cpu_is_offline(smp_processor_id()))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leds_event(led_idle_start);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cpu_die();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;idle)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idle&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;default_idle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leds_event(led_idle_start);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;need_resched())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idle();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leds_event(led_idle_end);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preempt_enable_no_resched();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preempt_disable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而在它之前，启动的init线程，则是运行文件系统里的init程序：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('f4e536b0-0863-4a66-8b98-1406bd7c23a9')"&gt;&lt;img  id="code_img_opened_f4e536b0-0863-4a66-8b98-1406bd7c23a9" style="display: none" onclick="cnblogs_code_hide('f4e536b0-0863-4a66-8b98-1406bd7c23a9',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div  id="cnblogs_code_open_f4e536b0-0863-4a66-8b98-1406bd7c23a9"&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;This&amp;nbsp;is&amp;nbsp;a&amp;nbsp;non&amp;nbsp;__init&amp;nbsp;function.&amp;nbsp;Force&amp;nbsp;it&amp;nbsp;to&amp;nbsp;be&amp;nbsp;noinline&amp;nbsp;otherwise&amp;nbsp;gcc&lt;br /&gt;&amp;nbsp;*&amp;nbsp;makes&amp;nbsp;it&amp;nbsp;inline&amp;nbsp;to&amp;nbsp;init()&amp;nbsp;and&amp;nbsp;it&amp;nbsp;becomes&amp;nbsp;part&amp;nbsp;of&amp;nbsp;init.text&amp;nbsp;section&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;noinline&amp;nbsp;init_post(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free_initmem();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unlock_kernel();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mark_rodata_ro();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system_state&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SYSTEM_RUNNING;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numa_default_policy();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(sys_open((&lt;/span&gt;&lt;span style="color: #0000ff"&gt;const&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;__user&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/dev/console&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;O_RDWR,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printk(KERN_WARNING&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Warning:&amp;nbsp;unable&amp;nbsp;to&amp;nbsp;open&amp;nbsp;an&amp;nbsp;initial&amp;nbsp;console.\n&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;sys_dup(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;sys_dup(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(ramdisk_execute_command)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(ramdisk_execute_command);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printk(KERN_WARNING&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Failed&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;%s\n&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ramdisk_execute_command);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;We&amp;nbsp;try&amp;nbsp;each&amp;nbsp;of&amp;nbsp;these&amp;nbsp;until&amp;nbsp;one&amp;nbsp;succeeds.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;The&amp;nbsp;Bourne&amp;nbsp;shell&amp;nbsp;can&amp;nbsp;be&amp;nbsp;used&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;init&amp;nbsp;if&amp;nbsp;we&amp;nbsp;are&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;recover&amp;nbsp;a&amp;nbsp;really&amp;nbsp;broken&amp;nbsp;machine.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(execute_command)&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;　　/*&amp;nbsp;如果有启动参数做为执行命令，就执行 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(execute_command);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printk(KERN_WARNING&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Failed&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;%s.&amp;nbsp;&amp;nbsp;Attempting&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;defaults...\n&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;execute_command);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;　　/* 依次查询文件系统里的init程序，这里的run_init_process函数不能返回，否则启动失败&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/sbin/init&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/etc/init&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/bin/init&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_init_process(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/bin/sh&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;panic(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;No&amp;nbsp;init&amp;nbsp;found.&amp;nbsp;&amp;nbsp;Try&amp;nbsp;passing&amp;nbsp;init=&amp;nbsp;option&amp;nbsp;to&amp;nbsp;kernel.&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因为内核为很多体系结构的CPU实现具体的函数，所以一个函数可能在很多目录里的同名文件所实现。在查询是具体的哪个函数时，要对应的具体的体系结构。如果对应的具体体系结构里没有相关函数，就可在使用通用的函数或者通用的体系结构里的函数!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&lt;font style="background-color: #ffffff"&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/WuCountry/aggbug/1878050.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/WuCountry/archive/2010/11/15/1878050.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/02/22/1671537.html</id><title type="text">[读书笔记]Binary Hancks(2) livepatch在X86下的实践</title><summary type="text">livepatch是个可以给运行时的进程打热补丁的工具。它可以方便的修改运行进程中的变量，也可以方便的替换运行进程中的函数，使用新的库函数来取代原来主进程中的函数!1、livepatch源码下载：http://sourcehoge.net/Software/livepatch/2、binutil下载(笔者使用的版本为2.15)：http://ftp.gnu.org/gnu/binutils/3、编...</summary><published>2010-02-22T14:05:00Z</published><updated>2010-02-22T14:05:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/02/22/1671537.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/02/22/1671537.html"/><content type="html">&lt;p&gt;livepatch是个可以给运行时的进程打热补丁的工具。它可以方便的修改运行进程中的变量，也可以方便的替换运行进程中的函数，使用新的库函数来取代原来主进程中的函数!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、livepatch源码下载：&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://sourcehoge.net/Software/livepatch/" target="_blank"&gt;http://sourcehoge.net/Software/livepatch/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、binutil下载(笔者使用的版本为2.15)：&lt;br /&gt;&lt;/strong&gt;&lt;a href="http://ftp.gnu.org/gnu/binutils/" target="_blank"&gt;http://ftp.gnu.org/gnu/binutils/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、编译binutil包：&lt;/strong&gt;&lt;br /&gt;2.15版本的binutil包有一个小BUG，编译时会报这个错误：&lt;br /&gt;gcc -DHAVE_CONFIG_H -I. -Ihttp://www.cnblogs.com/binutils-2.15/gas -I. -D_GNU_SOURCE -I. -Ihttp://www.cnblogs.com/binutils-2.15/gas -I../bfd -Ihttp://www.cnblogs.com/binutils-2.15/gas/config -Ihttp://www.cnblogs.com/binutils-2.15/gas/../include -Ihttp://www.cnblogs.com/binutils-2.15/gas/.. -Ihttp://www.cnblogs.com/binutils-2.15/gas/../bfd -Ihttp://www.cnblogs.com/binutils-2.15/gas/../intl -I../intl -DLOCALEDIR="\"/home/public/study/binutils/target_x86/build/share/locale\""&amp;nbsp;&amp;nbsp; -W -Wall -Wstrict-prototypes -Wmissing-prototypes -g -O2 -c http://www.cnblogs.com/binutils-2.15/gas/app.c&lt;br /&gt;In file included from ./targ-cpu.h:1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from http://www.cnblogs.com/binutils-2.15/gas/config/obj-elf.h:42,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from ./obj-format.h:1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from http://www.cnblogs.com/binutils-2.15/gas/config/te-linux.h:4,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from ./targ-env.h:1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from http://www.cnblogs.com/binutils-2.15/gas/as.h:626,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from http://www.cnblogs.com/binutils-2.15/gas/app.c:30:&lt;br /&gt;http://www.cnblogs.com/binutils-2.15/gas/config/tc-i386.h:451: error: array type has incomplete element type&lt;br /&gt;make[3]: *** [app.o] Error 1&lt;br /&gt;make[3]: Leaving directory `/home/public/study/binutils/target_x86/gas'&lt;br /&gt;make[2]: *** [all-recursive] Error 1&lt;br /&gt;make[2]: Leaving directory `/home/public/study/binutils/target_x86/gas'&lt;br /&gt;make[1]: *** [all] Error 2&lt;br /&gt;make[1]: Leaving directory `/home/public/study/binutils/target_x86/gas'&lt;br /&gt;make: *** [all-gas] Error 2&lt;br /&gt;jimmy@linux-jimmy:/home/public/study/binutils/target_x86&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;修改方法：&lt;br /&gt;(1)、把../binutils-2.15/gas/config/tc-i386.h文件第451行：&lt;br /&gt;extern const struct relax_type md_relax_table[];&lt;br /&gt;修改为：&lt;br /&gt;extern const struct relax_type * md_relax_table;&lt;/p&gt;&#xD;
&lt;p&gt;把../binutils-2.15/gas/config/tc-i386.c中对应的数据结构修改为：const struct relax_type md_relax_table_ex[];&lt;br /&gt;添加：const struct relax_type * md_relax_table = md_relax_table_ex;&lt;/p&gt;&#xD;
&lt;p&gt;补丁： diff -Nur binutils-2.15 binutils-2.15.jimmy/&lt;br /&gt;diff -Nur binutils-2.15/gas/config/tc-i386.c binutils-2.15.jimmy/gas/config/tc-i386.c&lt;br /&gt;--- binutils-2.15/gas/config/tc-i386.c&amp;nbsp; 2004-05-18 03:36:09.000000000 +0800&lt;br /&gt;+++ binutils-2.15.jimmy/gas/config/tc-i386.c&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-02-22 21:29:41.000000000 +0800&lt;br /&gt;@@ -363,7 +363,7 @@&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prefix), and doesn't work, unless the destination is in the bottom&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 64k of the code segment (The top 16 bits of eip are zeroed).&amp;nbsp; */&lt;/p&gt;&#xD;
&lt;p&gt;-const relax_typeS md_relax_table[] =&lt;br /&gt;+const relax_typeS md_relax_table_ex[] =&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; /* The fields are:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1) most positive reach of this state,&lt;br /&gt;@@ -402,6 +402,8 @@&lt;br /&gt;&amp;nbsp;&amp;nbsp; {0, 0, 4, 0}&lt;br /&gt;&amp;nbsp;};&lt;/p&gt;&#xD;
&lt;p&gt;+const relax_typeS * md_relax_table = md_relax_table_ex;&lt;br /&gt;+&lt;br /&gt;&amp;nbsp;static const arch_entry cpu_arch[] = {&lt;br /&gt;&amp;nbsp;&amp;nbsp; {"i8086",&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu086 },&lt;br /&gt;&amp;nbsp;&amp;nbsp; {"i186",&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cpu086|Cpu186 },&lt;br /&gt;diff -Nur binutils-2.15/gas/config/tc-i386.h binutils-2.15.jimmy/gas/config/tc-i386.h&lt;br /&gt;--- binutils-2.15/gas/config/tc-i386.h&amp;nbsp; 2004-05-18 03:36:09.000000000 +0800&lt;br /&gt;+++ binutils-2.15.jimmy/gas/config/tc-i386.h&amp;nbsp;&amp;nbsp;&amp;nbsp; 2010-02-22 21:26:12.000000000 +0800&lt;br /&gt;@@ -448,7 +448,7 @@&lt;/p&gt;&#xD;
&lt;p&gt;#define md_operand(x)&lt;/p&gt;&#xD;
&lt;p&gt;-extern const struct relax_type md_relax_table[];&lt;br /&gt;+extern const struct relax_type * md_relax_table;&lt;br /&gt;&amp;nbsp;#define TC_GENERIC_RELAX_TABLE md_relax_table&lt;/p&gt;&#xD;
&lt;p&gt;extern int optimize_align_code;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、编译livepatch包：&lt;/strong&gt;&lt;br /&gt;这里要修改一下Makefile：&lt;br /&gt;jimmy@linux-jimmy:/home/public/study/livepatch/source&amp;gt; cat Makefile&lt;br /&gt;#&lt;br /&gt;# Makefile for livepatch&lt;br /&gt;# $Id: Makefile 330 2004-11-03 11:38:02Z ukai $&lt;br /&gt;# Copyright (C) 2004 Fumitoshi UKAI &amp;lt;ukai@debian.or.jp&amp;gt;&lt;br /&gt;# All rights reserved.&lt;br /&gt;# This is free software with ABSOLUTELY NO WARRANTY.&lt;br /&gt;#&lt;br /&gt;# You can redistribute it and/or modify it under the terms of&lt;br /&gt;# the GNU General Public License version 2.&lt;br /&gt;#&lt;/p&gt;&#xD;
&lt;p&gt;BINUTILS_DIR=/home/public/study/binutils/target_x86/build&lt;/p&gt;&#xD;
&lt;p&gt;CFLAGS=-Wall -O2 -g -I$(BINUTILS_DIR)/include&lt;/p&gt;&#xD;
&lt;p&gt;all: livepatch&lt;/p&gt;&#xD;
&lt;p&gt;livepatch: livepatch.o&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(CC) -o $@ $&amp;lt;&amp;nbsp; -L$(BINUTILS_DIR)/lib -lbfd -liberty -lopcodes&lt;/p&gt;&#xD;
&lt;p&gt;fixup: fixup.o&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(CC) -o $@ $&amp;lt; -L$(BINUTILS_DIR)/lib -lbfd -liberty -lopcodes&lt;/p&gt;&#xD;
&lt;p&gt;bfd: bfd.o&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(CC) -o $@ $&amp;lt; -L$(BIN_UTILS_DIR)/lib -lbfd -liberty -lopcodes&lt;/p&gt;&#xD;
&lt;p&gt;clean:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -rm -f *.o&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -rm -f livepatch fixup bfd&lt;/p&gt;&#xD;
&lt;p&gt;# EOF&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、测试：&lt;/strong&gt;&lt;br /&gt;jimmy@linux-jimmy:/home/public/study/livepatch/test&amp;gt; ./test.sh&lt;br /&gt;in main process test_func:0&lt;br /&gt;in main process test_func_x:0&lt;br /&gt;in main process test_func:1&lt;br /&gt;in main process test_func_x:1&lt;br /&gt;in main process test_func:2&lt;br /&gt;in main process test_func_x:2&lt;br /&gt;in main process test_func:3&lt;br /&gt;in main process test_func_x:3&lt;br /&gt;in main process test_func:4&lt;br /&gt;in main process test_func_x:4&lt;br /&gt;bfd_openr: No such file or directory&lt;br /&gt;dl test @ 0xb7f0f000 [8220] libtest.so&lt;br /&gt;jmp 0x804841f 0xb7f0f45c　　&lt;span style="color: #ff0000"&gt;&amp;lt;- 打上补丁，主进程的调用函数调用到补丁变库中!&lt;/span&gt;&lt;br /&gt;in livepatch test_func:5&lt;br /&gt;in main process test_func_x:-5&amp;nbsp; &lt;span style="color: #ff0000"&gt;&amp;lt;- 补丁函数又回调到了主进程中的函数&lt;/span&gt;&lt;br /&gt;in livepatch test_func:6&lt;br /&gt;in main process test_func_x:-6&lt;br /&gt;in livepatch test_func:7&lt;br /&gt;in main process test_func_x:-7&lt;br /&gt;in livepatch test_func:8&lt;br /&gt;in main process test_func_x:-8&lt;br /&gt;in livepatch test_func:9&lt;br /&gt;in main process test_func_x:-9&lt;br /&gt;in livepatch test_func:10&lt;br /&gt;in main process test_func_x:-10&lt;br /&gt;./test.sh: line 11:&amp;nbsp; 8195 Killed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ./test&lt;br /&gt;jimmy@linux-jimmy:/home/public/study/livepatch/test&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;6、完整源码与测试包(不包括binutils)：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/WuCountry/livepatch.rar" target="_blank"&gt;http://files.cnblogs.com/WuCountry/livepatch.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/WuCountry/aggbug/1671537.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/WuCountry/archive/2010/02/22/1671537.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/02/20/1669969.html</id><title type="text">[读书笔记]Binary Hancks(1)</title><summary type="text">本书真的很不错，虽然它的名字叫做&amp;#8220;黑客&amp;#8221;，但它所讲述的内容却是一个程序员，特别是一个Linux程序员，或者说是C程序员必备的知识！第一讲：二进制Hack的技巧分为6大类：1、各种工具、库2、二进制格式3、系统调用4、OS功能5、处理器功能6、编译器功能从这几大类上就可以看出来，它并不是所谓的黑客工具或者攻略之类的东西，而是深入理解二进制程序的相关知识。相信很多程序写过很多程...</summary><published>2010-02-20T14:54:00Z</published><updated>2010-02-20T14:54:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/02/20/1669969.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/02/20/1669969.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;本书真的很不错，虽然它的名字叫做&amp;#8220;黑客&amp;#8221;，但它所讲述的内容却是一个程序员，特别是一个Linux程序员，或者说是C程序员必备的知识！&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;第一讲：二进制Hack的技巧分为6大类：&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;1、各种工具、库&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;2、二进制格式&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;3、系统调用&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;4、OS功能&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;5、处理器功能&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;6、编译器功能&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #a6caf0"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;从这几大类上就可以看出来，它并不是所谓的黑客工具或者攻略之类的东西，而是深入理解二进制程序的相关知识。相信很多程序写过很多程序，但都没有深入理解二进制文件的格式以及编译、链接、静态分析等之类的东西！从这里开始，你将了解这些东西！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二计：Binary Hacks的用语基础知识&lt;/p&gt;&#xD;
&lt;p&gt;应用二进制接口ABI（Application Binary Interface），EABI&lt;/p&gt;&#xD;
&lt;p&gt;应用程序接口API（Application Programming Interface）&lt;/p&gt;&#xD;
&lt;p&gt;初始符号段BBS Segment(Block Started Bymbol Segment)&lt;/p&gt;&#xD;
&lt;p&gt;动态共享对象DSO（Dynamic Shared Object）&lt;/p&gt;&#xD;
&lt;p&gt;任意记录格式高度DWARF（Debug With Arbitrary Record Format）&lt;/p&gt;&#xD;
&lt;p&gt;可执行可链接格式ELF（Executable and Linking Format）&lt;/p&gt;&#xD;
&lt;p&gt;GCC（GNU Complier Collection）&lt;/p&gt;&#xD;
&lt;p&gt;glibc(Gnu C Library)&lt;/p&gt;&#xD;
&lt;p&gt;GNU(GNU's Not Unix)&lt;/p&gt;&#xD;
&lt;p&gt;GNU/Linux&lt;/p&gt;&#xD;
&lt;p&gt;全局偏移表GOT（Global Offset Table）&lt;/p&gt;&#xD;
&lt;p&gt;LLP64　long long和指针都占64位，int和long都占32位的数据模型&lt;/p&gt;&#xD;
&lt;p&gt;LP64　long和指针占64位，int占32位的数据模型&lt;/p&gt;&#xD;
&lt;p&gt;位置无关代码PIC（Position Idependent Code）&lt;/p&gt;&#xD;
&lt;p&gt;位置无关的可执行程序PIE（Position Idependent Executable）&lt;/p&gt;&#xD;
&lt;p&gt;程序链接表PLT（Procedure Linkage Table）&lt;/p&gt;&#xD;
&lt;p&gt;POSIX（Protable Operating System Interface for Unix）&lt;/p&gt;&#xD;
&lt;p&gt;SUS（Single Unix Specification）&lt;/p&gt;&#xD;
&lt;p&gt;线程本地存储TLS（Thread Local Storage）&lt;/p&gt;&#xD;
&lt;p&gt;预链接（prelink）&lt;/p&gt;&#xD;
&lt;p&gt;静态链接(Staitc Link)&lt;/p&gt;&#xD;
&lt;p&gt;工具链(toolschain)&lt;/p&gt;&#xD;
&lt;p&gt;数据段(Data segment)&lt;/p&gt;&#xD;
&lt;p&gt;代码段(Text segment)&lt;/p&gt;&#xD;
&lt;p&gt;调试器(Debuger)&lt;/p&gt;&#xD;
&lt;p&gt;调试信息(Debug infomation)&lt;/p&gt;&#xD;
&lt;p&gt;符号重组(demangle)&lt;/p&gt;&#xD;
&lt;p&gt;动态链接(Dynamic link)&lt;/p&gt;&#xD;
&lt;p&gt;动态链接库(Dynamic link library)&lt;/p&gt;&#xD;
&lt;p&gt;名称改编（name mangline）&lt;/p&gt;&#xD;
&lt;p&gt;Binarian　精通Binary Hack方面技术的工程师&lt;/p&gt;&#xD;
&lt;p&gt;栈跟踪，栈回塑(backstrace)&lt;/p&gt;&#xD;
&lt;p&gt;堆(heap)&lt;/p&gt;&#xD;
&lt;p&gt;断点(break point)&lt;/p&gt;&#xD;
&lt;p&gt;程序计数器(program conter)&lt;/p&gt;&#xD;
&lt;p&gt;进程(process)&lt;/p&gt;&#xD;
&lt;p&gt;Profile 程序性能解析&lt;/p&gt;&#xD;
&lt;p&gt;函数调用约定（Calling Convention）&lt;/p&gt;&#xD;
&lt;p&gt;运行时（runtime）&lt;/p&gt;&#xD;
&lt;p&gt;链接(link)&lt;/p&gt;&#xD;
&lt;p&gt;反射(reflection)&lt;/p&gt;&#xD;
&lt;p&gt;装载，加载(load)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有多少人知道上面所有的名词？本书会慢慢的带你了解这些基础知识！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/WuCountry/aggbug/1669969.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/WuCountry/archive/2010/02/20/1669969.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/01/07/1641779.html</id><title type="text">ARM Stack Unwinding</title><summary type="text">ARM Stack Unwindingby Michael McTernan IntroductionLanguages like C++ and Java have very useful facilities that allow a stack trace to be collected and displayed in a variety of ways. In Java, a snaps...</summary><published>2010-01-07T14:59:00Z</published><updated>2010-01-07T14:59:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/01/07/1641779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/01/07/1641779.html"/></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/01/02/1637997.html</id><title type="text">Physical Address Extension - PAE Memory and Windows</title><summary type="text">Physical Address Extension - PAE Memory and WindowsUpdated: February 9, 2005Related Links&amp;#8226;Operating Systems and PAE SupportOn This PageIntroductionSystem Board Issues: DAC Capabilities for Buses...</summary><published>2010-01-02T13:14:00Z</published><updated>2010-01-02T13:14:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/01/02/1637997.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/01/02/1637997.html"/></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2010/01/01/1637344.html</id><title type="text">如何制作grub启动光盘</title><summary type="text">http://whiteyes.blog.hexun.com/9723224_d.html将下载得到的grldr直接改名为grldr.bif，然后使用UltraISO新建一个ISO镜像，选择&amp;#8220;启动光盘－加载引导信息&amp;#8221;加载grldr.bif。这是，你新建的ISO镜像已经具备了光盘启动功能，grub菜单文件menu.lst此时应该放在光盘根目录，不然grldr启动后找不到。网上...</summary><published>2010-01-01T04:16:00Z</published><updated>2010-01-01T04:16:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2010/01/01/1637344.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2010/01/01/1637344.html"/></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2009/10/25/1589598.html</id><title type="text">[译]Kernel Memory Layout on ARM Linux</title><summary type="text">这是内核自带的文档，讲解ARM芯片的内存是如何布局的！比较简单，对于初学者可以看一下！但要想深入理解Linux内存管理，建议还是找几本好书看看，如深入理解Linux虚拟内存，嵌入系统分析，Linux内核分析及程序设计等；Kernel Memory Layout on ARM LinuxLinux在ARM平台上的内存布局Russell King &amp;lt;rmk@arm.linux.org.uk&amp;gt...</summary><published>2009-10-25T13:25:00Z</published><updated>2009-10-25T13:25:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2009/10/25/1589598.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2009/10/25/1589598.html"/></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2009/10/23/1588920.html</id><title type="text">[转]ucLinux下sqlite数据库移植全攻略</title><summary type="text">ucLinux下sqlite数据库移植全攻略 　　本文讨论的是比较流行的嵌入式开发组合ARM+uclinux，即目标开发板为三星S3C4510，完成sqlite在其uclinux上的移植。　　本文假设你已经具备正确编译uclinux的kernel的能力，即有能力完成make menuconfig；make dep；make lib_only；make user_only；make romfs；ma...</summary><published>2009-10-23T14:34:00Z</published><updated>2009-10-23T14:34:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2009/10/23/1588920.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2009/10/23/1588920.html"/></entry><entry><id>http://www.cnblogs.com/WuCountry/archive/2009/10/04/1578023.html</id><title type="text">Taylor Swift - Love Story</title><summary type="text">Taylor Swift [Photo: Baidu.com]Love StoryLyric: We were both young when I first saw youI close my eyes and the flashback startsI'm standing there on a balcony in summer airSee the lights, see the part...</summary><published>2009-10-04T11:39:00Z</published><updated>2009-10-04T11:39:00Z</updated><author><name>Wu.Country@侠缘</name><uri>http://www.cnblogs.com/WuCountry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/WuCountry/archive/2009/10/04/1578023.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/WuCountry/archive/2009/10/04/1578023.html"/></entry></feed>
