驽马十驾

给我智慧,让我知道我真正的利益所在; 给我坚定的意志,让我能够按照智慧的引导行事
随笔 - 10, 文章 - 1, 评论 - 1, 引用 - 0
数据加载中……

2009年6月29日

scull例子程序,释放不了设备编号

#include #include dev_t scull_dev; int scull_major; int scull_minor; static int scull_init(void) { int ret = 0; ret = alloc_chrdev_region(&scull_dev, 0, 1,"scull"); if(ret){ printk(KERN_WARNING "error"); return ret; } scull_major = MAJOR(scull_dev); scull_minor = MINOR(scull_dev); printk(KERN_WARNING "alloc chrdev region %d %d", scull_major, scull_minor); return 0; } static void scull_exit(void) { printk(KERN_WARNING "unregister chrdev region %d %d",MAJOR(scull_dev),MINOR(scull_dev)); unregister_chrdev_region(scull_dev,0); } module_init(scull_init); module_exit(scull_exit); 卸载了模块后,cat /proc/devices 发现还有scull。 unregister_chrdev_region(scull_dev,0); <---------- 0改成1

posted @ 2009-06-29 17:41 驽马 阅读(181) | 评论 (0)编辑 收藏

scull例子程序,释放不了设备编号

     摘要:   阅读全文

posted @ 2009-06-29 17:41 驽马 阅读(142) | 评论 (0)编辑 收藏

2009年4月11日

夜深了,,胡乱写,,

CPU设计方面知识,晚上逛一下有名技术BBS,谈CPU的,我懂的有限.寒!!!!
操作系统linux vxworks 工作中用vxworks,我从没有学习一下,总认为linux更高级.#_#矬!!

通讯协议 TCP 也许仔细看一下,从中借鉴一点能找到板间通讯优化的地方.

昨晚于女士让我媳妇帮她刷网站,我便写了一个perl脚本 刷网站的程序,比较有意思,进一步可以做一个灌水机,
perl VS python  支持者 就如 emacs VS vi, 间的口水战,
我喜欢emacs,但是讨厌它的庞大.
我喜欢perl,但是它有点丑.不过python的缩进,让我感觉不舒服,

今天工作中perl写了一个上传设备版本大包的脚本,明天把telnet加上,自动telent到设备上,自动设置一下,重启
^_^,have fun. 脚本之王


上个星期六刚学习了一点powerPC的调用栈,昨天晚上就用上了,呵呵,我们的任务有被别人搞异常了,经过反汇编函数
查看异常调用栈,可以看到寄存器r31,由于我们任务调用过的产品的函数栈写越界,导致他们保存的r31,被改写,最后我们的任务,
试用写一个指令地址,结果异常了,呵呵,还好,被我看出来.不然有要背黑锅了.

苹果macOS决定采用intel芯片了,那powerPC的路有窄了,不管至少目前工作用了,学了可以提高效率,早点回家.

.....向费曼学习..freynman.



11点计划,继续,今天昨天都严重违规了.严重影响思考问题......睡觉. ....

posted @ 2009-04-11 01:26 驽马 阅读(240) | 评论 (0)编辑 收藏

2009年2月5日

linux日常应用记录

浏览器最快的 dillo,使用yum安装的,支持汉字. 有的网页解释不了,使用opera,firefox太慢
邮件客户端thunderbird
要修改所有用户的PATH值,您可以以root身份编辑/etc/profile文件,修改其中包含“PATH=”的一行。
例如,您可以使用pico编辑器打开/etc/profile文件。
etc/profile 最后加入 PATH="$PATH:/usr/X11R6/bin:." export PATH 只有在用户重新注册后,PATH的新值才会生效。
如果只是要修改某一个用户的PATH值,就应该编辑该用户主目录中的.bash-profile文件。如果您想将当前目录加入到PATH中,则将“.”加入PATH中,此时PATH的设定如下: PATH="$PATH:/usr/X11R6/bin:." export PATH

posted @ 2009-02-05 22:37 驽马 阅读(193) | 评论 (0)编辑 收藏

2009年2月1日

__copy_user宏分析(转)

 

