HackToday Walk Blog


  • Home

  • Tags

  • Archives

  • Search

从定位效应说起

Posted on 2011-03-02

定位效应来自于人们受先入为主信息的干扰,进而受其误导,作出非理性的判断。

举个例子,
这个月刚发工资,你想买件外套,走进一家商店(这里能还价),店主像你兴致勃勃的推荐一款流行的样式,你看着觉得不错。 这时你问价钱,老板说500,你说“宰人呀”,打算扭头走,老板赶忙拉着你,可以低点。然后你会给个价钱,最后以300元成交。老板心里很得意,赚了100块。

这个例子中,在老板开价后,你的还价会受500一定的左右,所以你的还价(如果你不是很在行)以500为基准点,往下调整的幅度不会太大。这个就是“定位效应”。

还有很多例子,比如人们愿意听好话,这种偏好性,也是定位效应的影响,为了作出理性的决策,应该多听取不同的意见,作出最终的决策。忠言逆耳利于行。

国人文化靠谁拯救?

Posted on 2011-02-28

今天看见google的主页log标志才知道是李白诗人的诞辰,突然感慨自己的忘却了,想想小学时的“我歌月徘徊,我舞影凌乱”的月下浪漫,
高中时刻的“安能摧眉折腰事权贵,使我不得开心颜”的那份直率和性情。想想大学时的“千金散尽还复来”的豁达,而如今的“天生我才必有用”的豪情壮志。

李白,这个伴随我成长过程的诗人,读其诗,效其行,念其才,竟忘其人,悲哉悲哉!

幸亏google的log的提醒,我忽然想起我们国人中有几个记起他呢?其实一直很喜欢google的log设计,每逢重要的时刻他都会出现一个别样的设计,
提醒人们这是一个什么的节日。而看其国内网多少,有多少记得中国的这些好的文化呢?新的尚未建立,到时旧的抛得十分干脆。
前些年还是韩国人的做法让国人记得自己文化的重要性,我们到底是怎么了?国人的文化还要靠外人的普及,真是莫大悲哀了。。。。。

有时我们过于“吝啬”

Posted on 2011-02-20

每当自己如何借口太忙而把健身卡放置一边的时候,每当计划好跑步而赖在座位上一晚上时,我们太过吝啬了,对健康过于吝啬,
觉得投资的回收效果不怎么明显,觉的没有立竿见影的效应。当人们年轻的时候不注重对身体的投资,这个潜移默化的蝴蝶效应会在中年后越发突出,
譬如对长期工作的投入,没有循序渐进的坚持必然最后会面目全非。年轻时想的更多的是奋斗没有错,但是需要的健康的人生观,身体的投资也是纳入奋斗的范围。
一旦陷入工作狂的境界,实际离人生的成功也越来越远。工作,身体,二者需兼得。

因为非2才知道她-扎西拉姆·多多

Posted on 2011-02-16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
班扎古鲁白玛的沉默

你见,或者不见我

我就在那里
不悲不喜
你念,或者不念我
情就在那里
不来不去
你爱,或者不爱我
爱就在那里
不增不减
你跟,或者不跟我
我的手就在你手里
不舍不弃
来我的怀里
或者
让我住进你的心里
默然 相爱
寂静 欢喜

当李香山的女儿在父亲的“提前追悼会”上念着这首诗时,那种淡淡的凄美让人的心灵引发极大的震撼。每个字似乎都顿挫淡然,
对爱情,对人生,叩响而至,我竟有些潸然了。一份默然,一份寂静,也许就是追求爱情的最高境界吧。

__define_initcall 作用

Posted on 2010-12-29

很好的一篇文章,所以转过来了,感谢前人的探索。
http://bigfirebird.iteye.com/blog/824818

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

