momo zone

调核人的blog

Monthly Archives: 十二月 2009

SAP and ABAP Memory总结

1、读取和使用方法不同
SAP内存使用SET/GET parameters方法;
ABAP内存使用 EXPORT 和 IMPORT  方法;

2、共享范围不同
SAP内存可以被所有的主session访问,内存数据可以同一个session中不同程序之间,或者不同session之间;
ABAP只能在同个session的不同程序之间共享数据;

3、作用范围不同
SAP内存在整个终端session时间内都有效;
ABAP内存只能在一个session时间内有效;

4、使用一般原则
SAP内存用于屏幕默认值输入;
abap内存用于模块之间传替数据

 
 

Difference Between SAP and ABAP Memory 

Can any one tell me what is the difference between ABAP Memory and SAP Memory?

Answers 1:-

Within a main session, when ever you start an application program, it opens up an internal sessions with in the main session. The internal session has a memory area that contains the ABAP program and its associated data.  So when ever you want to  pass data between two internal sessions, then you can use ABAP Memory (i.e import, export).

When comes to SAP memory (also known as global memory), if the data has to be passed b/w two main sessions, we can use SAP Memory(SPA/GPA Parameters).  SAP Memory can also be used to pass data b/w internal sessions.

Neelima

Answers 2:-

SAP Memory 
SAP memory is a memory area to which all main sessions within a SAPgui have access. You can use SAP memory either to pass data from one program to another within a session, or to pass data from one session to another.  Application programs that use SAP memory must do so using SPA/GPA parameters (also known as SET/GET parameters). These parameters can be set either for a particular user or for a particular program using the SET PARAMETER statement. Other ABAP programs can then retrieve the set parameters using the GET PARAMETER statement. The most frequent use of SPA/GPA parameters is to fill input fields on screens

ABAP/4 Memory 
ABAP memory is a memory area that all ABAP programs within the same internal session can access using the EXPORT and IMPORT statements. Data within this area remains intact during a whole sequence of program calls. To pass data 
to a program which you are calling, the data needs to be placed in ABAP memory before the call is made. The internal session of the called program then replaces that of the calling program. The program called can then read from the ABAP memory. If control is then returned to the program which made the initial call, the same process operates in reverse.

SAP memory  
The SAP memory, otherwise known as the global memory, is available to a user during the entire duration of a terminal session. Its contents are retained across transaction boundaries as well as external and internal sessions. The SET PARAMETER and GET PARAMETER statements allow you to write to, or read from, the SAP memory. 

ABAP/4 memory  
The contents of the ABAP/4 memory are retained only during the lifetime of an external session (see also Organization of Modularization Units). You can retain or pass data across internal sessions. The EXPORT TO MEMORY and IMPORT FROM MEMORY statements allow you to write data to, or read data from, the ABAP memory. 

(二)          Passing data from one ABAP program to another
1. You have to define an internal table ITAB in program AAA. 
2. In the program AAA you export your ITAB to the memory.  
    EXPORT ITAB TO MEMORY ID ‘TD’ (ID is the name of memory, you don’t need to create it ). 
3. In program BBB you have to declare The same table (same table’s name and same fields). 
4. In BBB you can import ITAB :  
    IMPORT ITAB FROM MEMORY ID ‘TD’ 
5. Now you can export it to AAA after modifications.  
    EXPORT ITAB TO MEMORY ID ‘TD’
6. In AAA :  
    IMPORT ITAB FROM MEMORY ID ‘TD’
This solution is independant to SUBMIT. 
(三)          Example:    
两个程序010和011,选择屏幕是一样的. 010是ALV行显示的,011是WRITE显示的.需要达到的效果是: 点击:MATNR字段则将010的选择屏幕传到011的选择屏幕中去;点击VBELN,则将当前行的VBELN传到011的选择屏幕中去.
Program:010
1.定义010的选择屏幕:
selection-screen begin of block b1 with frame title bt1.
  
parameters  PL_BUKRS like VBRK-BUKRS memory id P_BUKRS default ‘1000’.
  
