<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cha_echo的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cha_echo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cha_echo]]></copyright><item><title><![CDATA[ldd查看依赖关系]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5913210</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5913210</guid><author>cha_echo</author><pubDate>Wed, 29 Sep 2010 00:50:00 +0800</pubDate><description><![CDATA[<br />通过readelf 或者objdump可以查看某一个可执行文件所依赖的共享库，而且这些共享库都是作为SONAME记录在ELF动态节的NEEDED上。<br />首先，我们看一下名词soname:<br />在linux上共享库都是以文件的形式来存放，而每一个共享库都被赋予了一个特别的名称，linux称之为soname。它包括了共享库的名称和版本号.然而这个soname只是一个软连接，它指向的文件才是真正的库文件。例如/lib/libc.so.6就是一个soname，它指向了 libc-2.10.]]></description><category></category></item><item><title><![CDATA[用od转储二进制文件]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5910879</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5910879</guid><author>cha_echo</author><pubDate>Tue, 28 Sep 2010 00:43:00 +0800</pubDate><description><![CDATA[od就是octal dump的意思，缺省情况下用八进制输出二进制文件zecho@zecho-laptop:~$ od /etc/ld.so.cache | head -5
0000000 062154 071456 026557 027061 027067 000060 001650 000000
0000020 000003 000000 055470 000000 055507 000000 000003 000000
0000040 055537 000000 055551 000000 000]]></description><category></category></item><item><title><![CDATA[内核模块]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5904120</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5904120</guid><author>cha_echo</author><pubDate>Sat, 25 Sep 2010 00:49:00 +0800</pubDate><description><![CDATA[      模块的作用不多说，它消除了宏内核的限制，通过使用模块可以预先编译大量的驱动程序，不会使内核膨胀。同时也可以使试验性的代码打包到模块中。      初始化和清理函数      模块的初始化函数和清理函数，保存在.gnu.linkonce.module段中的module实中。根据.gnu.linkonce.module段，内核来判断二进制文件是否为模块。定义如下:     struct module __this_module     __attribute__((section(".gnu.lin]]></description><category></category></item><item><title><![CDATA[指针和数组的效率对比]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5848649</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5848649</guid><author>cha_echo</author><pubDate>Mon, 30 Aug 2010 01:16:00 +0800</pubDate><description><![CDATA[    我们知道指针表达式和下标表达式是等价的，比如:    array[10] = 10;    *(array + 10) = 10;     或者有时候我们这样写:    2[array]    但因为它表示成指针表达式为*(2 + array) ,所以这种古怪的写法和array[2]是相等的。    那么你应该用哪一个呢?     很多人会选择下标表示，我想他们更多是考虑下标的可读性和容易理解，但如果从性能上讲的话，这个选择可能会影响运行时的效率。    我们来做个实验:       1 #incl]]></description><category></category></item><item><title><![CDATA[ubuntu--qemu调试linux内核环境搭建]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5668864</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5668864</guid><author>cha_echo</author><pubDate>Sun, 13 Jun 2010 12:37:00 +0800</pubDate><description><![CDATA[<br />下载qemu源码:http://wiki.qemu.org/Download<br />我下的是qemu-0.12.4.tar.gz<br /> <br /> <br />zecho@zecho-laptop:~$ tar zxvf qemu-0.12.4.tar.gz
zecho@zecho-laptop:~$ cd qemu-0.12.4
 
<br /> <br /> <br />需要在configure之前安装几个组件<br />zecho@zecho-laptop:~$ sudo]]></description><category></category></item><item><title><![CDATA[永久地址映射]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5609375</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5609375</guid><author>cha_echo</author><pubDate>Wed, 19 May 2010 21:49:00 +0800</pubDate><description><![CDATA[首先要看几个重要的数据结构和概念：   #ifdef CONFIG_X86_PAE#define   LAST_PKMAP   512#else#define   LAST_PKMAP   1024   #define   LAST_PKMAP_MASK     (LAST_PKMAP - 1)#endif定义了永久地址映射的，页表的数量，从这里我们也可以知道，]]></description><category></category></item><item><title><![CDATA[临时地址映射]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5609367</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5609367</guid><author>cha_echo</author><pubDate>Wed, 19 May 2010 21:47:00 +0800</pubDate><description><![CDATA[如有问题，欢迎一起讨论:-) 临时地址映射了建立了compile-time特殊的虚地址，分配的虚地址是从0xfffff000向后使用 和永久地址映射不同，它可以在中断或可延迟的上下文中使用而不会睡眠，在高端内存任一页框都可以通过窗口映射到次内核地址空间 首先看一些重要的数据结构和宏定义#define   __FIXADDR_TOP   0xfffff000 ]]></description><category></category></item><item><title><![CDATA[伙伴系统算法]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5602415</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5602415</guid><author>cha_echo</author><pubDate>Tue, 18 May 2010 00:08:00 +0800</pubDate><description><![CDATA[如有问题，欢迎一起讨论:-) struct free_area{    struct list_head  free_list; /*用于连接某一大小的空闲页框*/    unsigned long    *map;    /*涉及到上面大小的位图，每两个的对象之间共享一位*/};static struct page *__rmqueue(struct zone *]]></description><category></category></item><item><title><![CDATA[bootmem]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5597937</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5597937</guid><author>cha_echo</author><pubDate>Sun, 16 May 2010 18:00:00 +0800</pubDate><description><![CDATA[如有问题，欢迎一起讨论:-)  为了对页面管理机制作初步准备，Linux使用了一种叫bootmem分配器的机制，它仅仅用在系统引导时，为整个物理内存建立一个页面位图，位图建立开始于start_pfn，即内核映像终点_end，结束是max_low_pfn，主要用来管理0-896MB的范围。目的：在这个范围有的页面可能保留，有些页面可能是空洞，要搞清楚哪些物理页面是可以动态分配的。  ]]></description><category></category></item><item><title><![CDATA[内联汇编]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5423240</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5423240</guid><author>cha_echo</author><pubDate>Sat, 27 Mar 2010 20:30:00 +0800</pubDate><description><![CDATA[      偶尔想看一下memcpy的源码，发现在linux里它是用内联汇编写的，所以就学了下，以前看linux源码时也曾碰到过很多内联汇编，但一直没有总结它的语法和使用，现在分析下，如有什么问题，欢迎留言讨论:-)      它的基本格式是:    asm("assembly code");       1、汇编指令必须在括号的引号里       2、如果有多条汇编指令，则需要用换号]]></description><category></category></item><item><title><![CDATA[ 数据类型另思]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5400592</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5400592</guid><author>cha_echo</author><pubDate>Sun, 21 Mar 2010 01:12:00 +0800</pubDate><description><![CDATA[     C语言中包括了丰富的数据类型，包括了声明中显式定义的类型和用做表达式中间类型的导出类型。例如：     int  *p, x;     *p = x;     从这里我们可以知道x的地址类型(它的左值)是一个指向整数的指针。x值的类型(它的右值)是一个整数。     C语言的类型其实可以用前缀形式表示，什么是前缀形式呢,看下面的例子：     我们用一个表达式： a ]]></description><category></category></item><item><title><![CDATA[Unsigned or Signed]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5399877</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5399877</guid><author>cha_echo</author><pubDate>Sat, 20 Mar 2010 18:55:00 +0800</pubDate><description><![CDATA[     C语言允许整数直接进行比较，对于有符合数之间进行，则会扩展小一些类型的数；对于整数之间的一个顺序是：long long > long > int > short > char;  同样的，如果是无符号数之间的运算，则会扩展小一些类型的无符号数，这种扩展也被称为0扩展(Zero extend)，但如果是有符合数和无符号之间呢，则规则就有些不确定。      unsigned int]]></description><category></category></item><item><title><![CDATA[Perl引用简单使用]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5398140</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5398140</guid><author>cha_echo</author><pubDate>Fri, 19 Mar 2010 23:47:00 +0800</pubDate><description><![CDATA[#!/usr/bin/perlmy @all_with_name;sub initialize_provisions_list{    my @skipper = qw(bule_shirt hat jacket preserver sunscreen);    my @skipper_with_name = (The Skipper, /@skipper);   ]]></description><category></category></item><item><title><![CDATA[CHAPTER 5 References and Scoping]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5394559</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5394559</guid><author>cha_echo</author><pubDate>Thu, 18 Mar 2010 23:01:00 +0800</pubDate><description><![CDATA[        我们可以像标量那样复制和传递引用。而且在任何时候，Perl都知道引用数据的数量。Perl也可以创建对匿名数据结构的引用(这种数据结构没有显式的名字)而且可以为了满足特定操作而创建引用。        数据的多个引用        在Chapter4已经探究了对数组的引用和把这种引用放到一个新的标量上        my @skipper = qw(blue_shirt ]]></description><category></category></item><item><title><![CDATA[存储管理]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5372299</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5372299</guid><author>cha_echo</author><pubDate>Fri, 12 Mar 2010 00:44:00 +0800</pubDate><description><![CDATA[       今天我们看一下lcc的存储管理，在我们写的一些复杂的程序中，都需要用到动态内存的分配，即使用malloc，但我们都知道使用malloc就需要显式的使用free来释放掉。问题是有很多程序员会忘记释放空间，造成内存泄漏。       lcc在管理内存的思想是统一释放，这主要是来自于我们常遇到的窗口，就是在你关闭窗口时，所分配的按钮，滚动条等都释放了。       lcc主要是使用]]></description><category></category></item><item><title><![CDATA[CHAPTER 3 Using Modules]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5337105</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5337105</guid><author>cha_echo</author><pubDate>Mon, 01 Mar 2010 22:30:00 +0800</pubDate><description><![CDATA[     模块是为我们的程序建立好的块.它提供了子程序，变量和面向对象的类的重用。这一节，我们既能显示了如何建立自己的模块，有能看到如何使用别人已经写好的模块.      标准模块发布     Perl已经自带了很多模块.事实上，最近发布的版本中有50+MB都是模块.1996年10月，Perl 5.003_07有98个模块.今天，也就是2006年初，Perl 5.8.8有了359个.这]]></description><category></category></item><item><title><![CDATA[CHAPTER2 Intermediate Foundations ]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5330659</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5330659</guid><author>cha_echo</author><pubDate>Fri, 26 Feb 2010 21:48:00 +0800</pubDate><description><![CDATA[     在我们开始享受这本书之前，我想介绍一些中级层次的Perl习惯用语，这些用语也将会贯穿整本书。而且它们是Perl程序员初学和进阶的分水岭。      列表操作符     你可能已经知道Perl中的几个列表操作符，但是你可能还没考虑过它们在列表中所发挥的作用。最常见的列表操作符或许就是print。我们提供给一个或多个参数，它将会把它们结合在一起.     print Two]]></description><category></category></item><item><title><![CDATA[Intermediate Perl 翻译]]></title><link>https://blog.youkuaiyun.com/cha_echo/article/details/5330632</link><guid>https://blog.youkuaiyun.com/cha_echo/article/details/5330632</guid><author>cha_echo</author><pubDate>Fri, 26 Feb 2010 21:33:00 +0800</pubDate><description><![CDATA[    Intermediate Perl一直都没有看到中文版， 在看完Learning Perl后，想去试着翻译一下Intermediate Perl，当然因为对Perl的理解还没有达到一定程度，也是觉得对其有点儿感兴趣，才决定好好去学学，如果翻译的有什么问题，非常欢迎各位Perl高手们批评指点。     Intermediate Perl 提供了对Perl中级编程的介绍，是由畅销书]]></description><category></category></item></channel></rss>