RichardUSTC

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2013年12月16日

摘要: C#中所有的类型都有同一个基类object类型种类1. 值类型:简单类型、枚举类型、结构体类型、可空类型2. 引用类型:类类型、接口类型、数组类型、委托类型值类型可以通过boxing转换成引用类型,也可以从引用类型unboxing转换成值类型。转换过程中发生数据拷贝。内置类型sbyte/byte short/ushort int/uint long/ulong float double decimal bool char string注意:char类型跟C不一样,每一个char类型的变量可保存一个UTF-16字符,大小是2字节bool不能与整数类型相互转换decimal是用十进制存储的stri 阅读全文
posted @ 2013-12-16 00:07 RichardUSTC 阅读(279) 评论(0) 推荐(0) 编辑

2013年5月3日

摘要: 在某些情况下,我们可能需要去截获Linux操作系统的一些异常处理,比如截获page fault异常处理。可以修改内核的情况下 如果我们能够修改内核,那么截获page fault异常处理就会非常简单。以linux 3.8.0内核为例,系统中发生page fault之后,会进入page fault异常处理,调用do_page_fault函数。do_page_fault的代码如下:1 dotraplinkage void __kprobes2 do_page_fault(struct pt_regs *regs, unsigned long error_code)3 {4 except... 阅读全文
posted @ 2013-05-03 20:20 RichardUSTC 阅读(2648) 评论(3) 推荐(0) 编辑

2013年5月1日

摘要: 最近做的工作需要截获page_fault异常处理,需要模仿着原来的page fault异常处理例程写一个自己的异常处理例程。这个异常处理例程有一部分是汇编代码写的。反汇编原来的内核,发现这样一条指令66 66 90 data32 xchg %ax, %ax但是在汇编中,直接用asm("data32 xchg %ax, %ax);的方式没有办法编译通过。编译器总是报告:`data32' is not supported in 64 bit system. 而直接asm("xchg %ax, %ax");编译之后的汇编代码则只是66 90。尝试了不少办法,最终 阅读全文
posted @ 2013-05-01 11:38 RichardUSTC 阅读(1207) 评论(0) 推荐(0) 编辑

2013年4月26日

摘要: C++支持类的嵌套,其语法比较简单。代码是最好的说明。 1 #include <iostream> 2 using namespace std; 3 4 class Outter{ 5 public: 6 int a; 7 static int s; 8 //nested class and enclosing class are independent. 9 class Inner{ 10 public:11 int b;12 //nested c... 阅读全文
posted @ 2013-04-26 16:42 RichardUSTC 阅读(333) 评论(0) 推荐(0) 编辑

2013年4月25日

摘要: 从Linux内核的2.6某个版本开始,内核引入了导出符号的机制。只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用。然而,内核并没有导出所有的符号。例如,在3.8.0的内核中,do_page_fault就没有被导出。 而我的内核模块中需要使用do_page_fault,那么有那些方法呢?这些方法分别有什么优劣呢? 下面以do_page_fault为例,一一进行分析:修改内核,添加EXPORT_SYMBOL(do_page_fault)或EXPORT_SYMBOL_GPL(do_page_fault)。这种方法适用于可以修改内... 阅读全文
posted @ 2013-04-25 22:22 RichardUSTC 阅读(3493) 评论(0) 推荐(0) 编辑

2013年4月23日

摘要: 最近做的项目跟Linux内核的关系比较大,我们的项目需要在用户态触发一些内核态的代码运行。众所周知,内核态的代码是不能直接被用户态代码调用的,用户态代码触发内核态代码的必须要经过系统调用。为什么选择ioctl那么该如何实现我们的需求呢?有几种方法:改写内核,扩大系统调用表,添加新的系统调用利用内核模块,覆盖没被使用或这使用频率很低的一个系统调用的处理函数利用已有的系统调用,比如ioctl,来“实现”自定义的系统调用。第一种方法需要修改内核,适用面比较窄;第二种方法hack意味很浓,没有被使用的系统调用号有限,不同模块可能都使用这种机制,可能会产生冲突。最终我们选择了第三种方法。下面将一一道来。 阅读全文
posted @ 2013-04-23 16:01 RichardUSTC 阅读(1712) 评论(0) 推荐(1) 编辑

摘要: 类成员指针用法: 1 #include <iostream> 2 using namespace std; 3 4 class Test{ 5 public: 6 static int x; //static member 7 int y; 8 int foo(int i){ 9 return i;10 }11 int Test::* get_y_ptr(){12 return &Test::y;13 }14 };15 int Test::x... 阅读全文
posted @ 2013-04-23 12:52 RichardUSTC 阅读(193) 评论(0) 推荐(0) 编辑

摘要: 没有类型名,全局作用域的枚举,比如enum {x0, x1, x2}有类型名,全局作用域的枚举,比如enum var {y0, y1, y2}。前两种枚举中x0,x1,x2,y0,y1,y2的作用域是全局的,不能重复定义。比如第一种定义了x0,在enum var中就不能使用。有类型名的,有作用域的枚举,比如enum class color{red, blue, yellow}或enum struct color{red, blue, yellow}这中enum是C++11的特性。这里面的red、blue和yellow是限定在color内部的,必须以color::red的形式来使用。枚举值实际上 阅读全文
posted @ 2013-04-23 09:05 RichardUSTC 阅读(292) 评论(0) 推荐(0) 编辑

2013年4月21日

摘要: C++中支持多重继承,但是菱形继承会带来一些问题。比如D1和D2继承了B,而D又同时继承了D1和D2 1 class B{ 2 public: 3 int x; 4 }; 5 6 class D1:public B{ 7 }; 8 9 class D2:public B{10 };11 12 class D:public D1, public D2{13 };如果初始化一个D的对象,访问x就会产生歧义,因为D里面包含D1和D2的成员,而D1和D2各自有一份继承自B的x,编译器此时不知道该访问哪个x。而虚继承能够保证菱形继承中,父类B的成员只出现一次,避免这种歧义。1 cla... 阅读全文
posted @ 2013-04-21 16:38 RichardUSTC 阅读(139) 评论(0) 推荐(0) 编辑

2013年4月18日

摘要: C++异常处理的语法try{ ... throw aSomeException; ...}catch(SomeException e){ //code to handle the exception ... //optional rethrow throw; ...}或try{ ... //call a function that throws exception foo(); ...}catch(SomeException e){ //code to handle the exception ...}异常的特性:抛出异常如果没有被处... 阅读全文
posted @ 2013-04-18 17:13 RichardUSTC 阅读(202) 评论(0) 推荐(0) 编辑