Linux内核以及驱动技术—简单
无论是VC还是VB,还是C#,还是JSP PHP等等语言,在学习他们之前总是先来一个HELLO
WORLD的例子,这个好像成了我们程序入门的必经之路。所以在驱动程序的学习上,也离不开这个步骤。但是驱动程序的开发是运行在内核空间的,而应用程序
是运行在用户空间的,所以驱动程序的开发盒调试和应用程序的开发都有很大的区别。对于这个hello world的程序我也化了不少时间才搞清楚。
驱动程序作为系统内核的一部分,它工作在核心态,而应用程序工作在用户态。也就是说,不能直接通过指针,把用户空间的数据地址传递给内核(因为MMU映射
的地址根本不一样)。要想在应用程序和驱动程序之间传递数据(指针),就需要经过转换。把用户态“看到”的空间地址转换成内核态可访问的地址。
Linux系统提供了一系列方便的函数实现这种转换,如get_user、put_user、copy_from_user、copy_to_user等,它们自己负责访问权限的检查,使用时,不需要关系更多的问题。
Linux内核把驱动程序划分为3种类型:字符设备、块设备和网络设备。字符设备和块设备可以像文件一样被访问。它们的主要区别不在于能否seek,而是
在于系统对于这两种类型设备的管理方式。应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序;而应用程序对于块设备的操作,
要经过系统的缓冲区管理,间接传递给驱动程序处理。块设备的这种管理方式是为存储提供优化的;而字符设备的管理方式是为操作提供优化的。
至
于网络设备,它在Linux系统中是一类比较特殊的设备它不像字符设备或块设备那样通过对应的设备文件节点去访问,内核也不再通过read和write等
调用去访问网络设备。Linux的网络系统主要是基于BSD
UNIX的套接字机制,在系统和驱动程序之间有专门的数据结构进行数据传输,系统支持对数据发送和数据接收缓存,提供流量控制机制,提供更多的协议支持。
在linux系统中,驱动程序都做成模块的形式,也就是module。简单的说,一个模块提供一个功能,这些模块是可以按照需要随时装入内核空间和从内核空间卸载的。因此,内核模块是为了给内核动态增减功能而设计的,并不仅仅是限于驱动程序。
因为内核模块需要加载到内核空间,所以其程序的编写与一般应用程序不同,在里面再也找不到类似main()这样的入口函数,下面对应函数相应的源代码hello.c,分析一个驱动模块的写法。
#ifndef __KERNEL__
相关文档:
原理其实很简单,那就是广播一个arp包,然后recv,如果没有数据(这里要设置延时),那么说明这个ip是可用的,否则就检测这个数据是否为回复我们发出的arp的应答包.如果是则证明ip已被使用,否则继续等待.
这里可以看下busybox的dhcp中的检测程序。
networking/udhcp/arpping.c
C代码
/* vi: set sw=4 ......
在linux下安装配置svn独立服务器
subversion(以下简称svn)是近年来崛起的版本管理工具,是cvs的接班人。 svn服务器有2种运行方式:独立服务器和借助apache。2种方式各有利弊。
svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据(我在搞ldap时就深受其害,没法根治),所以还是 ......
一、一个以前的老业务,类似下面这样的
int test(char * ptest)
{
return atoi(ptest);
}
异常的时候,指针是空的,立马就core掉了
二、
int uin = 77564267;
......
DB2 安装完成后准备启动时,系统报错,详细信息如下
[db2inst1@localhost ~]$ db2start
db2start: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
执行下面检查命令
[db2inst1@localhost lib]$ cd /usr/lib
[db2inst1@localhost lib]$ ls -la libaio ......