Blog Archives

Linux 模块

十二 24 2011 由 创建在标签 开发

1、模块简述

模块是内核的一部分(通常是设备驱动程序),但是并没有被编译到内核里面去。它们被分别编译并连接成一组目标文件,这些文件能被插入到正在运行的内核,或者从正在运行的内核中移走,进行这些操作可以使用insmod(插入模块)或rmmod(移走模块)命令。

使用模块有如下几个优点:

  • 模块化编程的需要,降低开发和维护成本。
  • 增强系统的灵活性,使得修改一些内核功能而不必重新编译内核和重启系统。
  • 降低内核编程的复杂性,使入门门槛降低。

同时也列出模块的一些缺点:

  • 对系统性能和内存利用有负面影响;
  • 装入的内核模块和其他内核一样,具有相同的访问权限,因此差的内核模块会导致系统崩溃;
  • 有些模块要求利用其他模块的功能,因此内核要维护模块之间的依赖性;
  • 内核必须能够在卸载模块时通知模块,并且要释放分配给模块的内存和中断等资源;
  • 内核版本和模块版本的不兼容也可能导致系统崩溃(内核版本不同时,部分接口需要替换);

但是对于驱动开发的过程中可以在运行时加载和移除模块显示得尤为重要,这样很容易让模块加载到内核中,而不必在编译的时候将模块编译进去,做过Linux裁剪的都应该知道编译内核是比较烦的一件事情,而且驱动程序开发中很容易出现问题,一旦出现问题就要重新编译。采用模块的方式可以很好地避免内核的重新编译,直到驱动版本稳定后可以将驱动加入至内核。可以大幅提高开发的效率。

2、模块常用的一些命令

3、常用的函数和宏

模块加载函数:  (必须)

模块卸载函数:   (必须)

模块参数:

在模块插入时:

eg:

导出符号

模块声明

4、模块的Makefile

下面是只包含一个文件的模块中所写出的Makefile:

如果一个模块包括多个.c文件(如file1.c, file.c),则应该以如下方式编写Makefile

附录

最简单的Hello模块代码:

/**
 *  Hello.c
 */
