• 浅析linux2.6.24内核initrd传递给rootfs进行系统加载流程
    『转自』http://blog.chinaunix.net/u1/38994/showart_688271.html


    1.解析有loader传递过来的initrd参数
    start_kernel()->
    setup_arch()->
    parse_tags()->
    使用下面这个函数进行解析:
    static int __init parse_tag_initrd(const struct tag *tag)
    {
        printk(KERN_WARNING "ATAG_INITRD is deprecated; "
            "please update your bootloader.\n");
        phys_initrd_start = __virt_to_phys(tag->u.initrd.start);
        phys_initrd_size = tag->u.initrd.size;
        return 0;
    }
    __tagtable(ATAG_INITRD, parse_tag_initrd);

    2.进一步初始化initrd_start变量
    start_kernel()->
    setup_arch()->
    paging_init()->
    bootmem_init()->
    bootmem_init_node()->
    在该函数中使用下面2个语句将物理地址转为虚拟地址
    #ifdef CONFIG_BLK_DEV_INITRD
        ...
        initrd_start = __phys_to_virt(phys_initrd_start);
        initrd_end = initrd_start + phys_initrd_size;
        ...
    #endif
    3.建立rootfs文件系统,并mount到根目录
    start_kernel()->
    vfs_caches_init()->
    mnt_init()->
    init_rootfs()->位于fs/ramfs/inode.c中,调用register_filesystem(&rootfs_fs_type);注册rootfs
    接下来
    init_mount_tree()函数将调用mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);将rootfs挂在到/根目录下
    然后使用如下两个函数,将后边建立线程的根目录指向rootfs,
    set_fs_pwd(current->fs, ns->root, ns->root->mnt_root);
    set_fs_root(current->fs, ns->root, ns->root->mnt_root);
    4.将initrd(的ramdisk加载到rootfs
    start_kernel()->
    rest_init()->
    kernel_init()->内核线程
    do_basic_setup()->
    do_initcalls()->调用所有arch/arm/kernel/vmlinux.lds.S中定义的INITCALLS模块,比如:使用module_init内建到zImage中的所有驱动模块

    #define pure_initcall(fn)        __define_initcall("0",fn,0)
    #define core_initcall(fn)        __define_initcall("1",fn,1)
    #define core_initcall_sync(fn)        __define_initcall("1s",fn,1s)
    #define postcore_initcall(fn)        __define_initcall("2",fn,2)
    #define postcore_initcall_sync(fn)    __define_initcall("2s",fn,2s)
    #define arch_initcall(fn)        __define_initcall("3",fn,3)
    #define arch_initcall_sync(fn)        __define_initcall("3s",fn,3s)
    #define subsys_initcall(fn)        __define_initcall("4",fn,4)
    #define subsys_initcall_sync(fn)    __define_initcall("4s",fn,4s)
    #define fs_initcall(fn)            __define_initcall("5",fn,5)
    #define fs_initcall_sync(fn)        __define_initcall("5s",fn,5s)
    #define rootfs_initcall(fn)        __define_initcall("rootfs",fn,rootfs)
    #define device_initcall(fn)        __define_initcall("6",fn,6)
    #define device_initcall_sync(fn)    __define_initcall("6s",fn,6s)
    #define late_initcall(fn)        __define_initcall("7",fn,7)
    #define late_initcall_sync(fn)        __define_initcall("7s",fn,7s)

    上面我们关心的是rootfs_initcall定义,
    在init/initramfs.c中具体实现如下:
    rootfs_initcall(populate_rootfs);
    populate_rootfs()会调用下面这个函数将initrd的内容释放到rootfs文件系统下
    unpack_to_rootfs((char *)initrd_start,initrd_end - initrd_start, 0);
    这样initrd的ramdisk的内容全部释放到了rootfs文件系统中,所以ramdisk下的所有目录结构将全部被克隆到rootfs文件系统下,具体unpack_to_rootfs函数的实现流程,以后有时间再研究(gliethttp_20080514)

  • 2008-08-06

    About samba

    以下资料来自于网络 

    转自http://bbs.chinaunix.net/viewthread.php?tid=847367&extra=page%3D1
    可写不可删除的实现: 

    共享目录 To_manager   只有manager这个用户对此目录拥有完全权限。
    其它用户对此目录只有:可向其内复制并新建文件的权限。但是不能删除文件不能copy出文件,不能读文件。


    步骤:
    1。更改smb.conf 如下
    CODE:
    [To_manager]
       comment=To_manager   
       path=/To_manager
       writable=yes
       create mask =1600
       directory mask= 1600

    2。让Linux支持POSIX ACL (这个 POSIX ACL 的功能在 Linux kernel 2.6 上被正式支持,之后又被 back-port
    到 2.4 kernel 上。大家常用的档案系统,如:ext3,xfs,jfs,和 ReiserFS,都能使用
    ACL。当然,大家须要在编译 kernel 时启动 ACL。)

        我们亦可以在 /etc/fstab 中加入选项:
       /dev/sda1 /home ext3 acl 1 2
    如果对POSIX ACL 不熟悉请看http://bbs.chinaunix.net/viewthread.php?tid=760730&highlight=lovegqin

    3。写个小脚本
    CODE:
    #!/bin/bash
    mkdir /To_manager  
    chmod 777 /To_manager  
    chown manager:manager/To_manager   
    chmod o+t /To_manager   
    setfacl -m d:u:manager:rwx /To_manager   


    最后运行脚本,重启smb即可.
  • 转载自maypeng.cublog.cn

    EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。


    Linux symbol export method:

    [1] If we want export the symbol in a module, just use the EXPORT_SYMBOL(xxxx) in the C or H file.
        And compile the module by adding the compile flag -DEXPORT_SYMTAB.
        Then we can use the xxxx in the other module.


    [2] If we want export some symbol in Kernel that is not in a module such as xxxx in the /arch/ppc/fec.c.
        Firstly, define the
    xxxx
    in the fec.c;
        Secondly, make a new file which contain the "extern" define the
    xxxx(for example, extern int xxxx
    );
        Lastly, in the ppc_ksyms.c we includes the new file, and add the EXPORT_SYMBOL(
    xxxx
    ).
        Then we can use the
    xxxx.



    使用时注意事项:
    在使用EXPORT_SYMBOL 的.c文件中 需要 #include <linux/module.h> 文件。
    // 先写函数
    func_a ()
    {

    }
    //再使用EXPORT_SYMBOL
    EXPORT_SYMBOL(func_a);
    注:export出的函数必须为非static函数,且要在相应的.h文件中进行声明。
          在内核中新加入文件时,需要对相应目录下的Makefile进行更改,并且新加入的文件使用的config设置与调用函数文件的config设置同。
  •       还有几个小时就要和这个生活了6年的城市说再见了。在没上大学之前,没住过校,所以刚入学的时候尽管寝室条件不是很好,还是被这个新的集体生活所吸引。那个时候,似乎带着好奇的眼镜,对大学中的每件事情都感到新奇。

    我的过去
          刚入学的那会,辅导员就欺负我们年轻无知,把期末考试说的巨为恐怖--让我们以为考不过天都要塌了,所以一个个都做乖乖仔,考试前期拼命的复习。通宵复习的传统就是那个时候给培养起来的。昨天看了欧洲杯的半决赛,觉得再没有那份精力通宵的去干一件事,或许已经老了。
          本科的日子如流水般淌过,忽然觉得世界变得好大,比以前那个我长大的世界要大了很多。新奇的同时又感到了很多的无奈,也明白了世事不能尽随人意,但求无愧我心的道理。可理明白了,但却没有真的做到无愧我心,很多的事没有去做,很多的遗憾没有去弥补。或许这人生就是一个不断丢弃的过程,一路走一路将自己的幻想给丢掉。每个小孩都是一个天使,但是他们丢掉了幻想之后,他们就只能成为一个凡人。
          还记得金秋艺术节时郭靖的扮相,虽然演的是现代版的可总还是觉得没有找到感觉。一个人骑着车,然后在最后的关头,却不敢去牵那黄蓉的手。于是乎一语成谶,那段戏成了我6年感情生活的缩影,过于保守始终都没有学会放开自己。唯一的不同是我的生活中没有出现那黄蓉似的女主人公,能够不嫌弃我那榆木脑袋,在那微醺的午后上演一场郭黄二人相拥的感人结局。那次戏排完之后,出现了小小的意外,平生第一次感到人的愤怒是很有力量的。不过也因此获得神似基努李维斯的称赞。
          本科过后,研究生阶段并没有想象中的轻松。成堆的项目一下子压了过来,每天都几乎是围着项目转。开始迷茫,也开始思考自己的人生目标应该是什么。突然发现生活有时候是个螺旋形的阶梯,走着走着貌似回到了原点,而又和以前经过的时候有些不同。高度提升了,但最终的终点是什么还是不得而知。只是一个人在拼命的向前冲着。GRE和toefl是以前我都没想过要挑战的,感觉很有成就感,但也有些不值。因为自己做这些事情的时候都是处在一种无意识的状态,还是不知道自己的目标是什么。

    那么未来又是什么呢?
          其实这个命题对于我还说还是难以回答。未来是不确定性的总和,所有的可能。如果上帝是未来的话,那么我会相信的。薛定谔的猫肯定也会同意我的观点。有句话我一直以来很欣赏--在这个社会里,个人得成为自己的教士。不仅如此,由于虔敬的核心意义和持久性,个人还得做自己的诗人、自己的哲学家、自己的君王、自己的人格大教堂的首席建筑师。也许人的终极目标就是让自己成为一个最令自己满意的作品,或许这有些自恋的意味,但实不为过。
          恩,该打理好包裹上路了,朝着未来之路。

    ---May be I don't know the final place to go, but I have my belif.

  • 如果4辆521在鲁巷广场作环形运动,那么中间会形成一个时空隧道.....

          偶在武汉上了四年学,呆了这么长时间,感觉很多方面武汉跟北京无法比,比如城市建设,素质等等,但是有一个方面是很让北京羡慕的,那就是武汉公共交通的快!偶到北京,尤其是看到北京交通的堵后,偶更是怀念啊。。。。。。

          坐公共汽车521,追前面另外一个521,那个速度啊,当时有人提醒要注意安全,结果司机一 句话,我们全部不言语了, “前头那个都不怕死,老子怕个莫斯……” 当年朱容基来武汉考察,似做公交车,深有感触的说:武汉最有特色的就是公交司机的技术世界超一流!顺便来解释哈什么叫:甩盘子。甩盘子就是后面的车以大于 45度的角度岔到前面的车的前面,用车尾压住车头,因为要大幅度的转方向盘,所以叫甩盘子。被甩盘子的公汽一般都要急刹,不刹铁闯。

          521是多么的生猛和膘悍,不知道大家听说过关于521的这两个神话没有。一个是有一次521司机飚车的时候车轮起火了,另一个是521刹车的时候一个乘客把那根直的铁扶手拉弯了……

          每每跟同学说起,同学就会跟我说他们坐在521上面看着521一辆一辆地超Taxi时的壮观,想着1.2¥换来如此超值的服务是多么的爽。有一次我有一个武汉的同学说:“521超TAXI那算不了什么壮观,壮观的是521超521!!”

          后来有人评论:要想不迟到,请坐521!

          我大一刚来的时候,第一次和同学出去玩坐的就是521,结果一开始我就从座位上摔下来了!

          车轮起火偶倒是碰见过,而且是在后车轮那次,真的好怕怕啊。

          太agree了,521超521,那就是极品飞车的感觉。就像警匪片里拍的那样。。。

          感觉和坐喷气式飞机一样。。。

          绝对正确,曾经坐过一趟521,连着超过了两辆521。。。

          还有一次竟然有个人胆敢在两辆521之间想穿过马路,其胆量着实惊人!

          我们曾经讨论过请521司机组成一个方程式车队的可能性,最后的结论就是,进入三甲应该没问题的。我觉得舒马赫退役之后,来武汉开521是一个不错的选择。不过,肯定不能像他在F1赛场上那样风光无限了。武汉公交车司机里高手如云哪。以前听别人在外面吹牛,问:你做什么的
          答:我******在武汉开公交的
          旁人一阵羡慕的眼光……
     
          武汉的521是“公路上的F1“
     
          有次坐521,遇到一个强人,坐在最后一排最中间,面朝车内的走道,没有扶手可扶……一刹车,他顺着走道滚到汽缸盖那边去了。521,喜欢武汉的理由!
     
          过两天再坐坐521去,好久没体验,生活都没激情了,光是看着521跑,那激情都很澎湃了,呵呵
          呵呵,打住打住,我要说的是,如果大家去武汉玩,我请大家坐521,哈哈
          另:要说最快,建议你们去坐576从中华路到华农,在街道口就可以搭那才叫。。。
     
          有一次擂到树了,树把车身劈成两半两米多啊!

          521路 中华路→司门口→胭脂路→小东门→中南路→傅家坡→洪山→街道口→广埠屯(偶学校门口)→卓刀泉→马家庄→吴家湾→鲁巷→关山口→关山。就在今天,我坐552路去医学院那边找同学。车开动后就觉得有点不对劲,到了小洪山站就没停,过了一会到了八一路,总算停了。但那司机竟对着正要上车的乘客大喊:“快点上,我要赛车!!”我一下子大惊,只见后面竟然紧跟着一辆552。说时迟那时快,那辆552不等我乘的这辆发动已经超了过去!!司机火了,加大油门一路狂追,连过十字街也大概保持时速30公里,惊得路人抱头逃命。只见两辆552,一前一后,奔驰在发烫的柏油路面上,简直太精彩了!!等到水果湖的时候,司机身上已经脱得只剩下一条短裤,所有的乘客都在注视着自己车的司机和前面那辆552。终于刚过水果湖不久,在下坐的这辆552 终于超过了前面那辆,中间两车还对飚了大约30秒。在这30秒中,两位司机还不忘用语言来刺激对手,甚至还有手势。在超车的那一刹那,全车竟然起声叫好(我也发出了一点鼓励的声音)。真可谓武汉公交激情一飚。
          我在武汉的时候,有个司机号称要把汽车开得和飞机一样快,偶不信。结果他做到了,而且边开边吃饭。。。然后偶就不坐公交了,好像是502的说。。。 
          那算什么啊……上次我在街上看见两个公交给一个民工挤到了两个车中间,居然一动都不能动卡在那里。而且哦!那个男的虽然被挤着,但是没有事情!结果派了一个车过去把两个公交分开才给那个男叻救出来。卡牛b了。
          超刺激的说~~~~~~
          从此服了武汉公交。。。
          惊险啊
          还有去武汉港的502
     
          那个去火车站的偶忘记是多少的了~~ 
          终身难忘~
          从余家头到武昌火车站————15分
          狂飙的啊~~
          寒!!!!

  • 等待是灰色的指环,
    在无声中延续着寂寞;
    麻木是幸福的背景,
    在觉醒后伴随着窃笑。

    如果有天,
    我能再看到蓝色,
    便能回想起彩虹的模样。

    如果有天,
    我能再看到黎明,
    便能回想起企盼的夜晚。

    如果有天,
    我能再看到绿叶,
    便能回想起秋天的朝霞。

    如果有天,
    我能再看到湖面,
    便能回想起自己的微笑。

    最后我找到了遗失的翅膀,
    却发现空间里再没有光亮。
    那曾有过阳光的惟一出口,
    被时间的痕迹抹去了信仰。

    于是我头朝地上,
    努力回想温暖来时的方向。
    于是我挥动翅膀,
    想要挣开束缚自由飞翔。

    终于我又看到了光亮,
    光亮是我炽烈的等待。
    终于我又看到了朝阳,
    朝阳是我燃烧的希望。

  • 2008-06-10

    无题

    有的时候很无奈,有的时候也确实无法控制,在每个需要的时候都会想要去。。。便便

  •       有首歌叫可不可以不勇敢,有的时候真想好好的放纵自己,想不再变得勇敢。恣意的奔跑在原野之中,而不必顾及所有。毫无顾忌的追求未来也许很潇洒吧,那没有丝毫羁绊的感觉。
          但是现实总不是让人由着自己的性子做出自己想做的事情。我曾经想也许只要有愿望,这个世界就会立刻来倾听,然而等待换来的是暴风骤雨而不是那和煦的微风。我知道为什么,但只不过不愿意去承认。这个世界的规则不是由美好的愿望支撑起来的,一个人的想法代表不了一切。
          有句话叫做阳光总在风雨后。彩虹是要经历过黑云压顶暴雨倾城之后才会挂在天边的一角,淡淡的或许不经意间就将其忽略。试问如何才能有勇气去穿过那无边的黑暗?良好的愿望还是一厢情愿的臆想?或许人生需要彪悍的态度才能最终鼓起迈出第一步的勇气,坚持走完看起来处于无尽黑夜中的漫漫长路。
          安迪说过,男孩都要游过一个湖,到达彼岸才能真正的成长起来。变得更加勇敢,更加彪悍,也更坚强的面对明天的风雨。

  • 2008-06-02

    最后一课 - [生活]

          答辩就那样悄无声息的结束了。虽然有很多的期待,但最后属于自己的也只是台上的那十几分钟。眩目的一瞬过去,随即归于平静。百无聊赖之中摆弄着自己的手机,只是渴望着一整天的答辩能够快点结束。
          结果不是很出人意料,但自认为已经达到了自己的目的,也就心也释然。所谓把目标和外界的评价结合在一起是最好不过,但如果能够完成最初的梦想也是一件乐事。华灯初上,几个人慢慢的踱步,差不多已经到寝室的门口,却突然接到老板的电话。说是要再回实验室一趟,貌似有什么重要的事情要宣布。
          顿时好心情被打散,肚子饿得直抗议,但还是不得不硬着头皮,勒紧腰间的皮带,撑着回到了实验室。一路上直嘀咕,也不知道老板的葫芦里卖的是啥药。在实验室左等右等不见老板,为了打发时间,我们几个打起了传说中的DotA。也许是长期脱离魔兽界了,对于最新的潮流已是极不敏感,汗自己一个。正当打得兴高采烈之际,老板驾到。于是我们的面前的屏幕也都默契的切换到桌面。
          几句话过后,老板突然对一张纸条非常之关心。在我们说可能被丢到垃圾桶之后,他还契而不舍的让我们翻垃圾桶去。。。于是乎,我对这张纸条产生了强烈的好奇,不过是张废纸,有那重要,莫非是在那上面写了银行密码?不过话说归说,几个苦心之人还是在垃圾桶的层层废纸下找到了那已经遍体鳞伤的纸条兄弟。老板接过我们抢救之后的纸条兄弟之后,低沉了一会,然后扬起那纸条问偶们知不知道为什么他一定要找到它,有没发现那纸条有什么不对劲的地方。
          大伙面面相觑,更加迷糊了。于是乎老板娓娓道来他的原因。那张纸条其实是我们昨天贴在会议室门上用来占位的封条。在匆忙之中,我们只写了明天那个实验室将有人答辩,但没有具体写哪个老师。老板估计一看就火了,万一别人也是答辩,那岂不是这个纸条写废了。没有指明老师,不管是出于误解还是故意,都可以直接去占据会议室,原来的答辩计划也就全部泡汤。
          对于老板,其实我一直不太懂。不过谁又能真正的懂得另外一个人呢?但他给我们讲的这番话,无疑是在我们走向社会之前给我们的最后一课。任何时候都要考虑全面,如果不能仅仅认为事情已经做到最好,就不愿意继续付出努力的话,仅仅只会让别人去钻我们留下的空子,让竞争者感到快意。不能为自己的无知找借口,也不要因为太懒而不愿意继续。事情永远不会达到完美,但是事情会因为坚持而缺憾更少。

          师者传道,老板给我们指明了前进的道路。但究竟该如何去做,也许只有经历过社会的洗礼,才能更理解他。

          放下过去,轻装前行。

  • 2008-05-31

    【转】成熟 - [杂谈]

        不要因为小小的挫折而灰心丧气

      1、切勿沉溺于以往的失败中。容易遭受失败的人在性格上有一个共同的弱点,就是对琐事都极为敏感,遇到小小的挫折便产生强烈的反应,甚至得出极端的结论。

      2、切勿以偏概全。容易陷入抑郁状态的人对事物的解释常有一定的模式,就是将所有不快的原因归咎于自己的本身,归咎于自己的错误。

      消除自我能力不足的疑虑

      1、克服“升迁”后遗症

      2、重视自己。任何人在人生舞台上都是最优秀的演员。

      从崭新的角度去思考自己的弱点

      1、切勿歪曲事实。事实不会对我们的心理造成不良影响,而我们对事实的解释却往往形成不可磨灭的阴影。由此可见,一个最大的敌人不是别的,正是他自己。

      2、能接受真实的自我,就能保持内心的平衡。有自知之明的人,与自卑的人是不同的。

      不要隐瞒真相

      1、不成熟的人容易掩饰自己的真实面貌。隐瞒真相只会使原本微不足道的小事变得严重。

      2、隐瞒真相可能导致两种不良的结果,一是觉得欺骗了他人,因而愧对他人;二是加重了自卑感,因而愧对自己。

      3、切勿妄自菲薄。痛苦都是自找的。

      与其非难他人不如改变自我

      1、诽谤他人毫无益处。一味地责难他人、诽谤他人究竟有什么好处呢?充其量只是获得暂时的满足,而且是一种空虚的、虚幻的满足。而为了这暂时的、空虚的满足,你必须付出极大的代价,包括不再激励自己奋发向上和损害良好的人际关系。

      2、越不想改变自我的人越会责难自己。

      做自己的主人

      1、不要为他人所左右。经常为他人所左右的人心中充满了恐惧,进而坐立不安。这种人必定是一个失败者,因为他们无法做自己的主人。

      2、要敢于说“不”。

      3、不要怀有罪恶感。应该高兴、快乐时却产生罪恶感,一定是因为自己的观念有所扭曲,这种人经常对他人的要求产生不必要的责任感。