select-options PI_KUNRG for VBRK-KUNRG.
  
select-options PI_FKDAT for VBRK-FKDAT.
  
select-options PI_VBELN for VBRK-VBELN.
  
select-options PI_VGBEL for VBRP-VGBEL.
selection-
screen end of block b1.
2.010中定义USERCOMMAND事件:
form user_command using i_ucomm like sy-ucomm is_selfield type slis_selfield.
 case i_ucomm.
    when ‘&IC1’.
      CASE is_selfield-fieldname.
        WHEN ‘VBELN’.
            read table itab index is_selfield-tabindex.      "change
            EXPORT ITAB-VBELN TO MEMORY ID ‘PT_VBELN’.
            EXPORT is_selfield-fieldname TO MEMORY ID ‘PP_FIELD’.
            CALL TRANSACTION ‘ZF011’ AND SKIP FIRST SCREEN.
        WHEN ‘MATNR’.
            EXPORT is_selfield-fieldname TO MEMORY ID ‘PP_FIELD’.
            EXPORT PI_KUNRG to memory id ‘PP_KUNRG’.   "add
            EXPORT PI_VGBEL TO MEMORY ID ‘PP_VGBEL’.   "add
            EXPORT PI_VBELN to memory id ‘PP_VBELN’.   "add
            EXPORT PI_FKDAT TO MEMORY ID ‘PP_PKDAT’.   "add
            CALL TRANSACTION ‘ZF011’ AND SKIP FIRST SCREEN.
      ENDCASE.
 endcase.
endform. "user_command
 
3.011中定义选择屏幕(这里就不需要定义MEMORY ID):
selection-screen begin of block b1 with frame title bt1.
parameters PL_BUKRS like VBRK-BUKRS memory id PP_BUKRS default ‘1000’.
select-options PI_KUNRG for VBRK-KUNRG .
select-options PI_FKDAT for VBRK-FKDAT.
select-options PI_VBELN for VBRK-VBELN .
select-options PI_VGBEL for VBRP-VGBEL .
selection-screen end of block b1.
 
4.011中接收010中传过来的值
DATA : ME_VBELN LIKE VBRK-VBELN .
DATA : ME_FIELD(30) TYPE C . 定义ME_FIELD是为了接收is_selfield-fieldnameMEMORY ID ‘PP_FIELD’,因为MEMORY不是一个字段,也不是一个内表,只能用这种方式来传输
CLEAR :ME_VBELN ,ME_FIELD.
 IMPORT is_selfield-fieldname = ME_FIELD FROM MEMORY ID ‘PP_FIELD’.
 IF ME_FIELD = ‘VBELN’.
    IMPORT ITAB-VBELN = ME_VBELN FROM MEMORY ID ‘PT_VBELN’.
 ELSE .
    IMPORT PI_VBELN = PI_VBELN from MEMORY ID ‘PP_VBELN’.
 ENDIF .
 
 IMPORT PI_FKDAT = PI_FKDAT FROM MEMORY ID ‘PP_PKDAT’.
 IF NOT ME_VBELN IS INITIAL .  “表示选择了VBELN
    PI_VBELN-SIGN = ‘I’.
    PI_VBELN-OPTION = ‘EQ’.
    PI_VBELN-LOW = ME_VBELN .  “只选择单值,所以传LOW就可以拉
    APPEND PI_VBELN .
 ENDIF .:

What is the code to send internal table to abap memory?

This code is from which program you want to export to the ABAP memory:          

   export ist_resb to memory id ‘ZPPC0122_FD’.

             where ist_resb is the internal table name & 
                   ZPPC0122_FD is the include name of my program ZPPC0122.

This code is from which program you want to import from the ABAP memory

        import *ist_resb *= ist_resb from memory id ‘ZPPC0122_FD’.

              where  *ist_resb This internal table is the importing program internal table.* 
                    ist_resb This internal table is the exporting program internal table.

But remember in both the program you have defined the same internal table with same structure

