1. std::functional,包括:
1.1 常用的数学运算工具。如plus/minus/multiplies/divides/modulus,equal_to/not_equal_to/greater/less/greater_equal/less_equal,logical_and/logical_or;
1.2 一套adaptor工具,根据已有的function object得到新的function object。如bind1st/bind2nd/not1/not2;
1.3 一套conversor工具,把普通的function pointer和member function转换成function object。如ptr_fun/mem_fun/mem_fun_ref;
std::functional各功能块的关系如图所示:
1.4 std::functional的局限:严格的类型匹配(不只是参数类型匹配),使std::functional的运用主要局限于具体的template算法中(如std::algorithm),而对系统框架/接口的设计没有太大帮助。
2. boost::functional
对std::functional的增强,主要集中在两点,一是避免references to references(参数是引用的引用,语法错误)的问题,二是可以消除ptr_fun这个conversor的使用
4. boost::lambda
就地生成匿名function object,有助于写出更清晰简洁的代码。类似于其它语言中的闭包(enclosure)
5. boost::function
一个function object封装器,能把接口相同(输入输出参数一致)的各种function object 封装在一起,完成类似C#中的delegate(委托)功能。boost::function能提供一个统一的interface,在系统设计时很有用。
缺点:1.比一般的function call或function object需要更多的运行时开销;2.有可能需要在Heap中分配内存。
Thursday, December 16, 2010
Wednesday, November 3, 2010
GRE protocol
1. RFC
RFC 1701 — Generic Routing Encapsulation (GRE) (INFORMATIONAL)
RFC 1702 — Generic Routing Encapsulation over IPv4 networks (INFORMATIONAL)
RFC 2784 — Generic Routing Encapsulation (GRE) (PROPOSED STANDARD - Updated by RFC 2890)
RFC 2890 — Key and Sequence Number Extensions to GRE (PROPOSED STANDARD)
2. RFC 1701 关键点
2.1 GRE是一个通用封装协议,GRE 协议只关心Header里头的flags, version, protocol type等域,其它如Key, Sequence Number, Routing 等域与应用相关,由具体应用决定它们的含义。
2.2 Routing. Routing信息包含在Source Route Entry (SRE) list中,每个SRE可以包含多个地址信息,一个GRE包可以包含多个SRE. 如果Routing信息存在的话,外层协议需要根据SRE list中指示的信息,依次路由。
如果SREs的Address Family是0x800(IP),则SRE的Routing Information域由一系列的IP地址组成。
RFC 1701 — Generic Routing Encapsulation (GRE) (INFORMATIONAL)
RFC 1702 — Generic Routing Encapsulation over IPv4 networks (INFORMATIONAL)
RFC 2784 — Generic Routing Encapsulation (GRE) (PROPOSED STANDARD - Updated by RFC 2890)
RFC 2890 — Key and Sequence Number Extensions to GRE (PROPOSED STANDARD)
2. RFC 1701 关键点
2.1 GRE是一个通用封装协议,GRE 协议只关心Header里头的flags, version, protocol type等域,其它如Key, Sequence Number, Routing 等域与应用相关,由具体应用决定它们的含义。
2.2 Routing. Routing信息包含在Source Route Entry (SRE) list中,每个SRE可以包含多个地址信息,一个GRE包可以包含多个SRE. 如果Routing信息存在的话,外层协议需要根据SRE list中指示的信息,依次路由。
如果SREs的Address Family是0x800(IP),则SRE的Routing Information域由一系列的IP地址组成。
Thursday, October 21, 2010
Singleton模式
1. 优点(相比于全局变量):
1.1 避免污染全局空间。
1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。
1.3 允许更灵活的实现策略。
2 缺点:
2.1 构造函数没法传递参数。
2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。
2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
http://www.ibm.com/developerworks/java/library/j-dcl.html
1.1 避免污染全局空间。
1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。
1.3 允许更灵活的实现策略。
2 缺点:
2.1 构造函数没法传递参数。
2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。
2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
http://www.ibm.com/developerworks/java/library/j-dcl.html
Monday, October 18, 2010
Type Container of Meta-programming
1. boost::tuple
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
TypeAt
IndexOf
Append
Erase
Replace
为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element< N, lmp::tuple >将返回lmp::null_type,而不是像boost::element < N, boost::tuple >那样由编译器报一个编译错误。
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
<TypeList >TypeAt
<TypeList, N >IndexOf
<TypeList, T >Append
<TypeList, T >Erase
<TypeList, T >Replace
<TypeList, T, U >为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
Sunday, September 19, 2010
Win32 GUI
1. Window概述
1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。
1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。
1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
1.2.2 客户区由应用程序管理,用于显示图形和文字信息。
1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。
1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.
Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。
2. 创建window
2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class
2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。
2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.
2.4 处理消息循环
2.5 销毁window (DestroyWindow() ).
3. Window类型
在调用 CreateWindowEx()函数时给dwStyle设置合适的值
3.1 Overlapped Windows: 一种 "top-level"的窗口, 通常用作应用程序的主窗口。
基本风格: title bar, border, and client area (WS_OVERLAPPED)
可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)
3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
基本风格: border and client area(WS_POPUP)
可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.
3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up
window, 或另外一个child window。Child Window必须有父窗口。
基本风格:不带任何窗口元素(WS_CHILD)
可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
子窗口的几个重要属性:
3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。
3.4 其它特色窗口类型
3.4.1 Layered Windows: 一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
4. Windows的主从关系(Owned window and Owner window)
主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。
4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).
4.2 有主从关系的windows有下列一些约束:
4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
4.2.2 当主窗口销毁时,从窗口自动销毁
4.2.3 当主窗口最小化时,从窗口自动隐藏
1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。
1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。
1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
1.2.2 客户区由应用程序管理,用于显示图形和文字信息。
1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。
1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.
Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。
2. 创建window
2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class
2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。
2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.
2.4 处理消息循环
2.5 销毁window (DestroyWindow() ).
3. Window类型
在调用 CreateWindowEx()函数时给dwStyle设置合适的值
3.1 Overlapped Windows: 一种 "top-level"的窗口, 通常用作应用程序的主窗口。
基本风格: title bar, border, and client area (WS_OVERLAPPED)
可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)
3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
基本风格: border and client area(WS_POPUP)
可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.
3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up
window, 或另外一个child window。Child Window必须有父窗口。
基本风格:不带任何窗口元素(WS_CHILD)
可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
子窗口的几个重要属性:
3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。
3.4 其它特色窗口类型
3.4.1 Layered Windows: 一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
4. Windows的主从关系(Owned window and Owner window)
主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。
4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).
4.2 有主从关系的windows有下列一些约束:
4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
4.2.2 当主窗口销毁时,从窗口自动销毁
4.2.3 当主窗口最小化时,从窗口自动隐藏
Friday, September 17, 2010
GTP(GPRS Tunnelling Protocol) 协议
1. GTP v1 for user plan. 3GPP TS 29.281. used in:
LTE-S1 (between eNodeB and SGW), control plan is S1AP
LTE-S5 (between SGW and PGW), control plan is GTPv2-C
LTE-X2 (between eNodeBs), control plan is X2AP
2. GTPv2-C for control plan. 3GPP TS 29.274. used in:
LTE-S5
LTE-S8
3. GTP (GTP-C and GTP-U) 3GPP TS 29.060. used in
Gn (between GSNs within a PLMN)
Gp (between GSNs in different PLMNs)
Iu (between SGSN and UTRAN), GTP-U only. The control plan is RANAP
4. GTP based charging protocol GTP'. 3GPP TS 32.295
LTE-S1 (between eNodeB and SGW), control plan is S1AP
LTE-S5 (between SGW and PGW), control plan is GTPv2-C
LTE-X2 (between eNodeBs), control plan is X2AP
2. GTPv2-C for control plan. 3GPP TS 29.274. used in:
LTE-S5
LTE-S8
3. GTP (GTP-C and GTP-U) 3GPP TS 29.060. used in
Gn (between GSNs within a PLMN)
Gp (between GSNs in different PLMNs)
Iu (between SGSN and UTRAN), GTP-U only. The control plan is RANAP
4. GTP based charging protocol GTP'. 3GPP TS 32.295
Friday, August 20, 2010
boost::MPL - basic tools
1. lambda表达式:一种元数据(metadata)。有两种表达方式,一是普通的元数据类,二是占位符表达式(placeholder expressions)。占位符表达式的本质是把第n个元数据封装成一个元数据类。
如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:
struct arg<1>
{
template <class A1, class A2 > ;
struct apply
{
typedef A1 type; // return first argument
}
};
整个语句的含义相当于:
struct Temp
{
template<typename Arg1, typename Arg2>
struct apply {
typedef mpl::plus<Arg1, Arg2> type;
};
}
2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。
3.有价值的概念
3.1 compile time to runtime mapping,
用途: 从mataprogramming 转到
工具:mpl::for_each<>, boost::fusion
3.2 runtime to compile time mapping。
用途:提供缓式计算,避免不必要的运行时开销,提高性能
工具:参照blitz++
3.3 闭包
3.4 命名参数
用途:函数接受大量参数时,简化参数传递
工具:
如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:
struct arg<1>
{
template <class A1, class A2 >
struct apply
{
typedef A1 type; // return first argument
}
};
整个语句的含义相当于:
struct Temp
{
template<typename Arg1, typename Arg2>
struct apply {
typedef mpl::plus<Arg1, Arg2> type;
};
}
2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。
3.有价值的概念
3.1 compile time to runtime mapping,
用途: 从mataprogramming 转到
工具:mpl::for_each<>, boost::fusion
3.2 runtime to compile time mapping。
用途:提供缓式计算,避免不必要的运行时开销,提高性能
工具:参照blitz++
3.3 闭包
3.4 命名参数
用途:函数接受大量参数时,简化参数传递
工具:
boost::MPL - Conceptions
1. MPL 的几个重要概念。
1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:
template <int base, int power>
struct Power
{
static const int value = base * Power ::value;
};
template <int base>
struct Power <base, 0>
{
static const int value = 1;
};
int _3power5 = Power<3, 5>::value;
1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。
元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。
template <bool condition, class L, class R >
struct Selector
{
typedef L type;
};
template <class L, class R >
struct Selector <false, L, R >
{
typedef R type;
};
Selector<true, int, float>::type _int = 10; // int
Selector<false, int, float>::type _float = 1.23; // float
1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).
struct SelectorWrapper
{
template<bool condition, class L, class R>
struct apply
{
typedef typename Selector<condition, L, R>::type type;
};
};
SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int
1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。
1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform
template<class F, class X>
struct high_order_fun
{
typedef typename F::template apply::type type;
};
1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:
template
{
static const int value = base * Power
};
template
static const int value = 1;
};
int _3power5 = Power<3, 5>::value;
1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。
元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。
template
struct Selector
{
typedef L type;
};
template
struct Selector
{
typedef R type;
};
Selector<true, int, float>::type _int = 10; // int
Selector<false, int, float>::type _float = 1.23; // float
1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).
struct SelectorWrapper
{
template<bool condition, class L, class R>
struct apply
{
typedef typename Selector<condition, L, R>::type type;
};
};
SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int
1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。
1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform
template<class F, class X>
struct high_order_fun
{
typedef typename F::template apply
};
Thursday, August 19, 2010
notus
1.简介。
http://notus.sourceforge.net/
notus是win32下的一个轻量GUI库,依赖c++ template技术,实现Model-Strategies-View模型。
优点:1) 轻量,高效。大量使用template技术,直接调用平台native的GUI实现。
2) 理论上说,可以有很强的可移植性。
缺点:1) 缺乏维护,多年未有更新。一些基本操作没有很好封装,显得繁琐。
2) 对GUI模型的抽象度不是特别的好,对Win32有过强的依赖。
2. 的模块结构
3.view的组成。一个view是由一个Display,一个Strategies组以及一个model_controller组成。
4. Strategies的构成。strategies是由boost::tuple组成的一个strategy集合,当收到event时,遍历该集合,调用适当strategy。遍历过程是编译时处理的,不影响运行时速度。
5. Display中可用的组件。这些组件都是抽象的接口,依赖于impl包中对于不同平台的具体实现。由于直接使用平台相关的native implementation,所以程序效率很高。
6. 典型的消息过程
http://notus.sourceforge.net/
notus是win32下的一个轻量GUI库,依赖c++ template技术,实现Model-Strategies-View模型。
优点:1) 轻量,高效。大量使用template技术,直接调用平台native的GUI实现。
2) 理论上说,可以有很强的可移植性。
缺点:1) 缺乏维护,多年未有更新。一些基本操作没有很好封装,显得繁琐。
2) 对GUI模型的抽象度不是特别的好,对Win32有过强的依赖。
2. 的模块结构
3.view的组成。一个view是由一个Display,一个Strategies组以及一个model_controller组成。
4. Strategies的构成。strategies是由boost::tuple组成的一个strategy集合,当收到event时,遍历该集合,调用适当strategy。遍历过程是编译时处理的,不影响运行时速度。
5. Display中可用的组件。这些组件都是抽象的接口,依赖于impl包中对于不同平台的具体实现。由于直接使用平台相关的native implementation,所以程序效率很高。
6. 典型的消息过程
Wednesday, August 18, 2010
Makefile
1. Makefile的自动变量
"$@": 规则中的目标文件名。如果规则中有多个目标(使用'%'匹配模式),那"$@"就是触发该规则的目标文件名。
"$<": 依赖目标中的第一个目标名字。
"$?": 所有比目标新的依赖目标的集合,以空格分隔。
"$^ ": 所有的依赖目标的集合,以空格分隔。如果某个文件在依赖中重复,那这个变量会去除重复,只保留一份。
"$+ ": 与"$^"很接近,也是所有依赖目标的集合。只是它不去除重复的依赖。
"$*": 1) 对于明确规则(explicit rule), 如果目标文件的后缀是Make系统认识的,则"$*"代表目标名减去后缀部分。如bar/foo.c, $* = bar/foo
2) 对于隐含规则(implicit rule), "$*"包含了目标文件的主干部分。
"$@": 规则中的目标文件名。如果规则中有多个目标(使用'%'匹配模式),那"$@"就是触发该规则的目标文件名。
"$<": 依赖目标中的第一个目标名字。
"$?": 所有比目标新的依赖目标的集合,以空格分隔。
"$^ ": 所有的依赖目标的集合,以空格分隔。如果某个文件在依赖中重复,那这个变量会去除重复,只保留一份。
"$+ ": 与"$^"很接近,也是所有依赖目标的集合。只是它不去除重复的依赖。
"$*": 1) 对于明确规则(explicit rule), 如果目标文件的后缀是Make系统认识的,则"$*"代表目标名减去后缀部分。如bar/foo.c, $* = bar/foo
2) 对于隐含规则(implicit rule), "$*"包含了目标文件的主干部分。
WiMax - Control Plane Protocols and Procedures
1. Network Entry Discovery and Selection/Re-selection
1.1 NAP Discovery: MS在检测到的channel上,通过解码和扫描ASN的DL-MAP,来检测NAPs. NAP_ID即Operator ID,用Base Station ID的高24bit来表示。
1.2 NSP Discovery:一个NAP可以支持一个或多个NSP。The list of NSP IDs and verbose NSP names presented over the air interface as part of SII-ADV and/or SBC-RSP, and all NSP realms that can be obtained using SBC-REQ/RSP SHALL be uniform across all Base Stations of the same NAP ID
MS顺序地对每个NAP执行NSP Discovery 操作;
1.3 NSP Enumeration and Selection:WiMax支持手动和自动两种网络选择模式,在发现的NSP中做出选择
1.4 ASN Attachment:选择好NSP之后,MS选择一个与该NSP相关连的ASN,使用NAI执行Attach过程。
2. WiMax密钥
2.1 MS与Home NSP,通过EAP协议完成用户的身份验证功能。验证成功后,产生MSK和EMSK。
2.1.1 MSK通过AAA协议传递到MS当前的NAS,用于生成密钥来保护R1(MS <-> BS)接口的数据传输。
2.1.2 EMSK保存在MS和EAP验证服务器中,用于生成MIP-RK来保护Mobile IP的信令数据。
3. AAA
3.1 For device authentication based on X.509 certificates, MS SHALL support EAP-TLS, Username of the NAI presented in EAP-Response/Identity SHALL be the MAC Address of the device.
3.2 For user authentication, MS SHALL support at least one of EAP-AKA [18] or EAP-TTLS [19]. When EAP-TTLS is used, the MS and AAA SHALL support TTLS version 0 [19] and MS-CHAPv2 [20] as a tunneled authentication protocol.
3.3 NAI.
3.3.1 Outer-Identity, In EAP the outer identity refers to the NAI delivered by the EAP-Peer in the EAP-Identity Response. The RADIUS User-Name attribute is set to this value in the Access-Request. The AAA infrastructure routes the AAA packets according to the information contained in this attribute.
1.1 NAP Discovery: MS在检测到的channel上,通过解码和扫描ASN的DL-MAP,来检测NAPs. NAP_ID即Operator ID,用Base Station ID的高24bit来表示。
1.2 NSP Discovery:一个NAP可以支持一个或多个NSP。The list of NSP IDs and verbose NSP names presented over the air interface as part of SII-ADV and/or SBC-RSP, and all NSP realms that can be obtained using SBC-REQ/RSP SHALL be uniform across all Base Stations of the same NAP ID
MS顺序地对每个NAP执行NSP Discovery 操作;
1.3 NSP Enumeration and Selection:WiMax支持手动和自动两种网络选择模式,在发现的NSP中做出选择
1.4 ASN Attachment:选择好NSP之后,MS选择一个与该NSP相关连的ASN,使用NAI执行Attach过程。
2. WiMax密钥
2.1 MS与Home NSP,通过EAP协议完成用户的身份验证功能。验证成功后,产生MSK和EMSK。
2.1.1 MSK通过AAA协议传递到MS当前的NAS,用于生成密钥来保护R1(MS <-> BS)接口的数据传输。
2.1.2 EMSK保存在MS和EAP验证服务器中,用于生成MIP-RK来保护Mobile IP的信令数据。
3. AAA
3.1 For device authentication based on X.509 certificates, MS SHALL support EAP-TLS, Username of the NAI presented in EAP-Response/Identity SHALL be the MAC Address of the device.
3.2 For user authentication, MS SHALL support at least one of EAP-AKA [18] or EAP-TTLS [19]. When EAP-TTLS is used, the MS and AAA SHALL support TTLS version 0 [19] and MS-CHAPv2 [20] as a tunneled authentication protocol.
3.3 NAI.
3.3.1 Outer-Identity, In EAP the outer identity refers to the NAI delivered by the EAP-Peer in the EAP-Identity Response. The RADIUS User-Name attribute is set to this value in the Access-Request. The AAA infrastructure routes the AAA packets according to the information contained in this attribute.
Tuesday, August 17, 2010
WiMAX -- 网络结构和参考点
1. 功能体和参考点
几个重要的概念:
1.1 Access Service Network (ASN):defined as a complete set of network functions needed to provide radio access to a WiMAX subscriber(为WiMAX用户提供无线接入服务的一个功能体)
1.2 Network Access Provider (NAP):NAP is a business entity that provides WiMAX radio access infrastructure to one or more WiMAX Network Service Providers (NSPs). A NAP implements this infrastructure using one or more ASNs(为WiMAX运营商提供无线接入服务的基础设施,由一个或多个ASN组成。是一个商业上的概念)
1.3 Connectivity Service Network (CSN):Connectivity Service Network (CSN) is defined as a set of network functions that provide IP connectivity services to the WiMAX subscriber(s).(为WiMAX用户提供IP联接服务的功能体)
1.4 Network Service Provider (NSP): NSP is a business entity that provides IP connectivity and WiMAX services to WiMAX subscribers compliant with the Service Level Agreement it establishes with WiMAX subscribers. (为注册用户提供IP联接和其他WiMAX服务,是一个商业上的概念)
2. 组网方式。WiMAX可以采用灵活的组网方式,一个BS可以同时接入多个ASN-GW;一个ASN可以同时接入多个CSN,并且,这些CSN可以属于不同的Service provider.
3. 传输层的协议结构,分为控制面(CP)和数据(UP)面两种。控制面的消息直接在MAC(R1)或IP(R3/R6)上传递;用户面的消息在R3/R6上通过IP隧道传递。
4. 主要协议
4.1 IP地址分配: DHCP
4.2 AAA: RADIUS + EAP
4.3 移动性管理: MIPv4(Client MIP, ProxyMIP), IPv6
参考文献:
[1] WMF-T32-002-R010v04_Network-Stage2-Part1
[2] WMF-T32-003-R010v04_Network-Stage2-Part2
Friday, August 6, 2010
Performance tunning
1. 性能优化的一般步骤。
1.1 首先,在系统一级进行。在网络IO性能,磁盘性能,内存使用率等地方找出瓶颈,可用的分析工具有任务管理器,windows自带的perfmon.exe等。一般情况下这是花精力少,见效明显的方法。
1.2 其次,从应用程序的角度进行,关注锁等共享资源的竞争,调整程序结构,优化运算的并行度。这个步骤能取得的效果与应用程序的特性有关。
1.3 最后,从CPU硬件结构的角度进行,关注Cache的使用,总线使用效率等。对于Intel的CPU,可用工具有"Intel VTune Performance Analyzer"。这个步骤稍微复杂一些,但对于某些特定的应用,能轻易地提高一倍以上的运算效率,原因有二:1) CPU访问Cache的效率比访问内存快上几个数量级;2)在多核情况下,内存总线经常成为计算机系统的性能瓶颈。
2. Intel VTune Performance Analyzer工具的使用。vTune提供两种采样模式
time-based sampling:
event-based sampling: 使用Processor内部的计数器来统计软件的工作状态,不同的CPU构架有不同的Event,所以使用前必须先了解CPU类型
常用的评估参数
2.1 Cycles per Retired Instruction (CPI) = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY
统计每条指令所花的时钟周期数,越小越好。由于多流水线结构,CPU能在一个时钟周期完成多条指令,即CPI远小于1
2.2 Excution Stalled rate = (UOPS_EXECUTED.CORE_STALL_CYCLES / (UOPS_EXECUTED.CORE_STALL_CYCLES + UOPS_EXECUTED.CORE_ACTIVE_CYCLES) ) * 100
2.3 L2 Cache Miss Impact
2.4 Branch Misprediction Ratio
2.5 Bus Utilization Ratio
3 Core i7, Xeon 5500系列CPU常用的event
CPU_CLK_UNHALTED.THREAD: counter measures unhalted clockticks on a per thread basis.So for each tick of the CPU's clock, the counter will count 2 ticks if Hyper-Threading is enabled, 1 tick if Hyper-Threading is disabled. There is no per-core clocktick counter.
CPU_CLK_UNHALTED.REF: counts unhalted clockticks per thread, at the reference frequency for the CPU. In other words, the CPU_CLK_UNHALTED.REF counter should not increase or decrease as a result of frequency changes due to Turbo Mode or Speedstep Technology
UOPS_EXECUTED.CORE_STALL_CYCLES: counter measures when the EXECUTION stage of the pipeline is stalled. This counter counts per CORE, not per thread.
UOPS_EXECUTED.CORE_ACTIVE_CYCLES:
INST_RETIRED.ANY
1.1 首先,在系统一级进行。在网络IO性能,磁盘性能,内存使用率等地方找出瓶颈,可用的分析工具有任务管理器,windows自带的perfmon.exe等。一般情况下这是花精力少,见效明显的方法。
1.2 其次,从应用程序的角度进行,关注锁等共享资源的竞争,调整程序结构,优化运算的并行度。这个步骤能取得的效果与应用程序的特性有关。
1.3 最后,从CPU硬件结构的角度进行,关注Cache的使用,总线使用效率等。对于Intel的CPU,可用工具有"Intel VTune Performance Analyzer"。这个步骤稍微复杂一些,但对于某些特定的应用,能轻易地提高一倍以上的运算效率,原因有二:1) CPU访问Cache的效率比访问内存快上几个数量级;2)在多核情况下,内存总线经常成为计算机系统的性能瓶颈。
2. Intel VTune Performance Analyzer工具的使用。vTune提供两种采样模式
time-based sampling:
event-based sampling: 使用Processor内部的计数器来统计软件的工作状态,不同的CPU构架有不同的Event,所以使用前必须先了解CPU类型
常用的评估参数
2.1 Cycles per Retired Instruction (CPI) = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY
统计每条指令所花的时钟周期数,越小越好。由于多流水线结构,CPU能在一个时钟周期完成多条指令,即CPI远小于1
2.2 Excution Stalled rate = (UOPS_EXECUTED.CORE_STALL_CYCLES / (UOPS_EXECUTED.CORE_STALL_CYCLES + UOPS_EXECUTED.CORE_ACTIVE_CYCLES) ) * 100
2.3 L2 Cache Miss Impact
2.4 Branch Misprediction Ratio
2.5 Bus Utilization Ratio
3 Core i7, Xeon 5500系列CPU常用的event
CPU_CLK_UNHALTED.THREAD: counter measures unhalted clockticks on a per thread basis.So for each tick of the CPU's clock, the counter will count 2 ticks if Hyper-Threading is enabled, 1 tick if Hyper-Threading is disabled. There is no per-core clocktick counter.
CPU_CLK_UNHALTED.REF: counts unhalted clockticks per thread, at the reference frequency for the CPU. In other words, the CPU_CLK_UNHALTED.REF counter should not increase or decrease as a result of frequency changes due to Turbo Mode or Speedstep Technology
UOPS_EXECUTED.CORE_STALL_CYCLES: counter measures when the EXECUTION stage of the pipeline is stalled. This counter counts per CORE, not per thread.
UOPS_EXECUTED.CORE_ACTIVE_CYCLES:
INST_RETIRED.ANY
Thursday, July 15, 2010
Mobile IP for IPv4
1. IP Mobility Support for IPv4, rfc3344.
1.1 Mobile IP引入3个功能体.
1.1.1 Mobile Node: 一个主机,可以在改变网络接入位置的情况下(接入不同的子网),不改变通讯的IP地址。
1.1.2 Home Agent: 一般情况下,是MN的归属网络上的路由器。负责 a)维护属于该HA的MN的位置信息;b)MN离开归属网络时,为MN转发数据。
1.1.3 Foreign Agent: 一般情况下,是MN当前访问网络上的路由器。当MN在上面注册时,提供路由服务。
1.2 Mobile IP的主要过程.
2. Mobile IP Network Access Identifier Extension for IPv4, rfc2794
在MN(Mobile Node)不知道Home Address的情况下,MN可以使用AAA的NAI(Network Access Identifier)用于身份识别。这时,Registration Request消息中的Home Address域要被设置成全零,并增加一个Mobile Node NAI的附加域。
FA (Foreign Agent)收到Registration Request消息后,如果发现Home Address为全零,则应该使用NAI进行消息路由。
1.1 Mobile IP引入3个功能体.
1.1.1 Mobile Node: 一个主机,可以在改变网络接入位置的情况下(接入不同的子网),不改变通讯的IP地址。
1.1.2 Home Agent: 一般情况下,是MN的归属网络上的路由器。负责 a)维护属于该HA的MN的位置信息;b)MN离开归属网络时,为MN转发数据。
1.1.3 Foreign Agent: 一般情况下,是MN当前访问网络上的路由器。当MN在上面注册时,提供路由服务。
1.2 Mobile IP的主要过程.
2. Mobile IP Network Access Identifier Extension for IPv4, rfc2794
在MN(Mobile Node)不知道Home Address的情况下,MN可以使用AAA的NAI(Network Access Identifier)用于身份识别。这时,Registration Request消息中的Home Address域要被设置成全零,并增加一个Mobile Node NAI的附加域。
FA (Foreign Agent)收到Registration Request消息后,如果发现Home Address为全零,则应该使用NAI进行消息路由。
Thursday, July 8, 2010
Wednesday, July 7, 2010
EAP
1. Extensible Authentication Protocol (EAP), rfc3748
1.1 EAP 定义了一个身份验证的框架,支持多种验证算法。
1.2 EAP 对下层的传输协议没有依赖,自己提供可靠传输。具体来说,采用一一应答的方式,每一时刻处于传输过程中的消息只有一个。这种方式效率比较低,不适合用作大量数据传输。
1.3 EAP 复用模型
1.3.1 Lower layer. The lower layer is responsible for transmitting and receiving EAP frames between the peer and authenticator.
1.3.2 EAP layer. The EAP layer receives and transmits EAP packets via the lower layer, implements duplicate detection and retransmission, and delivers and receives EAP messages to and from the EAP peer and authenticator layers.
1.3.3 EAP peer and authenticator layers. Based on the Code field, the EAP layer demultiplexes incoming EAP packets to the EAP peer and authenticator layers.
1.3.4 EAP method layers. EAP methods implement the authentication algorithms and receive and transmit EAP messages via the EAP peer and authenticator layers.
1.4 EAP一共支持4种消息:Request/Response/Success/Failure
2. RADIUS Support For Extensible Authentication Protocol (EAP); rfc3579
2.1 In RADIUS/EAP, RADIUS is used to shuttle RADIUS-encapsulated EAP Packets between the NAS and an authentication server. EAP-Message and Message-Authenticator attributes are introduced to support EAP.
2.2 Example
3. The EAP-TLS Authentication Protocol; rfc5216
3.1 EAP-TLS (Transport Layer Security) 在EAP协议的基础上,提供了一种 "certificate-based" 双向的身份验证和密钥生成机制
4. Basic case
1.1 EAP 定义了一个身份验证的框架,支持多种验证算法。
1.2 EAP 对下层的传输协议没有依赖,自己提供可靠传输。具体来说,采用一一应答的方式,每一时刻处于传输过程中的消息只有一个。这种方式效率比较低,不适合用作大量数据传输。
1.3 EAP 复用模型
1.3.1 Lower layer. The lower layer is responsible for transmitting and receiving EAP frames between the peer and authenticator.
1.3.2 EAP layer. The EAP layer receives and transmits EAP packets via the lower layer, implements duplicate detection and retransmission, and delivers and receives EAP messages to and from the EAP peer and authenticator layers.
1.3.3 EAP peer and authenticator layers. Based on the Code field, the EAP layer demultiplexes incoming EAP packets to the EAP peer and authenticator layers.
1.3.4 EAP method layers. EAP methods implement the authentication algorithms and receive and transmit EAP messages via the EAP peer and authenticator layers.
1.4 EAP一共支持4种消息:Request/Response/Success/Failure
2. RADIUS Support For Extensible Authentication Protocol (EAP); rfc3579
2.1 In RADIUS/EAP, RADIUS is used to shuttle RADIUS-encapsulated EAP Packets between the NAS and an authentication server. EAP-Message and Message-Authenticator attributes are introduced to support EAP.
2.2 Example
3. The EAP-TLS Authentication Protocol; rfc5216
3.1 EAP-TLS (Transport Layer Security) 在EAP协议的基础上,提供了一种 "certificate-based" 双向的身份验证和密钥生成机制
4. Basic case
Monday, July 5, 2010
RADIUS
1. Remote Authentication Dial In User Service (RADIUS), rfc2865
RADIUS本身是个比较简单的协议,支持远程身份验证和Proxy. 通过下面几个消息,配合user-name, user-password等Attributes完成身份验证和用户配置功能。典型的应用有PPP验证等。
Access-Request
Access-Accept
Access-Reject
Access-Challenge
RADIUS使用UDP协议来传递数据,IANA端口为 1812
2. RADIUS Accounting, rfc2866
RADIUS协议的扩展,支持从Network Access Server (NAS) 到 RADIUS accounting server传递计费信息。IANA端口 1813
在服务开始和结束的时候,RADIUS Accounting Client发送Accounting-Request消息到RADIUS Accounting server,服务状态在Attribute中说明。 Server接受这条消息时,返回Accounting-Response消息,否则,什么也不返回。Client超时后,可能重发这条Request消息,也可能重建一条消息发送给备用服务器。
3. Dynamic Authorization Extensions to RADIUS, rfc3576
RADIUS协议扩展,允许RADIUS server主动发起会话,动态地修改用户的session。比如改变用户的授权,或者断开该用户的连接。
Disconnect-Request
Disconnect-ACK
Disconnect-NAK
CoA(Change-of-Authorization)-Request
CoA(Change-of-Authorization)-ACK
CoA(Change-of-Authorization)-NAK
RADIUS本身是个比较简单的协议,支持远程身份验证和Proxy. 通过下面几个消息,配合user-name, user-password等Attributes完成身份验证和用户配置功能。典型的应用有PPP验证等。
Access-Request
Access-Accept
Access-Reject
Access-Challenge
RADIUS使用UDP协议来传递数据,IANA端口为 1812
2. RADIUS Accounting, rfc2866
RADIUS协议的扩展,支持从Network Access Server (NAS) 到 RADIUS accounting server传递计费信息。IANA端口 1813
在服务开始和结束的时候,RADIUS Accounting Client发送Accounting-Request消息到RADIUS Accounting server,服务状态在Attribute中说明。 Server接受这条消息时,返回Accounting-Response消息,否则,什么也不返回。Client超时后,可能重发这条Request消息,也可能重建一条消息发送给备用服务器。
3. Dynamic Authorization Extensions to RADIUS, rfc3576
RADIUS协议扩展,允许RADIUS server主动发起会话,动态地修改用户的session。比如改变用户的授权,或者断开该用户的连接。
Disconnect-Request
Disconnect-ACK
Disconnect-NAK
CoA(Change-of-Authorization)-Request
CoA(Change-of-Authorization)-ACK
CoA(Change-of-Authorization)-NAK
Monday, June 28, 2010
MinGW and DLL
http://wyw.dcweb.cn/dllfaq.htm
A. Assume we have a testdll.h, testdll.c, and testmain.c. In the first case, we will compile testdll.c with MinGW, and let the MSVC-compiled testmain call it. You should use
gcc -shared -o testdll.dll testdll.c \
-Wl,--output-def,testdll.def,--out-implib,libtestdll.a
to produce the DLL and DEF files. MSVC cannot use the MinGW library, but since you have already the DEF file you may easily produce one by the Microsoft LIB tool:
lib /machine:i386 /def:testdll.def
Once you have testdll.lib, it is trivial to produce the executable with MSVC:
cl testmain.c testdll.lib
Now for MinGW programs calling an MSVC DLL. We have two methods. One way is to specify the LIB files directly on the command line after the main program (in newer MinGW versions; MinGW GCC 2.95.2 is reported not to work). For example, after
cl /LD testdll.c
use
gcc -o testmain testmain.c testdll.lib
The other way is to produce the .a files for GCC. For __cdecl functions (in most cases), it is simple: you only need to apply the reimp tool (the original site is unavailable now, but you may download here a version enhanced by José Fonseca):
reimp testdll.lib
gcc -o testmain testmain.c -L. -ltestdll
However, the above method does not work with __stdcall functions. For MSVC will prefix an underscore to __stdcall functions while MinGW will not. The right way is to produce the DEF file using the pexports tool (downloadable here if not found elsewhere) and filter off the first underscore by sed:
pexports testdll.dll | sed "s/^_//" > testdll.def
Then, when using dlltool to produce the import library, add `-U' to the command line:
dlltool -U -d testdll.def -l libtestdll.a
And now, you can proceed in the usual way:
gcc -o testmain testmain.c -L. -ltestdll
A. Assume we have a testdll.h, testdll.c, and testmain.c. In the first case, we will compile testdll.c with MinGW, and let the MSVC-compiled testmain call it. You should use
gcc -shared -o testdll.dll testdll.c \
-Wl,--output-def,testdll.def,--out-implib,libtestdll.a
to produce the DLL and DEF files. MSVC cannot use the MinGW library, but since you have already the DEF file you may easily produce one by the Microsoft LIB tool:
lib /machine:i386 /def:testdll.def
Once you have testdll.lib, it is trivial to produce the executable with MSVC:
cl testmain.c testdll.lib
Now for MinGW programs calling an MSVC DLL. We have two methods. One way is to specify the LIB files directly on the command line after the main program (in newer MinGW versions; MinGW GCC 2.95.2 is reported not to work). For example, after
cl /LD testdll.c
use
gcc -o testmain testmain.c testdll.lib
The other way is to produce the .a files for GCC. For __cdecl functions (in most cases), it is simple: you only need to apply the reimp tool (the original site is unavailable now, but you may download here a version enhanced by José Fonseca):
reimp testdll.lib
gcc -o testmain testmain.c -L. -ltestdll
However, the above method does not work with __stdcall functions. For MSVC will prefix an underscore to __stdcall functions while MinGW will not. The right way is to produce the DEF file using the pexports tool (downloadable here if not found elsewhere) and filter off the first underscore by sed:
pexports testdll.dll | sed "s/^_//" > testdll.def
Then, when using dlltool to produce the import library, add `-U' to the command line:
dlltool -U -d testdll.def -l libtestdll.a
And now, you can proceed in the usual way:
gcc -o testmain testmain.c -L. -ltestdll
Thursday, June 17, 2010
GSM A-interface (BSS - MSC)
1. 基本描述: ts 48.001
2. BSS - MSC 功能划分原则:ts 48.002
2.1 一般来说,用 MSC( Mobile Core Network) 代表核心网的用户面和控制面。有些情况下,MSC被分为两部分MSC-Server(MSC-S)和Media Gateway(MGW).
2.2 Mobility management
All transactions concerning mobility management (as specified in 3GPP TS 44.018) shall take place transparently between the MS and MSC/VLR/HLR, using the protocols described in Technical Specifications 3GPP TS 48.008 and 3GPP TS 48.006. The only exception to this rule is that of paging which is scheduled by the BSS on the appropriate cell.
2.3 Call control 由 MSC/HLR/VLR 负责
3. 信令传输: ts 48.006
3.1 The MTP and the SCCP are used to support signalling messages between the MSC and the BSS
3.2 One user function of the SCCP, called BSS Application Part (BSSAP) is defined. In the case of point-to-point calls the BSSAP uses one signalling connection per active Mobile Station having one or more active transactions for the transfer of layer 3 messages. The BSSAP user function is further subdivided into two separate functions:
3.2.1 he Direct Transfer Application sub-Part (DTAP) is used to transfer messages between the MSC and the MS; the layer-3 information in these messages is not interpreted by the BSS.
3.2.2 he BSS Management Application sub-Part (BSSMAP) supports other procedures between the MSC and the BSS related to the MS (resource management, handover control), or to a cell within the BSS, or to the whole BSS.
4. L3 specifications: ts 48.008
4.1 BSC负责管理本地的无线资源
4.2 CC(call control) 和MM(Mobility Management)消息,BSS使用DTAP协议传递给MSC,不做处理
4.3 从Radio收到的initial L3 message,BSS初步分析后使用BSSMAP的COMPLETE LAYER 3 INFORMATION消息传递给MSC.(eg. CM SERVICE REQUEST, PAGING RESPONSE, CM REESTABLISHMENT REQUEST, LOCATION UPDATING REQUEST, IMSI DETACH, IMMEDIATE SETUP)
2. BSS - MSC 功能划分原则:ts 48.002
2.1 一般来说,用 MSC( Mobile Core Network) 代表核心网的用户面和控制面。有些情况下,MSC被分为两部分MSC-Server(MSC-S)和Media Gateway(MGW).
2.2 Mobility management
All transactions concerning mobility management (as specified in 3GPP TS 44.018) shall take place transparently between the MS and MSC/VLR/HLR, using the protocols described in Technical Specifications 3GPP TS 48.008 and 3GPP TS 48.006. The only exception to this rule is that of paging which is scheduled by the BSS on the appropriate cell.
2.3 Call control 由 MSC/HLR/VLR 负责
3. 信令传输: ts 48.006
3.1 The MTP and the SCCP are used to support signalling messages between the MSC and the BSS
3.2 One user function of the SCCP, called BSS Application Part (BSSAP) is defined. In the case of point-to-point calls the BSSAP uses one signalling connection per active Mobile Station having one or more active transactions for the transfer of layer 3 messages. The BSSAP user function is further subdivided into two separate functions:
3.2.1 he Direct Transfer Application sub-Part (DTAP) is used to transfer messages between the MSC and the MS; the layer-3 information in these messages is not interpreted by the BSS.
3.2.2 he BSS Management Application sub-Part (BSSMAP) supports other procedures between the MSC and the BSS related to the MS (resource management, handover control), or to a cell within the BSS, or to the whole BSS.
4. L3 specifications: ts 48.008
4.1 BSC负责管理本地的无线资源
4.2 CC(call control) 和MM(Mobility Management)消息,BSS使用DTAP协议传递给MSC,不做处理
4.3 从Radio收到的initial L3 message,BSS初步分析后使用BSSMAP的COMPLETE LAYER 3 INFORMATION消息传递给MSC.(eg. CM SERVICE REQUEST, PAGING RESPONSE, CM REESTABLISHMENT REQUEST, LOCATION UPDATING REQUEST, IMSI DETACH, IMMEDIATE SETUP)
Wednesday, February 24, 2010
XML
"The skew.org XML Tutorial"
http://skew.org/xml/tutorial/
"C/C++ developers: Fill your XML toolbox"
http://www.ibm.com/developerworks/xml/library/x-ctlbx.html
Simple C++ XML tools (DOM)
RapidXML
http://rapidxml.sourceforge.net/
TinyXML
http://www.grinninglizard.com/tinyxml/
pugixml
http://code.google.com/p/pugixml/
http://skew.org/xml/tutorial/
"C/C++ developers: Fill your XML toolbox"
http://www.ibm.com/developerworks/xml/library/x-ctlbx.html
Simple C++ XML tools (DOM)
RapidXML
http://rapidxml.sourceforge.net/
TinyXML
http://www.grinninglizard.com/tinyxml/
pugixml
http://code.google.com/p/pugixml/
Monday, January 18, 2010
多核、多CPU环境下的程序开发
要点:
1. 任务划分,这点最关键。
1.1 对任务做充分理解,分清是数据密集型应用还是计算密集型计算。如果是数据密集型应用,则应该尽量提高总线的使用率(FSB, QPI等);而计算密集型应用,则应该提高CPU的使用率。
1.2 找出尽可能多的并行部分(任务分解,数据分解);
1.3 分析这些并行部分的特点,组成合适的并行任务
2. 资源本地化。尽量使所有的线程可以无条件地并发。
2.1 对于Non-Uniform Memory Access(NUMA) 结构的系统(多CPU的server,带QPI技术的intel多核处理器,带HyperTransport技术的AMD多核处理器),注意内存的分配位置。
3.充分利用Intel/AMD CPU的硬件特征。
3.1 充分利用CPU的本地cache
3.2 防止cache伪共享
3.3 系统内核同步?
3.4 数据密集型计算,注意NUMA特性.
可用技术:
Boost::thread
OpenMP
Intel Thread building block
MPI
语言内建的并行支持 (C#,Java等)
1. 任务划分,这点最关键。
1.1 对任务做充分理解,分清是数据密集型应用还是计算密集型计算。如果是数据密集型应用,则应该尽量提高总线的使用率(FSB, QPI等);而计算密集型应用,则应该提高CPU的使用率。
1.2 找出尽可能多的并行部分(任务分解,数据分解);
1.3 分析这些并行部分的特点,组成合适的并行任务
2. 资源本地化。尽量使所有的线程可以无条件地并发。
2.1 对于Non-Uniform Memory Access(NUMA) 结构的系统(多CPU的server,带QPI技术的intel多核处理器,带HyperTransport技术的AMD多核处理器),注意内存的分配位置。
3.充分利用Intel/AMD CPU的硬件特征。
3.1 充分利用CPU的本地cache
3.2 防止cache伪共享
3.3 系统内核同步?
3.4 数据密集型计算,注意NUMA特性.
可用技术:
Boost::thread
OpenMP
Intel Thread building block
MPI
语言内建的并行支持 (C#,Java等)
Subscribe to:
Posts (Atom)