2007年11月5日星期一

Open source!

最近看到Open Handset Alliance也宣布于12月12日公布SDK,这回喜欢open source的人又有福了,哈哈我就是其中之一。
我的理念就是知识是全世界的财富,需要公布给全世界人知道。所以我很支持开源,进而我最喜欢的操作系统就是Linux了。最近打算好好研究一下它的内核,以前没怎么看过。一直的工作使用的是VxWorks,这个在嵌入式操作系统中还是占有一席之地的,虽然总感觉他发展得越来越趋于没有特色,最近出的版本要支持多核CPU,并且竟然他也屈尊了,加入了进程的概念(以前没有这个概念,整个系统可以想象成单独进程,里面的任务就是线程,共享所有资源,这样的线性地址,相当方便,也相当危险)。起初是不overlap的进程,也算他有特色,之后的版本竟然也是overlap进程,呵呵,看来它还还是抵挡不住潮流的诱惑。不过他的实时性降低后,特色不是那么明显了。以后代码上也看不出来是用Linux还是VxWorks,尤其使用POSIX接口写出来的代码,连fork也要支持的它,应该也算是对广大嵌入式程序员的好处吧。毕竟代码更加趋于规范,格式化。
祝福开源的路越走越好!

2007年11月1日星期四

基础知识--密码学

继续搬家,技术类的都搬过来



由于个人技术有限,所以研究的都是一些基础知识,写出来主要是为了加深自己的印象,还有就是与大家分享,希望大家指正我的错误。
不知道咋的了,我这个数学基础不好又不是学计算机的,竟然去了一个搞网络安全的地方当程序员。
协议什么的还好说,我的理解协议就是通讯的双方或多方,先前商定好的一套传输的办案,使得使用这套方案的节点,都知道接受到的东西是什么和该如 何处理。其实和日常生活中大家互相沟通的方法是一样的,有的小团体就有自己特殊的沟通方式,这就象私有协议,只有团体内部的人才知道大家表达的意思。而更 大的团体,不如统一语言环境的人们,互相都能沟通,这就像公有协议,为多数人所知道的沟通方法。
让我比较头疼的是网络安全问题,那么网络上承载的数据就涉及到加密,密码学的东西实在是让人头疼,虽然编写程序不用了解到其更多的细节但是对其大致的步骤还是要有所了解。下面我就谈谈,最近我所了解到的一些基本得不能再基本得知识。
安全的网络通信需要考虑以下4个方面:
1、加密算法(头疼。。。)
2、用于加密算法的信息。(就是密钥之类的东东)
3、上面那些信息的分布和共享 (用来通信的加密解密,所以这些信息也需要使通信多方知道)
4、使用加密算法和信息的协议 (承载啊,怎么着也得有一套协议来承载)
什么是密码学: 密码学就是研究数据的加密、解密以及认证的学科。
加密算法:对明文所采取的一系列加密规则
加密系统分为两种
一种就是使用对称密钥加解密;对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。(一般就是相同的密钥,所以也叫单密钥)
(密钥其实就是KEY,就是加密和解密所需要用到的钥匙,也就是说你拿到了关键的钥匙你就能解开这把锁。也就是控制加密解密的参数之类的东东。)
现在对称密钥一般有两种形式:
一是明文消息按字符逐位加密,这叫流密码
另一是将明文消息分组(多个字符为一组),这叫做分组密码,也就是说加密X比特长的明文块,输出X比特长的密文块。(明文:没经过加密的数据 密文:经过加密的数据)
主要有 DES,3DES,AES,RC6等
另一种就是使用非对称密钥加解密。(一般有两种密钥,公钥和私钥。之间没啥关系,不能互相推算,由于存在多个密钥,所以也叫双钥或公钥加密体制,由其中一个加密,另外一个解密)
公钥系统主要有什么 RSA,DSA等
上面提到了加密算法,有些人说,算法都知道有啥不能破的,嘿嘿,不是这样说的~~,算法归算法,一般标准的算法肯定是公开的,但是别忘了,密码系统里面那个重要的东西,密钥,没有钥匙,你想打开门,嘿嘿。。。不行的。
今天写这么点,改天继续写。。单独写下每个加密算法的基本知识。我接着看书去了

C语言使用常出错的地方

呵呵,老博客上搬过来的:)

最近老考C,主要是为了减少BUG,提高代码质量。其实主要针对的还是那几点。什么越界啊,什么有效性啊。结合前人和自己总结如下几条,能为大家少点BUG起多少贡献。估计为0,^_^!
1、函数的参数合法性检查,特别要注意指针类型的!
2、操作成功性检查,如malloc,之后一定要判断是否申请空间成功!
3、在错误返回之前要谨慎,如注意是否曾动态申请过内存,若有要释放!
4、函数返回值要注意,特别是指针类型,一定要注意 不能是除NULL以外的一个常数,不能是函数执行堆栈种的地址。
5、循环一定要注意判断条件,别搞成死循环,还有注意 "=="和"="
6、注意 switch分支的break的使用
7、字符串的操作一定牢记"\0"的存在
8、对数组赋值时注意是否越界,循环语句也要注意数组越界问题。记住数组下标从0开始,是从0~n-1这样的n个元素!!
9、数据类型不匹配,赋值和强制转换可能带来的错误
10、中断函数种注意,在对公共对象操作时先关中断,处理完后再开中断。中断种不能有可能引起阻塞的语句。
11、多线程种,信号量获取后返回时注意释放
12、变量声明种注意那些未初始化的变量,小心别不经赋值就使用了。
13、malloc时候若使用strlen()注意长度+1
14、不要再栈中申请过大的内存,如要使用很大内存,请单独申请
15、数组作为参数,自动传递数组的首地址(指针),结构体作为参数,传递整个结构体!