__copy_user
宏__copy_user在include/asm-i386/uaccess.h中定义,是作为从用户空间和内核空间进行内存复制的关键。这个宏扩展为汇编后如下:
000 #define __copy_user(to,from,size)
001 do {
002 int __d0, __d1;
003 __asm__ __volatile__(
004 "0: rep; movsl\n"
005 " movl %3,%0\n"
006 "1: rep; movsb\n"
007 "2:\n"
008 ".section .fixup,\"ax\"\n"
009 "3: lea 0(%3,%0,4),%0\n"
010 " jmp 2b\n"
011 ".previous\n"
012 ".section __ex_table,\"a\"\n"
013 " .align 4\n"
014 " .long 0b,3b\n"
015 " .long 1b,2b\n"
016 ".previous"
017 : "=&c"(size), "=&D" (__d0), "=&S" (__d1)
018 : "r"(size & 3), "0"(size / 4), "1"(to), "2"(from)
019 : "memory");
020 } while (0)
这段代码的主要操作就是004-007行,它的主要功能是将from处长度为size的数据复制到to处。
看这段代码之前,先看看它的约束条件:
017 : "=&c"(size), "=&D" (__d0), "=&S" (__d1)
018 : "r"(size & 3), "0"(size / 4), "1"(to), "2"(from)
019 : "memory");
017是输出部,根据描述可知size保存在ecx中,__d0保存在DI中,__d1保存在SI中。
018是输入部,根据描述可知size/4(即size除以4后的整数部分)保存在ecx中,size&3(即size除以4的余数部分)随便保存在某一个寄存器中,to保存在DI中,from保存在SI中。
然后再反过头来看004-007行,就明白了:
004行:将size/4个4字节从from复制到to。为了提高速度,这里使用的是movsl,所以对size也要处理一下。
005行:将size&3,即size/4后余下的余数,复制到ecx中。
006行:根据ecx中的数量,从from复制数据到to,这里使用的是movsb。
007行:代码结束。
到这里,复制就结束了。
但是实际上没有这么简单,因为还可能发生复制不成功的现象,所以008-016行的代码都是进行此类处理的。
内核提供了一个意外表,它的每一项的结构是(x,y),即如果在地址x上发生了错误,那么就跳转到地址y处,这里行012-015就是利用了这个机制在编译时声明了两个表项。将这几行代码说明如下:
012行:声明以下内容属于段__ex_table。
013行:声明此处内容4字节对齐。
014行:声明第一个意外表项,即如果在标志0处出错,就跳转到标志3处(.section .fixup段中)。
015行:声明第二个意外表项,即如果在标志1处出错,就跳转到标志2处(.section .text段中)。
上面之所以要在标志后面加上b,是因为引用之前的代码,如果要引用之后的代码就加f。
这里对size的操作约定是:如果复制失败,则size中保留的是还没有复制完的数据字节数。
由于复制数据的代码只有4行,其中可能出现问题的就是004和006行。从上面的异常表可以看出,内核的处理策略是:
(1) 如果在0处出错,那么这时没有复制完的字节数就是ecx中剩余的数字乘以4加上先前size除以4以后的那个余数。009行代码即完成此任务,“lea 0(%3,%0,4),%0”即计算“%ecx = (size % 4) + %ecx * 4”,并将这个数值赋值给返回C代码的size中。
(2)如果在1处出现错误,那么由于之前ecx中的size/4个字节都已经复制成功了,所以只需要将保存在任意一个寄存器中的size/4的余数赋值给size返回。
从汇编代码中可以看到,009行的异常处理代码被编译到一个叫做fixup的段中。
可见这段代码的本质就是从from复制数据到to,并对两处可能出现错误的地方进行简单的异常处理——返回未复制的字节数。
注意:
(1).section .fixup,"ax";.section __ex_table,"a";
将这两个.section和.previous中间的代码汇编到各自定义的段中,然后跳回去,将这之后的的代码汇编到.text段中,也就是自定义段之前的段。.section和.previous必须配套使用。
(2)例子中__ex_table异常表的安排在用户空间是不会得到执行的,它只在内核中有效。
(3) 将.fixup段和.text段独立开来的目的是为了提高CPU流水线的利用率。熟悉体系结构的读者应该知道,当前的CPU引入了流水线技术来加快指令的 执行,即在执行当前指令的同时,要将下面的一条甚至多条指令预取到流水线中。这种技术在面对程序执行分支的时候遇到了问题:如果预取的指令并不是程序下一 步要执行的分支,那么流水线中的所有指令都要被排空,这对系统的性能会产生一定的影响。在我们的这个程序中,如果将.fixup段的指令安排在正常执行 的.text段中,当程序执行到前面的指令时,这几条很少执行的指令会被预取到流水线中,正常的执行必然会引起流水线的排空操作,这显然会降低整个系统的 性能。

