科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux系统串口上网的简单实现(上) (2)

Linux系统串口上网的简单实现(上) (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要说明某些简易 Linux 环境或者嵌入式 Linux 中实现串口上网的简单实现,这在工业控制中有着广泛的应用。希望对实现无网卡设备上网的方法有抛砖引玉的作用。

作者:shanyaun 来源:赛迪网技术社区 2007年10月19日

关键字: 操作系统 实现 串口 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

Linux串口上网设备加载和注销形式

Linux串口上网程序的整个内核部分是以LKM(Loadable Kernel Module)形式实现的。LKM加载的时候完成伪网络设备、发送字符设备、接收字符设备的初始化和注册。注册的目的是让操作系统可以识别用户进程所要操作的设备,并完成在其上的操作(比如read,write等系统调用)。Linux加载模块,实际上就是模块链表的插入;删除模块象是模块链表成员的删除。

初始化内核模块入口函数init_module()中包括对字符设备的初始化入口 函数eddev_module_init()和伪网络设备初始化入口函数ednet_module_init()。

在内核需要卸载的时候,必须进行资源释放以及设备注销, cleanup_module()完成这个任务。函数cleanup_module()中用eddev_module_cleanup()来释放字符设备占用的资源(比如分配的缓存区等);有ednet_module_cleanup()来释放伪网络设备占用的资源。本文的内核部分模块程序编译后就是 ed_device.o,加载后使用lsmod命令查看,模块名就是ed_device。模块ed_device的加载和注销函数如图2所示。

图 2

当我们需要加载模块的时候,我们只需要使用insmod命令,如果需要卸载模块,我们使用rmmod命令。比如加载ed_device模块,并且配置伪网络接口IP地址为192.168.5.1

[root@localhost test]insmod ed_device.o,
[root@localhost test]ifconfig ed0 192.168.5.1 up

这时可以在/proc/net/dev 文件中看到有ed0伪网络设备了。如果需要卸载ed_device模块,应先停止其网络数据发送和接收工作,然后卸载模块:

[root@localhost test]ifconfig ed0 down
[root@localhost test]rmmod ed_device

如果我们设置另一台Linux box的伪网接口地址是192.168.5.2那么,我们可以用串口线直接连接两台终端并使用网络应用程序了,在两台终端上运行server守护程序,然后执行telnet:

[root@localhost test]# telnet 192.168.5.2
Trying 192.168.5.2...
Connected to 192.168.5.2 (192.168.5.2).
Escape character is '^]'.
Red Hat Linux release 9 (Shrike)
Kernel 2.4.20-8 on an i686
login:

编写字符设备驱动程序

用户空间的进程主要通过两种方式和内核空间模块打交道,一种是使用proc文件系统,另一种是使用字符设备。本文所描述的两个字符设备sending device 和receiving device事实上是内核空间和用户空间交换数据的缓存区,编写字符设备驱动实际上就是编写用户空间读写字符设备所需要的内核设备操作函数。

在头文件中,我们定义ED_REC_DEVICE为receiving device,名字是ed_rec;定义ED_TX_DEVICE为sending device,名字是ed_tx。

#define MAJOR_NUM_REC 200
#define MAJOR_NUM_TX  201
#define IOCTL_SET_BUSY _IOWR(MAJOR_NUM_TX,1,int)
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章