Jun 6

推荐阅读的两篇文章 不指定

felix021 @ 2009-6-6 00:22 [IT » 操作系统] 评论(0) , 引用(0) , 阅读(4426) | Via 本站原创
1. c函数调用约定
http://blog.csdn.net/andylin02/archive/2009/04/30/4139410.aspx

对一个函数 int func(int a, int b); 当执行 func(1, 2) 的时候,它的栈结构是怎样的?
这是tx一面的时候的一个问题,我答错了。
正确的答案是:
  push 2      第二个参数入栈
  push 1      第一个参数入栈
  call function  调用参数,注意此时自动把cs:eip入栈; 如果是近程调用,那么CS是不需要入栈的。
此外,对于函数的返回是如何约定的,printf() 的不定参数列表的实现是基于什么方式。。。
详细看看这篇文章,很有收获。


2. 如果你是编程新手,你确信对系统栈结构有所了解吗?
http://blog.csdn.net/andylin02/archive/2009/04/30/4139409.aspx

和上一篇文章内容接近,或者解释更清晰一些 :)
May 27
话说今晚用visio 2007画张图,看那两本书看得我是死去活来啊(就是说半途睡着了一次)
一本是《深入理解Linux内核》,一本是《深入理解Linux虚拟内存管理》,书名都差不多,内容也差不多郁闷。

最后理出来这些东西凑进了图里:
init_tast, double circular linked list, process descriptor, mm_struct, pgd, pt, page ...

点击在新窗口中浏览此图片
May 20

新进展:init_task 不指定

felix021 @ 2009-5-20 16:35 [IT » 操作系统] 评论(1) , 引用(0) , 阅读(8773) | Via 本站原创
XenLab项目里我这一块有了新进展:从System.map里面找到了init_task的虚拟地址。

简而言之,init_task就是linux的第一个进程,在载入init以后,它就进入一个无限循环,然后就变成传说中的idle进程。
更详细的内容参考《深入理解Linux内核》等相关资料。

当然,init_task的地址本来是不用费心去找的,如果你写一个内核模块,这个符号是可以直接引用的:
struct task_struct *task = &init_task;

但是我的目标是:从“Linux外”找到这个init_task的地址
因为我是要从Xen虚拟机的Dom0(类似宿主机的概念)去入侵DomU(类似客户机的概念)
找到init_task以后,我们就可以遍历Linux中的所有进程,然后就可以做一些ooxx的事情了。

因为宿主机是无法直接调用客户机的API,自然无法通过上述方式获得init_task地址。
本来是想通过某种方式直接从DomU中找出这个地址,但是毫无头绪
后来发现System.map可以挖出这个地址,虽然这个方法很挫,但是起码可以进行下一步的动作了。
May 13

Ubuntu 9.04入门小结 不指定

felix021 @ 2009-5-13 13:05 [IT » 操作系统] 评论(1) , 引用(0) , 阅读(8650) | Via 本站原创
预计覆盖以下内容:
1。安装基本知识
2。添加源(教育网and电信)
3。完整的中文语言支持(输入法)
4。apt-get基本知识
5。root用户相关
6。nVidia显卡驱动
7。引导相关(Grub,Windows,修复,单用户模式)
8。多媒体相关
9。常用软件推荐

另,发现一篇更全的东西:速配指南
http://wiki.ubuntu.org.cn/index.php?title=%E9%80%9F%E9%85%8D%E6%8C%87%E5%8D%97&variant=zh-cn

-----华丽的分割线-----
Mar 22
看了一个帖子,讨论这个问题的
URL: http://bbs.chinaunix.net/archiver/?tid-1399973.html

第一页4L的说法是正确的,那些的确是滥用管道,不过这个问题放到后面讨论。

感觉第一页末尾beginner-bj的测试方法不很对头,于是自己写了个小程序测试一下:
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char * argv[]){
    char cmd[1024];
    if(argc < 3) {
        printf("Not Enough Parameters.\n");
        return 1;
    }
    int a, b;
    sscanf(argv[1], "%d", &a);
    sscanf(argv[2], "%d", &b);
    sprintf(cmd, "sleep %d | sleep %d", a, b);
    system(cmd);
    return 0;
}