#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void)
{
    printk(KERN_INFO " Hello World enter\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_INFO " Hello World exit\n ");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("XXX");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");

无评论

Vmware安装错误(2147352570)解决方法

十 08 2011 由 创建在标签 开发

学习Linux时需要一台机器来熟悉命令,验证一些问题。大部分人都在使用Windows系统,对于新手来说,虚拟机应该是最好的选择。这篇文章介绍一下虚拟安装时遇到的问题,以及Linux安装的一些简单的步骤。

安装Vmware的时候总是停留在一个空白页面,不能显示下一步,开始以为是在解压文件,后来电脑开着一夜还是没有反应,重装几次后就去临时文件目录(C:\Users\XXX\AppData\Roaming和C:\Users\XXX\AppData\Local)查看日志文件。发现错误是:
ERROR** CHtmlDialog::CallJScript: Failed to obtain required required jscript ID; COM Error: –2147352570

出现这个问题的主要原因应该是IE的一些库使用出错了,使用的版本不对。网上搜了一下,发现也有其他人遇到过问题,但是绝大部分都是重新安装出现这种问题的,而我是首次安装。后来在Vmware地论坛上看到一个解决方法。

按住Win+R键,打开运行窗口,
32位机运行下面的命令:
  regsvr32 jscript.dll
  regsvr32 vbscript.dll
64位机运行下面的命令:
  regsvr32 C:\windows\system32\jscript.dll
  regsvr32 C:\windows\system32\vbscript.dll
运行命令后重启电脑。

至此,可能部分电脑可以安装了,但是我的电脑还是不行,一点用都没有,所以还得继续下去。后面要做的就是修改注册表。

在“运行”窗口输入:regedit然后回车即可打开注册表编辑器。找到如下所示的表项:
  HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0.
修改此表项的值为0或1,然后退出,如果修改这个值还不能解决问题的话就把整个Zones的注册表删除。

到这里,关闭注册表就可正常安装。这可能跟我升级了IE有关,然后IE修改了注册表,导致Vmware安装失败。

4 条评论

Linux常用命令

九 22 2011 由 创建在标签 开发

本文不会对每一个命令做很详细的介绍,具体的用法可以百度或者Google一下,网上有很多的介绍;我只从实用的角度来描述一些常用的命令和用途。许多命令都提供了help,我们可以用它自带的help查看命令是如何使用的。一般是:CMD –h /CMD –help。

1 几个网络命令

网络已经是Linux不可分割的一部分,熟悉一些网络常用的命令可以很方便地去定位和解决我们遇到的问题,让我们能够正常连接网络。

1. nc 命令

调试网络,可以构造TCP/UDP连接发送数据,调试比较方便。

2. netstat 命令

此命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
我们通常会用它来查看我们开启的端口,一般用来查看TCP和UDP的端口。如下所示:

netstat –tlp #列出TCP监听的端口及程序
netstat –ulp #列出UDP监听的端口及程序

下面描述一下几个参数:

-t或–tcp 显示TCP传输协议的连线状况。
-u或–udp 显示UDP传输协议的连线状况。
-l或–listening 显示监控中的服务器的Socket。
-a或–all 显示所有连线中的Socket。
-p或–programs 显示正在使用Socket的程序识别码和程序名称。

3. ifconfig

用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。下面是关于此命令常用的一些用法:

配置网卡IP地址:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 #eth0为网络设备
将网卡禁用:      ifconfig eth0 down
将网卡启用 : ifconfig eth0 up

注:网络的配置出了实用此命令外,还可以通过修改配置文件来完成。

2 其他实用到的一些命令

1. chkconfig

主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

chkconfig –list [name] 列表服务
chkconfig –add [name] 添加服务
chkconfig –del [name] 删除服务
chkconfig [--level|levels] [name] [on|off|reset] 改变启动信息以及检查特定服务的启动状态 
    level :系统启动等级代号
    name:系统服务
    on 和 off 分别指服务在改变运行级时的启动和停止状态,reset 指初始化服务信息。

2. mount

挂载文件到一个虚拟盘或一个虚拟文件夹中,通过访问这个虚拟盘或文件夹使用整个文件。此命令可以挂载Linux或者其他系统的共享文件夹,移动设备等。用法也有点复杂,需要的时候再查,只要记住几个常用的参数即可。

3. insmod/rmmod

这两个命令分别用于载入/卸载模块。因为Linux有许多功能是通过模块的方式,在需要时才载入kernel。在驱动的开发中用得比较多。

4. tar

此命令用于压缩和解压文件。一般从网上下载的源码都会用此命令来解压。下面介绍几种常用的解压命令来解压和压缩文件。

文件类型

解压

压缩

*.tar

tar –xvf *.tar

tar –cvf *.tar packF

*.tar.gz

tar –xzvf *.tar.gz

tar –czf *.tar.gz packF

*.tar.bz2

tar –xzvf *.tar.bz2

tar –cjf *.tar.bz2 packF

一条评论

Linux 设备驱动学习——写在学习之前

九 20 2011 由 创建在标签 开发

因为学习和工作需要,最近开始学习Linux的驱动开发。我将在这段时间及时记录下我学习中遇到的点点滴滴,因为是新手上路,肯定有很多不足,也会走很多弯路,我将在我的博客中写出来。让其他人可以借鉴。记录学习的过程也是对自己的一个监督,同时也是检查自己学习的手段。
先说说我使用的书单。

书名 出版社 作者
深入理解LINUX内核(第3版) 中国电力出版社 Bovet&Cesati,译:陈莉君、张琼声、张宏伟
Linux设备驱动开发详解 人民邮电出版社 宋宝华
LINUX设备驱动程序(第3版) 中国电力出版社 (美)Corbet,J. 等著,魏永明,耿岳,钟书毅 译

还没有开始看,先把这些书单贴出来。后面看了之后会及时分享我的学习心得和遇到的问题。

无评论

« 上一页