Nowadays Export & Import statement is OBSOLETE it gives SLIN CHECK ERROR in SAP 6.0 Version.

test

Apple G6 keyboard & linux

今天 Apple G6的键盘到了,迫不及待的插到usb口上,bios post 的时候在usb controller initialize 停住了 ,准确的说是无响应,重启后依旧 ,然后我 赶紧 关机重开,仍然在usb controller initialize 停顿了一下,但终于过去了,松了一口气 。估计是bios的bug ,主板的bios很久没有更新了,由于超频的缘故我也不愿意更新 。然后启动windows server 2008 R2 。 一切都很顺利,登录后会发现一系列apple的设备,ok全部pass 。这里有个发现,bios下反应比ps/2口的反应慢半拍,不过这个没有影响了 。

接下来是难伺候的linux(设备驱动既让人恨又让人爱) 。首先一个问题是没有识别到apple keyboard ~~~~
…….. 根据经验 重启一下(这是什么经验阿) …… 好了! 无语
然后重启后又不能工作了,看来不是很稳定(udev 的问题?)
不管怎样,先进去再说,按下F12 打开console , 竟然没反应,难道F键不能用,摸索了半天发现竟然FN 键被设置成默认启用, 也就是说F12需要 FN+F12 才能用 ,不用想了这个也肯定是bug 。google 了一下找到临时解决的方法:
echo 2 > /sys/module/hid_apple/parameters/fnmode
不过每次这样搞显得很怪异
还是找源码中的bug吧。

源码还是很好找到的,在这里:
/usr/src/linux/drivers/hid/hid-apple.c
然后很容易就找到
static unsigned int fnmode = 1;


改成 =2  就好了,这就是问题根源(测试的人都睡着了?)
然后在这个代码所在的目录里执行:
make -C /usr/src/linux-2.6.30-2 SUBDIRS=$PWD
这样会把hid目录中所有的程序都编译一遍,完成后把生成的.ko copy 到/lib/modules/2.6.30-9-pae/kernel/drivers/hid/ ,一定是全部copy 不能只copy hid-apple.ko, 否则会在加载的时候提示找不到符号。
重新启动内核,ok fn恢复正常。

接下来要做什么? 毫无疑问,还差insert ,print screen, pause 这几个键 。虽然是可有可无的东西,但如果急用的时候 没有还是会让人头痛的 ,干脆加上吧! 就加在F13-F15这3个键上 (不要奇怪apple的键盘确实有F13-F19这么多功能键,不过在非MAC下的确没有用)
先执行xev 得到这些键的keycode :182-184 (十进制)
然后映射:
xmodmap -pke >>~/.Xmodmap
然后找到keycode 加入如下内容,save.
keycode 182 = Insert
keycode 183 = Print Execute dead_iota
keycode 184 = Pause

最后xmodmap ~/.Xmodmap 生效

2013-01-31 更新:

终端模式

修改/usr/share/kbd/keymaps/mac/include/mac-linux-keys-bare.inc

最后4行替换成以下内容:

keycode 97 = Control # mod by redsonic

keycode 56 = Alt_L # mod by redsonic

keycode 100 = Alt_L # mod by redsonic

keycode 42 = Shift

keycode 58 = Caps_Lock

1.将Alt_L放置在左右option-alt 物理键位上,取消Alt_R,取消Alt_GR

2.将右Control定义为和左Control相同

X Window图形模式:

使用xkb更优雅的方式而不是Xmodmap

先在kde中把键盘类型改为apple ansi, 然后修改/usr/share/X11/xkb/symbols/macintosh_vndr/apple

将xkb_symbols “alukbd”  段中的 replace key <NMLK> {  [  XF86Clear ]  };

这一行替换成

override key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };

,原因是XF86Clear 存在的话,后续更改Alt相关内容后会发生F功能键对KDE失效的问题,可能是个bug,也可能是其他配置问题。

然后修改/usr/share/X11/xkb/symbols/inet 中evdev段。