前言
宏定义__define_initcall(level,fn)对于内核的初始化很重要,他指示
编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序
放在一个section中。在内核初始化阶段,do_initcalls() 将按顺序从该
section中以函数指针的形式取出这些函数的起始地址,来依次完成相应
的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化
的完成,因此这个顺序排列常常很重要。
下面将从__define_initcall(level,fn) 宏定义的代码分析入手,依次
分析名称为initcall.init的section的结构,最后分析内核初始化函数
do_initcalls()是如何利用宏定义__define_initcall(level,fn)及其相
关的衍生的7个宏宏定义,来实现内核某些部分的顺序初始化的。
1、分析 __define_initcall(level,fn) 宏定义
1) 这个宏的定义位于inlclude\linux\init.h中:
#define __define_initcall(level,fn) \
static initcall_t __initcall_##fn \
__attribute__((__section__(".initcall" level ".init"))) \
= fn
其中 initcall_t 是个函数指针类型:
typedef int (*initcall_t)(void);
而属性 __attribute__((__section__())) 则表示把对象放在一个这个
由括号中的名称所指代的section中。
所以这个宏定义的的含义是:1) 声明一个名称为__initcall_##fn的函数
指针(其中##表示替换连接,);2) 将这个函数指针初始化为fn;3) 编译
的时候需要把这个函数指针变量放置到名称为 ".initcall" level ".init"
的section中(比如level="1",代表这个section的名称是 ".initcall1.init")。
2) 举例:__define_initcall(6, pci_init)
上述宏调用的含义是:1) 声明一个函数指针__initcall_pic_init = pci_init;
且 2) 这个指针变量__initcall_pic_init 需要放置到名称为 .initcall6.init
的section中( 其实质就是将 这个函数pic_init的首地址放置到了这个
section中)。
3) 这个宏一般并不直接使用,而是被定义成下述其他更简单的7个衍生宏
这些衍生宏宏的定义也位于 inlclude\linux\Init.h 中:
#define core_initcall(fn) __define_initcall("1",fn)
#define postcore_initcall(fn) __define_initcall("2",fn)
#define arch_initcall(fn) __define_initcall("3",fn)
#define subsys_initcall(fn) __define_initcall("4",fn)
#define fs_initcall(fn) __define_initcall("5",fn)
#define device_initcall(fn) __define_initcall("6",fn)
#define late_initcall(fn) __define_initcall("7",fn)
因此通过宏 core_initcall() 来声明的函数指针,将放置到名称为
.initcall1.init的section中,而通过宏 postcore_initcall() 来
声明的函数指针,将放置到名称为.initcall2.init的section中,
依次类推。
4) 举例:device_initcall(pci_init)
解释同上 1-2)。
2、和初始化调用有关section--initcall.init被分成了7个子section
1) 他们依次是.initcall1.init、.initcall2.init、...、.initcall7.init
2) 按照先后顺序依次排列
3) 他们的定义在文档vmlinux.lds.S中
例如 对于i386+,在i386\kernel\vmlinux.lds.S中有:
__initcall_start = .;
.initcall.init : {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
__initcall_end = .;
而在makefile 中有

LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.s
4) 在这7个section总的开始位置被标识为__initcall_start,
而在结尾被标识为__initcall_end。
3、 内核初始化函数do_basic_setup(): do_initcalls() 将从.initcall.init
中,也就是这7个section中依次取出任何的函数指针,并调用这些
函数指针所指向的函数,来完成内核的一些相关的初始化。
这个函数的定义位于init\main.c中:
extern initcall_t __initcall_start, __initcall_end;
static void __init do_initcalls(void)
{
initcall_t *call;
....
for (call = &__initcall_start; call

***********************************************************************

假如您希望某个初始化函数在内核初始化阶段就被调用,那么您
就应该使用宏__define_initcall(level,fn) 或 其7个衍生宏来
把这个初始化函数fn的起始地址按照初始化的顺序放置到相关的
section 中。 内核初始化时的do_initcalls()将从这个section
中按顺序找到这些函数来执行。 假如您希望某个初始化函数在内核初始化阶段就被调用,那么您
就应该使用宏__define_initcall(level,fn) 或 其7个衍生宏来
把这个初始化函数fn的起始地址按照初始化的顺序放置到相关的
section 中。 内核初始化时的do_initcalls()将从这个section
中按顺序找到这些函数来执行。

*******************************************************************
http://forum.oss.org.cn/viewtopic.php?p=8899&sid=1f5aee1b543bfca24793e4508dd115d0


今天在做一个驱动的时候要用到另一个驱动(I2C)提供的API,在内核初始化时碰到了一个依赖问题。
  我的驱动在I2C初始化之前就运行起来了,而这时I2C提供的API还处于不可用状态。查了很多资料,网上有人说任何使用module_init这个宏的驱动程式的起动顺序都是不确定的(我没有查到权威的资料)。
  任何的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。
 注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和1)中所述的这些函数本身在.init.text区段中的顺序无关。在
2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。在2.6内核中,initcall.init区段又分成7个子区段,分别是
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
  当需要把函数fn放到.initcall1.init区段时,只要声明
core_initcall(fn);
  即可。
  其他的各个区段的定义方法分别是:
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init
 而和2.4兼容的initcall(fn)则等价于device_initcall(fn)。各个子区段之间的顺序是确定的,即先调用.
initcall1.init中的函数指针,再调用.initcall2.init中的函数指针,等等。而在每个子区段中的函数指针的顺序是和链接顺序相
关的,是不确定的。
  在内核中,不同的init函数被放在不同的子区段中,因此也就决定了他们的调用顺序。这样也就解决了一些init函数之间必须确保一定的调用顺序的问题。按照include/linux/init.h文档所写的,我在驱动里偿试了这样两种方式:
__define_initcall("7", fn);
late_initcall(fn);
  都能够把我的驱动调整到最后调用。实际上上面两个是一回事:
#define late_initcall(fn) __define_initcall("7", fn)

如何让你的linux读出你计算机器件温度?

Posted on 2010-12-26

前段时间本想根据温度来调节功耗的,所以就想看看linux下给出的接口,能否方便的读取,进而调节。
刚开始在ubuntu下运行

1
#sensors

提示没有安装相关的驱动。
这时要运行sensors-detect

1
#sensors-detect

其中只要回答yes即可,最后的出现

1
2
3
4
5
6
7
8
9
10
Do you want to overwrite /etc/sysconfig/lm_sensors? (YES/no): no
To load everything that is needed, add this to one of the system
initialization scripts (e.g. /etc/rc.d/rc.local):

#----cut here----
# Chip drivers
modprobe coretemp
modprobe it87
/usr/local/bin/sensors -s
#----cut here----

如果马上想用不想重启,那么就直接使用modprobe安装相关的驱动。 即

1
2
#modprobe coretemp
#modprobe it87

最后来验证,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#sensors

coretemp-isa-0000
Adapter: ISA adapter
Core 0: +30.0°C (high = +76.0°C, crit = +100.0°C)

coretemp-isa-0001
Adapter: ISA adapter
Core 1: +29.0°C (high = +76.0°C, crit = +100.0°C)

it8718-isa-0a10
Adapter: ISA adapter
in0: +1.07 V (min = +0.03 V, max = +0.02 V) ALARM
in1: +2.16 V (min = +0.00 V, max = +4.08 V)
in2: +2.16 V (min = +0.00 V, max = +4.08 V)
in3: +3.02 V (min = +0.00 V, max = +4.08 V)
in4: +2.16 V (min = +0.00 V, max = +4.08 V)
in5: +0.06 V (min = +0.00 V, max = +4.08 V)
in6: +0.10 V (min = +0.00 V, max = +4.08 V)
in7: +2.96 V (min = +0.00 V, max = +4.08 V)
Vbat: +3.30 V
fan1: 1391 RPM (min = 10 RPM)
fan2: 1220 RPM (min = 0 RPM)
fan3: 0 RPM (min = 0 RPM)
temp1: +19.0°C (low = +127.0°C, high = +127.0°C) sensor = thermal diode
temp2: +28.0°C (low = +127.0°C, high = +127.0°C) sensor = thermistor
temp3: -70.0°C (low = +127.0°C, high = +127.0°C) sensor = thermal diode
cpu0_vid: +0.000 V

成功,呵呵。

当然,可以参考下面的文章,也有相关的介绍:

1
2
3
http://forums.linuxmint.com/viewtopic.php?f=42&t=31978&start=0#p184022
http://www.thinkwiki.org/wiki/Thermal_sensors
http://www.lm-sensors.nu/

编译缺少头文件 mmzone.h ....bounds.h的问题

Posted on 2010-12-24

出现这个问题,大都是在内核源码目录外编译产生的,google了一下,发现一篇文章,原来这些问题是在kbuild时产生的,内核本身没有,这够晕的。。。

见下面解决方法: 来源:http://blog.csdn.net/wby0322/archive/2010/05/26/5624565.aspx

出现的问题:编译的时候提示缺少头文件 mmzone.h ….bounds.h…等

include/linux/mmzone.h:18:26: error: linux/bounds.h: No such file or directory
include/linux/mmzone.h:197:5: warning: “MAX_NR_ZONES” is not defined

原因:bounds.h是在编译内核时生成的,类似于编译产生的.o文件,如果你运行

“make clean” or “make distclean”,这个文件就会被清除掉(详情查看内核Makefile)。因此,如果再利用此内核源码编译内核模块,
如果有涉及bounds.h,就会出现找不到该文件的错误。

解决:独立内核目录之外编译模块时,要确保makefile文件中所定义的内核源代码树已经make过一遍,且没有make clean。这样就不会清除生成的bound.h头文件,这个文件是生成模块必须的。

或者”make prepare”

这样就会重新生成bounds.h,搞定了!

强大的cscope+vim+ctags

Posted on 2010-12-16

强大的cscope+vim+ctags今天终于打算弄弄linux下的cscope这套工具了,以前总是没用到地方
看到了http://blog.csdn.net/jsufcz/archive/2009/03/13/3988883.aspx 写的一篇文章,
进行了相关的验证,发现阅读代码很是方便。

实验环境:Ubuntu-9.10

  1. 首先确认vim支持cscope,

方法: vim –version | grep cscope

如果显示 +cscope 就是支持了;再安装cscope。
如果不支持,似乎要重新编译vim和下载cscope(这个没有验证,ubuntu默认的支持)。

  1. 其次,安装ctags3.

然后就是具体操作了,体验强大之处吧,
比如你一个目录下存放的一个软件的源代码,那么进入目录中,
进行如下的操作:

操作:

1
2
3
1, ctags -R    这一步是为了递归生成标签文件操作
2, cscope-indexer -r   这一步是生成索引信息文件操作
3, cscope 使用cscope查看源代码了。 还是很方便的。

附上一点常用命令:(转自:http://blog.csdn.net/jsufcz/archive/2009/03/13/3988883.aspx)在vim中ctags的简单使用

1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag
命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。
某个函数有多个定义时

:tag
跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname

如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里’/‘就是告诉vim
‘block’是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,’^’表示开头,同理,’$’表示末尾。多个同名的标识符

感谢前人开发的工具和网友在配置上做的探索。

看看green500,谈谈个人看法

Posted on 2010-08-09

今年上半年公布的green500里,曙光的 Nebulae表现不错,排名第4. 前面几名还是IBM稳坐,不过看起来好像是同一解决方案,
应该是同样的技术。曙光 Nebulae在今年的top500里,排名第2,今年在green里拿到第4已经不错了,何况 top500 里的第 1 名
Jaguar都在green里56名,第3名Roadrunner,在green里第7。

看看数据:
Green500 MFLOPS/W Site* Total Power (kW)
Rank 4 492.64 National Supercomputing Centre in 2580(Nebulae)Shenzhen (NSCS)
7 444.25 DOE/NNSA/LANL 2345.5(Roadrunner)
11 379.24 National SuperComputer Center in 1484.8(Tianhe) Tianjin/NUDT
56 253.07 Oak Ridge National Laboratory 6950.6(Jaguar)

NUDT的天河总机1484.8kW, Nebulae的总机功耗2580kW,RoadRunner 2345.5kW。
如果按照绝对值增加的话(以天河为基准):Roadrunner在增加860.7kW的情况下,能效(MFLOPS/W)增加了65.01。
Nebulae增加1092.5kW, 能效增加了113.4。似乎要比Roadrunner更好一些,当然高性能超级计算机的一个很值得研讨的课题就是可扩展性,
性能的线性增加,并不意味着功耗的增加是线性的,可能是指数增加的。

我们能效公式是:

性能(MFLOPS)/ 功耗*1000(W) =能效:

1
2
3
4
       		 Nebulae    Tianhe     Roadrunner     Jaguar  

Rmax(TFPOS) 1271.00     563.10      1042.00       1759.00    
Power(kW)     2580       1484.8        2345.50     6950.6

这个数据很有意思,前三者基本还表现为功耗随性能线性增加,可Jaguar实在有些差强人意,功耗耗增加的过快。
不同的架构也许在小机器上差别很小,但是根据蝴蝶效应,在超级计算机上就可能颇为悬殊了。但还不至于这么夸张,
都有互相借鉴对方的长处的,我忽然想到CISC和RISC的历史了,呵呵。再说了,大家不是在同一个时间下出来的机器,
比较起来自然有些不太公平,毕竟超级计算机领域的变化可谓日新月异,发展太快了。新机器在各指标上都会要好些。
虽然我们的超级计算机取得了不错的成果,但是还要看到很多的不足之处,应该发展的全面一些,既有性能卓越,
能效突出的超大型机器(但是功耗还是比较大),又有性能不错,能效卓越的小一点的机器(功耗小于前者的1/4),
那么就代表在supercomputing科技里有足够的底气,当然至于能不能在近年里出现国产CPU大批量应用在超级机器中还不好说,
可这应该是我们的目标,核心部件,核心工艺不在我方,谈何真正的科技领先呢,岂不要处处受制于人,为了国家的安全和未来发展,
国产CPU及集成电路的一系列的技术都是要长期着手要重点抓的,技术的发展当然少不了基础科学的支持,所以也要大力支持基础科学的研究,
这方面还是有很多要改进的地方的。

里面都仅仅是个人之见,有的扯得比较远,可能不够严谨,值得商榷,呵呵。

从“龙芯”的尴尬看我国科研布局的严重缺失

Posted on 2010-07-22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
从“龙芯”的尴尬看我国科研布局的严重缺失
                                        邹谋炎
 
  “龙芯”在电视报道后,声名远扬。
它是中科院计算所的研究成果,确实代表了国内在CPU芯片设计方面的最高水平。然而,即使是在国内应用市场上,它的处境却十分尴尬。
人们需要了解的是:从国家信息技术的角度,芯片设计只是芯片技术这个大题目中的一项。我们缺的技术还太多:
(1) 芯片制造技术及相关的材料、超净、工艺控制等;
(2) 芯片制造工艺设备研发,特别是新工艺支撑技术、系统和设备;
(3) 设计和验证工具的自主开发;
(4) 基本单元的物理层设计和新基本单元的自行开发能力;
(5) 专用电路单元或片上系统(SOC)设计、验证和工业化生产技术,例如
超高速和高精度数字芯片;微波、大功率模拟芯片;以及具有抗高热、抗辐射要求的设计技术。


其中(2)和(5)是核心中的核心,是最“卡脖子”的技术。大致从80年代后期起,国际上芯片设计就已属于可开放技术,有计算机科学或数字系统经验的工作者可以进入工作。
而要开展所列出的5项工作,主要是(1)(2)(4)(5),则需要宽得多的技术基础积累,涉及工艺的则难于介入。国内数字多媒体芯片发展商“中星微电子”拥有与
龙芯不同的系统级和电路级设计技术。而从芯片技术这一角度来看,则属于类似的技术等级。由于设计结果要靠“芯片代工厂”流片,国内芯片设计企业受限制于可以
得到的工艺条件。严峻的实事是,龙芯是通用器件,可得到的工艺水平上晚国外一步,就丧失了产品的主流市场。

现在,人们将国与国之间的经济和国力竞争归结为创新性竞争,并且浓缩为芯片制造技术和系统的竞争或工艺竞争。而这才是芯片技术的核心。
高端工艺包括相关的基础理论和基础技术(方法、技术、设备、和条件)两个不可分割的部分。受工艺影响的绝不只是芯片技术,而是国家科技和产业的各个领域中最关键
和最核心的部分。它直接限制或提升国家的科技创新能力和各领域高新技术产品的自主开发能力。

欧美的大学、研究所有开展基础技术研究的长远历史,而在我国却极稀缺。遗憾的是,这种影响全局的问题始终没有得到我国科技高层和政府高层的强烈关注。
可以说,国家科技发展规划纲要的制定过程决定了,它的若干内容只反映目前正在实施的研究发展项目的延续性要求,受制于利益而缺乏真正意义上的科学性和前瞻性。
欧美日各国政府长期以来一直极为看重以芯片技术为中心带动工艺的全面进步。从80年代起,美国政府支持“半导体加工工艺财团”(SEMATECH),
日本政府提出建立“Technology Nation”的目标,以及欧盟通过尤里卡发展计划的努力,都卓有成效,并在以后从不间断地持续。

我国缺失太多,要弥补起来是一件需要全面规划的问题。靠几个“分钱工程”的“举国体制”一定不会有好结果。我们需要一个教育、培养、引进、发展过程。花点
钱,买几十套国外工业淘汰下来的成套工艺线,放到各地学校中,让教授们、教师们、学生们能够从实践学起,多少认识一点工艺是怎么回事,自然会生长出一批有
志者。让脱离实际的教授、专家们懂点工艺,让大学生和研究人员知道潜心研究工艺有前途、不受穷,这需要国家用“举国体制”来长期支撑。如果能这样做,中国
科技和产业被“卡脖子”的日子,应该在十年以内结束。此文亦可催促我们还有还多事情要做,前进不止。
1…212223…26

Kai Qiang Wu

This is a place for thinking and writing

253 posts
32 tags
GitHub
© 2020 Kai Qiang Wu
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4
Visitor Total Visit