posted @ 2009-02-01 11:25 驽马 阅读(611) | 评论 (1)编辑 收藏

2009年1月31日

新年开始,做小操作系统项目,推动自己的学习

目标:
简单的多进程
简单的内存管理
简单的文件系统

把自己学习linux的心得都写进去,来推动自己的学习.
时间:一年

posted @ 2009-01-31 21:58 驽马 阅读(167) | 评论 (0)编辑 收藏

2009年1月18日

perl写刷火车票的小程序,有空完善一下

  use Encode;
  use LWP::Simple;

  sub URLEncode {
    my $theURL = $_[0];
    my $MetaChars = quotemeta( ';,/?\|=+)(*&^%$#@!~`:');
    $theURL =~ s/([$MetaChars\"\'\x80-\xFF])/"%" . uc(sprintf("%2.2x",         ord($1)))/eg;
    $theURL =~ s/ /\+/g;
    return $theURL;
  }
  my $start = '北京';
  my $dest = '莱阳';
  my $date = '2009-1-18';
  my $url = 'http://www.huochepiao.com/City/Search.asp?leixing=' .
              URLEncode('转让'). '&chufa=' . URLEncode($start) . '&daoda=' . URLEncode($dest);
  #print $url;

  my %result=();


  #print $content;
while(1)
{
  my $content = get $url;
  die "Couldn't get $url" unless defined $content;
  while($content =~ /href=([^ ]*htm)\s*target=_blank>[^<]*$start-$dest[^<]*$date<\/a>/g )
  {
     my $info="";
     my $inurl = $1;
     if(!defined($result{$1})) {
       print $1 . "\n";
       my $content2 = get $1;
       #print $content2;
       $content2 =~ /车 次:\s*<a href=[^>]*><b>([^><]*)/;
       $info .= "车次: $1\n";
       $content2 =~ /席 别:\s*([^<]*)<br>/;
       $info .= "席 别:$1\n";
       $content2 =~ /始发站:\s*([^<]*)<br>/;
       $info .= "始发站:$1\n";
       $content2 =~ /到达站:\s*([^<]*)<br>/;
       $info .= "到达站:$1\n";
       $content2 =~ /发布时间:\s*([^<]*)<\/TD>/;
       $info .= "发布时间:$1\n";
       $content2 =~ /发布人:\s*([^<]*)<a href="[^<>]*">/;
       $info .= "发布人:$1\n";
       $content2 =~ /电 话:\s*<a href="[^<>]*">([^<]*)<\/a>/;
       $info .= "电话:$1 \n";
       print $info;
       print "-------------------\n";
       $result{$inurl} = $info;
     }
  }
  print "\n";
 }

posted @ 2009-01-18 23:23 驽马 阅读(429) | 评论 (0)编辑 收藏

2009年1月7日

最近用perl做小工具的笔记

1、汉字问题:
如用下面小程序,来说明三点。

use Tk;
use Tk::PathEntry;
use Cwd;
use Encode;
use encoding "gbk";  ##这一句消除TK的乱码
$path = cwd();
$mw = MainWindow->new();
$mw->geometry( '300x80' );
$mw->resizable( 0, 0 );
$mw->PathEntry( -textvariable=>\$path )->pack;
$mw->Label( -textvariable=>\$path, -foreground=>'blue' )->pack;
$mw->Button( -text=>'Quit', -command=>
    sub{ check($path);} )->pack;


sub check($)
{
  $s = shift;
  $s = encode('gbk',$s); ####将从输入窗口获取的字串,编码为gbk,否则后续 -e判断失效
  if(-e $s)
  {
     print "exist\n";
     open FILE, "$s" or die "can not open\n";
     my $line;
     while($line=<FILE>)
     {
        print decode('gbk',$line); #####将从文件读取的文本,用gbk解码
     }
     close FILE;
  }
  else
  {
     print "no exist\n";
  }
}
MainLoop;

出现过Wide character in print at 2.pl line 19

utf8编码字串 --(作为字节流)--> perl不知道它是什么编码 ---> decode ('utf8',$s) ---> perl知道他是utf8编码了,并将其转换为对应的unicode(两个字节)来操作(但实际存储的时候仍是utf8编码)

之所以会出现 Wide character in print at 2.pl line 19. 这样的结果,是因为perl知道你输出的变量字符串是utf8编码的多字节字符,你应该通过encode函数将该变量转换成字节流encode('gbk',$s); ,这样perl就不会出现这个警告

综上,可以知道,perl对待外来的数据一律当作字节流处理,通过 decode 函数可以告诉 perl 当前字节流是什么编码,这时 perl 就会把他按照原来对应的编码方式内部解码为 unicode 来操作(此时这串字节流已经被perl当作是有一定意义的unicode字符串来理解了),当你要将操作完的字符串输出的时候,应该将其用encode函数按照相应的编码方式打包成字节流再输出.

2、创建一个新进程:
use Win32::Process;
use Win32;


my $isAgent = $ARGV[0];
print $isAgent;
sub ErrorReport{
  print Win32::FormatMessage( Win32::GetLastError() );
}

if(defined($isAgent))
{
  print "i am agent \n";
  exit(0);
}
else
{
  #Win32::Process::Create($ProcessObj,"notepad.exe", "notepad", 0,DETACHED_PROCESS, ".")
  Win32::Process::Create($ProcessObj,"C:\\Perl\\bin\\perl.exe", "perl process.pl yu", 0,DETACHED_PROCESS, ".")
    || die ErrorReport();
  print "perl process has started\n";
  print "The exit code is:",$ProcessObj->GetExitCode($ExitCode),"\n";
}

3、进程间通讯:
使用Win32::MMF和Win32::MMF::shareable简单方便,之前使用Open2效果很不好。

posted @ 2009-01-07 23:01 驽马 阅读(595) | 评论 (0)编辑 收藏

2008年11月15日

在Fedora 9下安装FCITX输入法

在Fedora 9下安装FCITX输入法
一、下载;
 源码包: fcitx-3.2-050827.tar.bz2 RPM 包:
  fcitx-3.2.050827-fc4.noarch.rpm 请到 http://www.fcitx.org 下载区下载;
或者 http://mirrors.redv.com/fcitx/下载:
 二、安装 fcitx,二选其一;
 1、RPM包的安装; [root@localhost beinan]# rpm -ivh fcitx-3.2.050827-fc4.noarch.rpm 配置请看第三点;
2、源码包的安装;
[root@localhost beinan]# tar jxvf fcitx-3.2-050827.tar.bz2
[root@localhost beinan]# cd fcitx
[root@localhost fcitx-3.1.1]# ./configure
[root@localhost fcitx-3.1.1]# make [root@localhost fcitx-3.1.1]# make install
三、Fcitx 3.x的配置;
让fcitx 进入桌面自动运行;方法有二;
方法一:
请在 /etc/X11/xinit/xinput.d/ 目录中查看文件zh_CN ,
如果没有就建一个;把里面的内容改为如下的;
XIM=fcitx XIM_PROGRAM=fcitx
GTK_IM_MODULE=fcitx gnome-im-settings-daemon >/dev/null
方法二: 在$HOME/.xinput.d/里建立文件zh_CN,包含下面内容, 就可以了;
XIM=fcitx
XIM_PROGRAM=fcitx
GTK_IM_MODULE=fcitx
XMODIFIERS="@im=fcitx"
gnome-im-settings-daemon >/dev/null
如果当前用户目录下没有 .xinput.d目录,就建一个。
然后再建一个zh_CN的文件,内容就是上面的那段。
[root@localhost beinan]# mkdir ~/.xinput.d
这样就差不多能用起来了。直接运行一下命令;
[root@localhost beinan]# fcitx
如果不能使用fcitx ,可能得设置设置一下变量;
还得设置一下当前用户的环境变量,也就是在你想用的那个用户的家目录下的 .bashrc 文件。 .
bashrc这个文件是隐藏的,你可以用 vi 或者gedit编辑都行。
看你习惯吧。 在里面加两行,如下:
export LC_CTYPE="zh_CN"
export XMODIFIERS="@im=fcitx"
注意保存一下,否则不起做用;
我是刚安装好的系统,一切都是新的,看一下我的beinan这个用户下的 .bashrc的配置吧。
 # .bashrc # User specific aliases and functions
export LC_CTYPE="zh_CN"
export XMODIFIERS="@im=fcitx"
# Source global definitions
if [ -f /etc/bashrc ];
 then . /etc/bashrc fi
存在的问题; 如果您用中文桌面环境,能启动fcitx ,但不能输入,
大多是控制台的locale和桌面的locale不一致所引起的。
请在用户家目录下的.bashrc 中加入一行;
export LANG="zh_CN.UTF-8"
另外还在建一个 .i18n的文件;内容如下:
LANG="zh_CN.UTF-8"
重启就好了,按CTRL+ALT+BACKSPACE;就重新启动系统
 Fedora 9下FCITX输入法的设置
b、修改~/.bashrc文件,加入
export LC_CTYPE="zh_CN.utf8"
export XMODIFIERS="@im=fcitx"
c、最后在输入法切换程序中选用FCITX,
注销后重新登录就可以用FCITX输入法了。

posted @ 2008-11-15 13:50 驽马 阅读(1204) | 评论 (0)编辑 收藏

2007年7月15日

肖申克的救赎

脑子不好用,赖得看书,随手写点东西。
《肖申克的救赎》是我最喜欢的电影,喜欢安迪那种韧劲,人性之韧!
我象祥林嫂一样给身边的人推荐这部电影,“你看过《肖申克的救赎》,这部电影实在太好,我都看了好多遍了”

         当他拿着藏着小锤子的圣经,面对典狱长的搜查,
 是那么的镇定!
         当他告诉那个可恶的警察,可以帮助他避税,只要求给他的几个狱友一人一瓶冰镇啤酒时,
这是巨大胜利的开端!知识就是安迪的武器。
        当他为了申请监狱费用,每个星期写一封,一直写了几年,
是多么的执着!
        当他面对不很明朗的情况,一天天挖洞时,
内心可曾犹豫过、彷徨过?
        当年老的布鲁斯被假释,获得自由了,却在监狱外面自杀,他被制度化了,
是多么的悲哀!多让震撼!制度化?!
          多像现实中的生活在固定圈子中安逸的人啊
当那个雷电交加的晚上,安迪从洞中逃离,在雨享受自由时,
          多么的伟大胜利!
东西太多了说不完!

经典台词:
 It takes a strong man to save himself, and a great man to save another.

  坚强的人只能救赎自己,伟大的人才能拯救他人

  Get busy living, Or get busy dying.

  忙活,或者等死。(汲汲于生,或汲汲于死 )

  Hope is a good thing, maybe the best of things, and no good thing ever dies.

  希望是美好的,也许是人间至善,而美好的事物永不消逝.

  “some birds aren't meant to be caged, that's all. Their feathers are just too bright...”

  有的鸟是不会被关住的,因为它们的羽毛太美丽了!
        “刚入狱的时候,你痛恨周围的高墙;慢慢的,你习惯生活在其中;最终你会发现自己不得不依靠它而生存。”
这是 Red 在出监狱之后按照 Andy 在监狱中跟他约定的承诺在乡下的乱石堆里找到的 Andy 写给 Red 的一封信。你看见了吗?那字里行间渗透的对希望的执著追求以及因此带给我们的深深的思考!

Dear Red:

If you’re reading this, you’ve gotten out and if you’ve come this far, maybe you’d come a bit further. You remember the name of the town, don’t you? Zihuatanjo. I could use a good man to help me get my project on wheels. I’ll keep an eye out for you, and the chessborad ready.

Remember, Red, hope is a good thing, maybe the best of things.And no good thing ever dies. I will be hoping that this letter finds you and finds you well.

Your friend
Andy

这段话的背景是Red前两次被审查是否能获得 approved 从而走出监狱时虽然他都表示自己已经成为对社会无危害的人了,但都莫名奇妙的 rejected. 这是影片中第三次监狱的officer和Red的对话.

 

-Please sit down.
Ellis Boyd Redding,your files say 

you've served 40 years of a life sentence.
You feel you've been rehabilitated?


-Rehabilitated? 
Well, now, let me see.
I don't have any idea what that means.

-It means you're ready to rejoin society...

-I know what you think it means, sonny.
To me it's just a made-up word. A politician's word so that...young fellas like yourself can wear a suit and a tie...and have a job. What do you really want to know? Am I sorry for what I did?

-Well, are you?

-There's not a day goes by I don't feel regret.
Not because I'm in here or because you think I should. 
I look back on the way I was then...a young...stupid kid who committed that terrible crime.
I want to talk to him...
I want to try and talk some sense to him.
Tell him the way things are...But I can't...
That kid's long gone...and this old man is all that's left.
I got to live with that.
Rehabilitated? It's just a bullshit word.So you go on and stamp your forms,sonny, and stop wasting my time.Because to tell you the truth...I don't give a shit.

posted @ 2007-07-15 11:37 驽马 阅读(216) | 评论 (0)编辑 收藏