一个朋友的问题

我 有个哥们最近选课(这哥们学自动化的),老师不负责任,就是说什么偏硬偏软,不说具体内容,我就纳闷了,这哪是培养研究生啊,课程内容简介都不给?让人怎 么选啊,偏硬偏软,我靠,这有啥用,这跟说馒头干了就硬了,泡点水就软了有啥区别。正好他问到了点问题,我觉得有些人可能都会有这样的问题,写点东西上 来,若是有错误请尽量指出,我好改正。
一 CPLD和FPGA的区别:
先解释一下这两个东西是什么CPLD就是complex programmable logic device,用中文说就是复杂可编程逻辑器件,FPGA就是Field rogrammable gate array,中文可编程门阵列。这两样东西其实都是可编程逻辑器件,个人理解就是可编程结构不同罢了,CPLD是基于乘积项的可编程结构,(即可编程的与 阵列和固定的或项组成),而FPGA是查表式结构(基于SRAM的查表逻辑,可以理解为函数发生器结构),写逻辑代码的时候,可以针对门级,也有依据逻辑 快的,看需要。还有一点和CPU很不同的地方就是,这东西是并行工作的,也就是代码都是并行执行的,若有需要串行的地方(也就是一行一行的顺序工作),需 要你的代码来控制。这点挺有意思的。
我没有正式从事过逻辑芯片的开发,所以没什么太多发言权,不过网上有牛人已经详细总结这两者的区别。 有兴趣可以去这里看看http://www.laogu.com/wz_789.htm
二、什么是DSP:
这个我几乎没怎么接触过,不过我知道是一种类似通用处理器的微处理器。(信号处理我比较熟,信号处理器不懂。哈哈)
粘个解释过来是从西门子讨论组粘过来的。
DSP芯片,也称数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器具,其主机应用是实时快速地实现各种数字信号处理算法。根据数字信号处理的要求,DSP芯片一般具有如下主要特点:
(1)在一个指令周期内可完成一次乘法和一次加法;
(2)程序和数据空间分开,可以同时访问指令和数据;
(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
(4)具有低开销或无开销循环及跳转的硬件支持;
(5)快速的中断处理和硬件I/O支持;
(6)具有在单周期内操作的多个硬件地址产生器;
(7)可以并行执行多个操作;
(8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。
当然,与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。
从解释上看,真的和CPU很像,感觉DSP这几点都比较猛,不知道开发过程如何。有熟悉的请讲讲:)
三、驱动:
这东西我最熟悉,毕竟两年来干得就是这个。也算有工作经验了。太多不讲,简单说说驱动代码的大概组成,目的是给大家一个概念上的印象,不过文字水平有限,大家凑合看吧。
这东西很好解释,就像我们要使用一个工具一样,首先我们需要找到这个工具,对于驱动来说就是让系统发现设备。 然后我们就要把这个工具准备好让它能为随时为我们所用,对于驱动来说就是分配好设备所要求的环境,包括内存,寄存器,DMA等等的设置。 好了到此为止这个工具是可用了。那么我们如何用呢?这就需要驱动程序的第三大块,就是处理部分,简单的说就是什么数据交给驱动,然后通过设么放方法来让设 备处理数据,输出的结果我们如何获取等等一系列的处理代码(这里一定要解决好数据流问题,输入,处理和取得,这个就涉及到中断啊,轮询啊等等)。之后当然 为了可以使用在操作系统上,为所有其他所需程序所调用,那么我们需要把自己交给操作系统管理,就是注册到设备列表中去,按照要就挂接好操作接口。(很多使 用过I/O操作设备的朋友,对这个接口肯定不陌生,I/O操作读写控制操作嘛,其实这就是已经封装挂接好的接口,为了方便使用和管理,当然挂接有很多情 况,有的甚至直接调用写好的处理函数,跟调用软件接口似的,看情况而定。) OK核心的东西就是这些,当然不仅是这些。还包括很多杂七杂八的东西,不过比较杂,而且不好阐述,但是不是说不重要啊。
最后,给大家点建议,写代码的时候不要总是想着应付功能,其实功能的实现可以有很多种方法,不过不是所有的方法都是可取的,我们需要注意。尤其是驱动代码效率一定要注意,一个不好的驱动代码可能连芯片的1/2的性能都发挥不出来,这不是很遗憾吗。
写代码一定要先设计充分了再写,写的过程就是体力活,真正的发挥实力的地方是设计部分,大家尽可能考虑问题全面些。整体架构的把握,之后的升级 扩展,通用性,是否可调试可维护啊,是否可以很好的测试啊。这些都是需要考虑的。尤其是商用级的设备,这些都不能马虎,设计太重要了,随便改架构可不是开 玩笑的。

2007年10月29日星期一

这里从中国不能正常访问

中国现在还是很封闭,确实网上流传着很多不好的东西,需要进行控制,但是有些时候不能太过封闭,没有错误的存在,何从知道正确的珍贵。这个世界充满对比,需要对比,这样才有矛盾,这样才有进步走下去的激情。如此而已。 这个空间如同Wiki一样不能从中国,起码从内地是不能正常访问的,但是毕竟维护还是可以。 所以我选择了这里写一些东西,不期望谁看到,知识记录下来自己的学习历程。 我有blogchina, spaces和这里三个博客。因为被人批评过,跨度太大,所以将我拆成了三面,blogchina写一些语言学习的东西,spaces主要写些心情娱乐方面的东西。而这里写些国内不让写和我技术上学习的东西。 第一篇就到这里吧。之后我打算总结些我这两年工作得到的,可以说是知识可以说是能力。