测试结果如下:
引用
felix021@felix021-laptop:~/code$ g++ a.cpp
felix021@felix021-laptop:~/code$ ./a.out 1 2
felix021@felix021-laptop:~/code$ time ./a.out 2 2

real  0m2.035s
user  0m0.000s
sys  0m0.020s
felix021@felix021-laptop:~/code$ time ./a.out 2 3

real  0m3.039s
user  0m0.012s
sys  0m0.016s
felix021@felix021-laptop:~/code$ time ./a.out 4 3

real  0m4.020s
user  0m0.016s
sys  0m0.004s
felix021@felix021-laptop:~/code$ time ./a.out 6 3

real  0m6.034s
user  0m0.004s
sys  0m0.020s


看来管道两头确实是协同工作的(从管道的原理也可以推知)
一头写,一头读,同时处理,这样可以提高CPU的利用率,特别是在多CPU的时候
不过总体来说,我想应该是会多占用一些CPU(进程之间的切换什么的?)。


然后关注一下滥用管道的问题,这个直接引用第二页某楼的vbs100童鞋的大作,应该可以说明问题了:
引用
正确的是
$ grep 'some word' urfile
但是更方便的是
$ <urfile grep 'some word'
这样可方便改 grep 的参数

还有经常用的
$ cat urfile | grep 'some word' | wc -l
其实直接可以用
$ <urfile grep -c 'some word'
Mar 4
ooxx的X3100阿,死活不肯就范。
在Fedora8下面,虽然可以进入X,但是有个ooxx的SELinux,烦死人。
打开包管理器,卸载SELinux,爽,顺便把什么东西都卸掉了, ls 和 init 都不行了,sigh。强制关机。

正好,张文那里用着Debian5,在Dom0下正常。
于是把vmlinuz、initrd、/usr/src/ooxx、/lib/modules/ooxx拷过来
apt-get安装了一个 ubuntu-xen-desktop
然后在/boot/grub/menu.lst里面加了一个title,kernel ,module,module。。。
然后启动:找不到这个和那个。囧。
然后发现是在module /boot/vmlinuz那个地方忘了加上内核参数,没有root=ooxx  =.=
好吧,root=/dev/sda3
启动,哦也,进入了XWindow!声音 网卡都正常,但是Atheros的无线网卡不对劲。
于是重新编译madwifi,make、make install、modprobe ath_pci,重启,还是不行=.=
找了跟网线插上去,也不能上网:网卡被当成网桥了。
brctl delif还是brctl delbr来着,反正删掉了个什么东西,剩下一个peth0,就可以上网了,嗯。

$ xm list
看到dom0,哦也。

然后开始整domU,上网找到一个脚本超赞的,指定一个分区,或者一个文件
它可以自动从源里面下载东西,制作好一个完整的可以作为的domU跑的分区。大约需要400MB空间。

$ dd if=/dev/zero of=ooxx.img bs=1M count=1 seek=1024  #创建一个镜像,当然你也可以用分区,就免掉这一步
$ mkubuntu.sh ooxx.img
等那么一段时间,然后就OK了

然后把脚本输出的东东存为一个xen的配置文件,比如ubuntu.xenrc

$ xm create -c ubuntu.xenrc

然后就看到启动信息拉~
Feb 19
发现以前在Linux下C编程入门里面看到的创建守护进程的办法不够完整,导致做好的东东在路由器的MIPS版Linux下面不能正常在后台运行,一旦退出telnet,进程也就跟着结束了。于是参考这篇文章做出了一个完整的版本,哦也!

zz from http://dev.csdn.net/article/42/42281.shtm

Linux 守护进程的编程方法

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。
守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同 Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。

一. 守护进程及其特性
Feb 16
@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
      -i[SUFFIX], --in-place[=SUFFIX]
              edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容

======以前的分割线======

要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect

搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。

解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;

哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;

嘿,这下爽了!
Tags: ,
分页: 6/18 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]