将 key <I169> { [ XF86Eject ] }; 替换成 key <I169> { [ Insert, XF86Eject ] }; //# mod by redsonic

注释掉最后几行,并添加:

// key <FK13> { [ XF86Tools ] }; // #mod by redsonic
// key <FK14> { [ XF86Launch5 ] }; // #mod by redsonic
// key <FK15> { [ XF86Launch6 ] }; // #mod by redsonic
// key <FK16> { [ XF86Launch7 ] }; // #mod by redsonic
// key <FK17> { [ XF86Launch8 ] }; // #mod by redsonic
// key <FK18> { [ XF86Launch9 ] }; // #mod by redsonic
key <FK13> { [ Print, Sys_Req ] }; // #mod by redsonic
key <FK14> { [ Scroll_Lock ] }; // #mod by redsonic
key <FK15> { [ Pause, Break ] }; // #mod by redsonic

编辑/usr/share/X11/xkb/symbols/macintosh_vndr/us

xkb_symbols “extended” {

name[Group1]= “USA”;
key <ESC> { [ Escape ] };

// Alphanumeric section
key <TLDE> { [ quoteleft, asciitilde ] };
替换为

xkb_symbols “extended” {

name[Group1]= “USA”;
key <ESC> { [ grave ] };

// Alphanumeric section
key <TLDE> { [ Escape, asciitilde ] };

1. 更改F13-F15分别为 print/sysrq , scroll_lock , pause/break

2. 恢复F16-F19原本的symbol 这肯定是KDE默认键盘布局设置的一个bug

3. 空格键左右两侧从昨到右依次为Control_L, Alt_L, Super_L , SPACE , Super_R , Alt_R, Control_R

4. 将eject键替换成insert/eject键

5. 启用Shift+Clear = enable mouse key

6. 替换`[grave]与esc[Escape]

hifi的老物件

非常不错一个站点, 记录了很多hifi 大厂的老物件 ~
http://www.thevintageknob.org/

win 6.1 和 SAP的乌龙

这个标题让人感觉奇怪,但其实这里win 6.1 是指的内核版本6.1 也就是win7和server2008 R2 ~~ .如果我说Win7/server 2008 聪明到什么地步,你恐怕不相信,那就是win 6.1 对SAPgui自动打开兼容模式到XP SP3 ,然后导致一系列性能问题. 具体表现为SAPgui 710 运行一段时间后(大概200STEP)性能大幅下降,尤其是/n /o 等命令。 打过level 15的补丁无济于事, 最后才注意到兼容模式打开了,而且是XP SP3 兼容。 让我感到困惑的是即使打开兼容模式,也应该是vista/sp1 啊,毕竟之前server 2008 也没任何问题 。 对于这种情况我只能判定为乌龙,微软对SAP的特殊照顾。另外即使win6.1 取消兼容模式,sapgui的性能也无法与win 6.0 比,主要还是显卡驱动的问题,估计支持 dwm2.0 的显卡好些。

《最终幻想XIII》秋叶原首发报道

    2009年12月17日,万众期待的超大做《最终幻想XIII》终于在日本发售。FANS们积蓄已久的热情得以一口气释放。继涩谷官方首发庆祝活动后,下面为大家送上宅文化根据地电器街秋叶原的首发报道。

秋叶原首发现场(照片来自Famitsu)

    时间是早上5点半,距离秋叶原最大的Yodobashi电器店开门尚有1个半小时时间,店门外已经黑压压聚集了一片人群,队伍长度超过100人。事实上早在凌晨1点左右,先头到达的50多名死忠就已经在店外席地而坐等待了。

    队伍最前列的100人,几乎都是凌晨时分到达店外的。照片中前排右侧的男生从昨天午夜就已经开始排队,中间的男性则是专程从德国赶来购买闪电版限定PS3的FANS。

自右至左:排队30小时的本地死忠、乘机从德国赶来的海外死忠、夏亚……

    早上6点钟,店方开始在展示用液晶电视上播放《FFXIII》的宣传片,现场的气氛渐渐热烈起来,排队的人群也在不时延伸。从100人到200人,6点45分时已经达到了300多人的壮观规模,超过了举办首发庆祝活动的涩谷。

   
早上6点55分,店方开始将300多人的队伍分批限次引导至1楼的特设银台和6楼的游戏卖场。7点整贩卖活动正式开始,就现场观察的情况来看,9成的人选
择了闪电版游戏同捆PS3套装,另外同时购入HDMI端子和炼金药(ELIXIR)饮料等相关商品的人也不在少数。

    购入限定版主机的人中,女性顾客的数量比预想的要多。经过交谈后得知,有不少人为了能在周末无忧无虑的游戏,所以选择赶在上班或上学前来到这里购机,接下来还要奔赴就职的公司或是就学的学校。

由于提前安排了付款与购物分批进行的对策,到早上7点40分左右,店外排队的300人队伍已经开始渐渐散去。到平时正常营业开始的9点钟时,店内已经看不到排队的人了。Yodobashi秋叶原店游戏专柜负责人在接受记者采访时表示:

    “总的来说发售还算顺利。之前已经准备了相当数量的同捆版主机,今天一天内卖出了不少。不过,这种势头能否继续保持现在还言之过早。毕竟,贩卖从现在才算是真正开始。”

查找SAP config 的英文索引字

有时候需要用SE10 来找某个配置被那个request 提交修改过, 却不知道如何下条件,因为好像无法找到SAP IMG的info 。 但其实不然,只不过默认不显示而已。 如下图做, SPRO-> additional information ->display key -> document  . 这样就可以看到了。

  

用rsync 备份

备份

rsync -aciuh --delete --stats --exclude=/mnt --exclude=/media --exclude=/proc --exclude=/dev --exclude=/sys --exclude=/home --exclude=/tmp --exclude=/root   /   /mnt/tmp/sysbak

恢复

rsync -acih --delete -stats --exclude=/mnt --exclude=/media --exclude=/proc --exclude=/dev --exclude=/sys --exclude=/home  --exclude=/tmp --exclude=/root  /mnt/tmp/sysbak   /

既是很好用的命令,也是非常危险的命令,稍不注意整个根目录就挂了,好在还能用援救光盘下重新恢复目录,另外也可以加-n参数模拟运行。

-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,将基于校验值来判断是否传输文件。该选项会大幅延长运行时间,因为src和dst的所有文件都会计算一遍校验值
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。

–stats 在最后输出summary信息。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, –dry-run现实哪些文件将被传输
-W, –whole-file 拷贝文件,不进行增量检测
-x, –one-file-system 不要跨越文件系统边界
-B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, –rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 及时出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息

让人怀念的老物-3.5寸软盘!

今天打扫卫生,翻箱倒柜,结果扒到了不少老物,其实就有这些sony的3.5软盘,回想起来这些应该是2001年买的(之前用IBM的5寸软盘),距今已有9年之久. 曾被用来制作DOS6.22 启动盘,各类USB驱动盘(当年win95是需要驱动的), 从好友那里copy mp3(现在不可想象), 大学时候用来交作业. 我重新把软盘插入那已经满是灰尘的软驱,伴随着"咯吱咯吱" 声,大部分竟然还能读出来,再次看到N年前的资料和数据让我感动不已 ~~~~ 省略N多字…

部分需要format 后才能用,还有几张0磁道损坏,用dd命令重写0磁道后居然重新复活了! 好好收藏留个纪念吧

Google 放出靓号 DNS

google 今天放出免费DNS 服务器,分别为8.8.8.8 ,8.8.4.4 。对的,没有看错,的确是靓号,很难忘记这两个ip , 但还是希望我们伟大的dang 不要那么快就封杀之

linux 硬件plug 机制流程

将可移动设备连入系统时,系统的后台中会依次发生如下事件:

l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。

l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。

l hotplug装入了相应的内核模块之后,会把这一消息通知给hald。

l
hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-
policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc
/fstab,为相应的设备节点创建适合的挂载点。

l 卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。

当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助:

l hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。

l 卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。

要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。

下面是上面的过程中涉及的模块和工具:

l hotplug

hotplug 包和内核里的hotplug模块不是一回事,2.6内核里的pci_hotplug.ko是一个内核模块,而hotplug包是用来处理内核产生的hotplug事件。这个软件包还在引导时检测现存的硬件并在运行的内核中加载相关模块。

不但有热插拔,还有冷插拔(cold pluging)。热插拔在内核启动之后发生,而“cold pluging”发生在内核启动的过程中。

/etc/hotplug/*.rc 这些脚本用于冷插拔(检测和激活在系统启动时已经存在的硬件)。它们被 hotplug 初始化脚本调用。*.rc 脚本会尝试恢复系统引导时丢失的热插拔事件,举例来说,内核没有挂载根文件系统。

/etc/hotplug/*.agent这些脚本将被 hotplug 调用以响应内核产生的各种不同的热插拔事件,导致插入相应的内核模块和调用用户预定义的脚本。

/sbin/hotplug内核默认情况下将在内核态的某些事情发生变化时(如硬件的插入和拔出)调用此脚本。

发送热插拔事件的子系统(subsystem)包括总线驱动(USB、PCI等)和一些设备的抽象层(网络接口、磁盘分区等)。它们通过/sbin/hotplug的第一个参数来识别。

对于设备驱动来说,需要在代码里设置MODULE_DEVICE_TABLE,指向驱动程序感兴趣的设备的设备ID列表。

l udev

在2.6内核里,使用了udev来取代hotplug。据udev的作者Greg
K.H说,之所以废弃了hotplug原因是sysfs的出现,这个东西会产生非常多的hotplug事件,远远超过了2.4的内核(只要实现了了
kobject模型的设备驱动都回产生该事件)。所以hotplug变得复杂,而且因为hotplug都是bash所写,所以开始变得没有效率。于是出现
了一个名叫hotplug-ng的项目,就是为了解决这个过于复杂以及缺乏效率的问题,ng应该是next
generation的意思。但这个项目目前为止还不能胜任角色,所以udev挺身而出,充当了救火队员。

2.6.15之后,/proc/sys/kernel/hotplug会成空的,因为内核通知用户空间的接口变成了netlink,所以最新的
udev也采用了netlink接口去写,废弃了/sbin/hotplug或者/sbin/udevsend。udev在2.6.15以后的内核上可以
直接通过netlink接听设备事件,sysfs提供了uevent文件,对该文件的“写”可以送出设备事件!

udev 完全在用户态 (userspace) 工作,利用设备加入或移除时内核所发送的hotplug 事件 (event)
来工作。关于设备的详细信息是由内核输出 (export) 到位于 /sys 的 sysfs
文件系统的。所有的设备命名策略、权限控制和事件处理都是在用户态下完成的。与此相反,devfs 是作为内核的一部分工作的。

传统上一般 Linux 系统使用创建静态设备的方法,因此在 /dev
目录下创建了大量的设备节点(有时会有数千个节点),而不管对应的硬件设备实际上是否存在。这通常是由 MAKEDEV
脚本完成的,这个脚本包含许多调用 mknod 程序的命令,为这个世界上可能存在的每个设备创建相应的主设备号和次设备号。而使用 udev
方式的时候,只有被内核检测到的设备才为其创建设备节点。因为每次系统启动的时候都要重新创建这些设备节点,所以它们被存储在 tmpfs
文件系统上,设备节点不需要很多磁盘空间,所占用的内存可以忽略不计。

S03udev 初始化脚本负责在 Linux 启动的时候创建设备节点,该脚本首先将 /sbin/udevsend
注册为热插拔事件处理程序。热插拔事件(随后将讨论)本不应该在这个阶段发生,注册 udev 只是为了以防万一。然后 udevstart 遍历
/sys 文件系统,并在 /dev 目录下创建符合描述的设备。例如,/sys/class/tty/vcs/dev
里含有”7:0″字符串,udevstart 就根据这个字符串创建主设备号为 7 、次设备号为 0 的 /dev/vcs
设备。udevstart 创建的每个设备的名字和权限由 /etc/udev/rules.d/ 目录下的文件指定的规则来设置。如果 udev
找不到所创建设备的权限文件,就将其权限设置为缺省的 660 ,所有者为 root:root
。上面的步骤完成后,那些已经存在并且已经内建驱动的设备就可以使用了。

对于以模块驱动的设备,当内核检测到一个新设备连接时,内核会产生一个热插拔事件,并在 /proc/sys/kernel/hotplug
文件里查找处理设备连接的用户空间程序(新的内核通知接口改变,/proc/sys/kernel/hotplug为空了)。udev 初始化脚本将
udevsend 注册为该处理程序。当产生热插拔事件的时候,内核让 udev 在 /sys 文件系统里检测与新设备的有关信息,并为新设备在
/dev 里创建项目。

所有在 sysfs 中显示的设备都可以由 udev 来创建节点。如果内核中增加了其它设备的支持,udev 也就自动地可以为它们工作了。

大多数 Linux 发行版通过 /etc/modules.conf
配置文件来处理模块加载,对某个设备节点的访问导致相应的内核模块被加载。对 udev
这个方法就行不通,因为在模块加载前,设备节点根本不存在。Linux 的设计是在设备被发现的时候加载模块,而不是当它被访问的时候。通过在
/etc/sysconfig/modules文件里添加模块名,就可以在系统启动的时候加载这些模块,这样 udev
就可以检测到设备,并创建相应的设备节点了。

如何写udev规则。通过udevinfo程序来找到那些可以作为规则文件里的匹配项的项目。分为两种情况:第一种情况是,当你把设备插入系统后,
系统为设备产生了设备名(如/dev/sda)。那样的话,你先用udevinfo -q path -n
/dev/sda,命令会产生一个该设备名对应的在sysfs下的路径,如/block/sda。然后,你再用udevinfo -a -p
/sys/block/sda,这个命令会显示一堆信息,信息分成很多块。这些信息实际来自于操作系统维护的sysfs链表,不同的块对应不同的路径。你
就可以用这些信息来作为udev规则文件中的匹配项。但需要注意的是,同一个规则只能使用同一块中显示的信息,不能跨块书写规则;第二种情况是,不知道系
统产生的设备名,那就只有到/sys目录下去逐个目录查找了,反复用udevinfo -a -p
/sys/path…这个命令看信息,如果对应的信息是这个设备的,那就恭喜你。否则就再换个目录。当然,在这种情况下,成功的可能性比较小。

l HAL

HAL位于设备驱动程序和应用程序之间。

l D-BUS

D-BUS 是一个大有前途的消息总线和活动系统,正开始深入地渗透到 Linux 桌面之中。D-BUS 本质上是进程间通信(inter-process communication)(IPC)的一个实现,设计用于桌面应用程序和 OS 通信。

典型的 D-BUS 设置将由几个总线构成。一个持久的系统总线(system
bus),它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。还将有很多会话总线
(session buses),这些总线当用户登录后启动,属于那个用户私有。

一个更为有趣但很不实用的例子是 Jamboree 和 Ringaling 的结合。Jamboree 是一个简单的音乐播放器,它具有
D-BUS 接口,以使得它可以被告知播放、到下一首歌、改变音量等等。Ringaling 是一个小程序,它打开
/dev/ttyS0(一个串行端口)并观察接收到的内容。当 Ringaling 发现文本“RING”时,就通过 D-BUS 告知
Jamboree 减小音量。最终的结果是,如果您的计算机上插入了一个调制解调器,而且电话铃响,则音乐音量就会为您减小。 这正是计算机所追求的!

l 一些查看硬件信息的工具

lspci 列出所有PCI 设备。有两个参数是比较常用,-b 和-v,lspci也会把usb接口列出来。

lshal 列出系统硬件设备。

Usbmodules 列出可用于已插入usb设备的驱动模块。