SCO UNIX 下设备驱动程序开发

SCO UNIX 下设备驱动程序开发

实达集团公司
李巧霞

一.相关概念

---- 1设备号和设备驱动程序

---- 设备号是一个数字,他是设备的标志。这些设备在系统上有对应的特殊文件存在。设备号由两部分组成,即主设备号和次设备号,高字节为主设备号和底字节为次设备号.主设备号标志设备的类型,它告诉核心有哪个驱动程序来处理该设备的请求,次设备号由相应的设备驱动程序解释,它标志着某个具体的物理设备。

---- ex. 八串卡,它的主设备号是相同的,次设备号是不同的。

---- 2设备节点

---- unix 把设备作为特殊的文件处理,称设备文件,也即设备节点。设备节点提供了物理设备和它对应的驱动程序的接口。0添加设备节点的命令格式为

---- mknod 设备名字 [b/c] 主设备号 次设备号

---- 它将为设备文件产生一个目录项和对应的i节点。

---- 3设备驱动程序

---- 设备驱动程序是物理设备和操作系统之间的软件接口,它由一组子程序组成,他负责与物理设备通讯,并为操作系统的核心提供统一的接口。用户级的程序通过设备文件来访问设备,但实际设备的读写则由设备驱动程序完成.

---- 设备驱动程序分两类:字符设备驱动程序和块设备驱动程序。

二.UNIX 系统设备驱动程序的设计和开发

---- 1驱动程序提供核心的例程:

---- 常见的有:xxxinit(),xxxxopen(),xxxxclose(),xxxxread(),xxxxwrite(),xxxxioctl(),xxxxhalt(); 等等,依此类推。这里的xxxx是设备驱动程序的前缀,与设备名相同,在本例中为mytt,这组例程为设备驱动程序入口例程,下面分别对各个例程作一说明:

---- xxxxinit: 初始化设备, 由系统在启动时由核心自动调用

---- xxxxhalt: 系统关闭时核心调用以关闭设备

---- xxxxopen: 获得对一个设备的存取,当一用户进程调用文件系统调用open 时,核心调用以此例程

---- xxxxclose:取消对一个设备的存取,当一用户进程调用文件系统例程close时,核心调用此例程

---- xxxxread: 从设备中读取数据,当用户进程调用文件系统例程read时,核心调用此例程,实现数 据从系统地址空间到用户地址空间的传递。

---- xxxxwrite: 向设备写数据,当用户进程调用文件系统例程write 时,核心调用此例程,实现数据从用户地址空间向系统地址空间的传递,并发送到物理设备。

---- xxxxintr: 处理设备中断,当设备向系统发出中断请求时,核心调用此例程来处理中断

---- xxxxstart: 启动一个驱动程序的存取,该例程也系统启动期间由核心自动调用。 与xxinit例程的区别是:xxinit例程在系统初启时即被核心用,而xxstart例程的调用则在系统中断系统已初始化完之后才调用。

---- xxxxioct1: 控制字符设备,用户进程调用文件系统用ioct1时,核心调用此例程

---- 这些例程都是可选的。

---- 2驱动程序的参数传递:

---- 系统核心为每个进程分配和维护一个核心数据结构USER,该结构包含进程运行时所需的全部信息。变量u是当前活动进程的USER数据结构,它包含的信息仅为核心私有,驱动程序会频繁使用其中的很多元素,较常用的有:

---- u.u_base: 用户数据区的地址,含有要传送的读/写数据。当用户调用文件读/写系统功能时,地址参数就存在该单元中。

---- u.u_offset:传递的数据文件的起始地址

---- u.u_count: 包含传递的字节数

---- u.u_error: 文件系统调用返回时的全局变量errno的值

---- 用户数据区的数据通过核心例程,passc(),cpass(),copyin(),copyout()来传递,passc(),cpass()能够自动维护u结构,copyin(),copyout()必须手动维护u结构。

---- 3驱动程序的调试:

---- 1)通过printf语句,将要观察的变量等打印出来

---- 2)自己编写测试程序调试,一个简单的读写终端设备的程序

---- 3)核心出错时,可以用crash

 #卸出内存映象
 #ldsysdump filename
 # crash -d filename 

---- 4设备驱动程序的安装:

---- 设备驱动程序的安装,通常遵循如下步骤:

---- 1) 获取可用主设备号,命令为:

	/etc/conf/cf.d/configure - j NEXTMAJOR
	返回 - 主设备号,如120 。
---- 2) 建立设备文件节点,命令为:
	mknod /dev/mytt c 120 0
   "/dev/mytt" 指我所做的设备文件,"c" 
指字符设备,"120" 指主设备号,"0"  指次设备号。

---- 3) 配置系统 ,命令为:

	cd/etc/conf/cf.d
	./configure -m 120  -c -14 -T2 -v
 4 -a  myttinit  myttopen myttclose/ 
  	myttread myttwrite myttioct1 
  	
 option:
l4   中断优先级
T2   设备使用的中断模式(0-3)
V4    需要中断相量 	

---- 4) 检查设备mytt是否已加入系统,命令为:

	./configure -j mytt

---- 如返回120 则表示mytt 已加入系统,且主设备为120 。 如返回信息为"no sueh device " 则系统中没有名为mytt 的设备,上述命令也可以在配置系统之前检查一下系统中是否同名设备存在。如有的话,可以先将该设备删除,然后再加入新设备。 要删除一指定设备,则必须知道其主设备号。 取主设备号命令如上面所示,步骤如下:

./configure -j mytt
./configure -m 120  -c -d
则从核心中删除设备 mytt

---- 5) 编译驱动程序源代码,将生成的.o 文件拷入/etc/conf/pack.d 目录

---- 编译驱动程序源代码命令行:

cc  -c  -D_INKERNEL  mytt.c

	mkdir /etc/conf/pack.d/mytt

cp mytt.o /etc/conf/pack.d/mytt/Driver.o

---- 6) 重键核心

	  cd/etc/conf/cf.d
	
	  ./link_unix

---- 回答两个Y,则在根目录下生成一个新的核心unix,旧的核心文件被保存为unix.o1d 驱动程序已安装完毕,需重新启动unix系统,设备驱动程序才能有效这时系统自动执行myttinit(),在主控台显示信息,表示设备驱动程序已安装。 SCO UNIX 下设备驱动程序开发

实达集团公司
李巧霞

一.相关概念

---- 1设备号和设备驱动程序

---- 设备号是一个数字,他是设备的标志。这些设备在系统上有对应的特殊文件存在。设备号由两部分组成,即主设备号和次设备号,高字节为主设备号和底字节为次设备号.主设备号标志设备的类型,它告诉核心有哪个驱动程序来处理该设备的请求,次设备号由相应的设备驱动程序解释,它标志着某个具体的物理设备。

---- ex. 八串卡,它的主设备号是相同的,次设备号是不同的。

---- 2设备节点

---- unix 把设备作为特殊的文件处理,称设备文件,也即设备节点。设备节点提供了物理设备和它对应的驱动程序的接口。0添加设备节点的命令格式为

---- mknod 设备名字 [b/c] 主设备号 次设备号

---- 它将为设备文件产生一个目录项和对应的i节点。

---- 3设备驱动程序

---- 设备驱动程序是物理设备和操作系统之间的软件接口,它由一组子程序组成,他负责与物理设备通讯,并为操作系统的核心提供统一的接口。用户级的程序通过设备文件来访问设备,但实际设备的读写则由设备驱动程序完成.

---- 设备驱动程序分两类:字符设备驱动程序和块设备驱动程序。

二.UNIX 系统设备驱动程序的设计和开发

---- 1驱动程序提供核心的例程:

---- 常见的有:xxxinit(),xxxxopen(),xxxxclose(),xxxxread(),xxxxwrite(),xxxxioctl(),xxxxhalt(); 等等,依此类推。这里的xxxx是设备驱动程序的前缀,与设备名相同,在本例中为mytt,这组例程为设备驱动程序入口例程,下面分别对各个例程作一说明:

---- xxxxinit: 初始化设备, 由系统在启动时由核心自动调用

---- xxxxhalt: 系统关闭时核心调用以关闭设备

---- xxxxopen: 获得对一个设备的存取,当一用户进程调用文件系统调用open 时,核心调用以此例程

---- xxxxclose:取消对一个设备的存取,当一用户进程调用文件系统例程close时,核心调用此例程

---- xxxxread: 从设备中读取数据,当用户进程调用文件系统例程read时,核心调用此例程,实现数 据从系统地址空间到用户地址空间的传递。

---- xxxxwrite: 向设备写数据,当用户进程调用文件系统例程write 时,核心调用此例程,实现数据从用户地址空间向系统地址空间的传递,并发送到物理设备。

---- xxxxintr: 处理设备中断,当设备向系统发出中断请求时,核心调用此例程来处理中断

---- xxxxstart: 启动一个驱动程序的存取,该例程也系统启动期间由核心自动调用。 与xxinit例程的区别是:xxinit例程在系统初启时即被核心用,而xxstart例程的调用则在系统中断系统已初始化完之后才调用。

---- xxxxioct1: 控制字符设备,用户进程调用文件系统用ioct1时,核心调用此例程

---- 这些例程都是可选的。

---- 2驱动程序的参数传递:

---- 系统核心为每个进程分配和维护一个核心数据结构USER,该结构包含进程运行时所需的全部信息。变量u是当前活动进程的USER数据结构,它包含的信息仅为核心私有,驱动程序会频繁使用其中的很多元素,较常用的有:

---- u.u_base: 用户数据区的地址,含有要传送的读/写数据。当用户调用文件读/写系统功能时,地址参数就存在该单元中。

---- u.u_offset:传递的数据文件的起始地址

---- u.u_count: 包含传递的字节数

---- u.u_error: 文件系统调用返回时的全局变量errno的值

---- 用户数据区的数据通过核心例程,passc(),cpass(),copyin(),copyout()来传递,passc(),cpass()能够自动维护u结构,copyin(),copyout()必须手动维护u结构。

---- 3驱动程序的调试:

---- 1)通过printf语句,将要观察的变量等打印出来

---- 2)自己编写测试程序调试,一个简单的读写终端设备的程序

---- 3)核心出错时,可以用crash

 #卸出内存映象
 #ldsysdump filename
 # crash -d filename 

---- 4设备驱动程序的安装:

---- 设备驱动程序的安装,通常遵循如下步骤:

---- 1) 获取可用主设备号,命令为:

	/etc/conf/cf.d/configure - j NEXTMAJOR
	返回 - 主设备号,如120 。
---- 2) 建立设备文件节点,命令为:
	mknod /dev/mytt c 120 0
   "/dev/mytt" 指我所做的设备文件,"c" 
指字符设备,"120" 指主设备号,"0"  指次设备号。

---- 3) 配置系统 ,命令为:

	cd/etc/conf/cf.d
	./configure -m 120  -c -14 -T2 -v
 4 -a  myttinit  myttopen myttclose/ 
  	myttread myttwrite myttioct1 
  	
 option:
l4   中断优先级
T2   设备使用的中断模式(0-3)
V4    需要中断相量 	

---- 4) 检查设备mytt是否已加入系统,命令为:

	./configure -j mytt

---- 如返回120 则表示mytt 已加入系统,且主设备为120 。 如返回信息为"no sueh device " 则系统中没有名为mytt 的设备,上述命令也可以在配置系统之前检查一下系统中是否同名设备存在。如有的话,可以先将该设备删除,然后再加入新设备。 要删除一指定设备,则必须知道其主设备号。 取主设备号命令如上面所示,步骤如下:

./configure -j mytt
./configure -m 120  -c -d
则从核心中删除设备 mytt

---- 5) 编译驱动程序源代码,将生成的.o 文件拷入/etc/conf/pack.d 目录

---- 编译驱动程序源代码命令行:

cc  -c  -D_INKERNEL  mytt.c

	mkdir /etc/conf/pack.d/mytt

cp mytt.o /etc/conf/pack.d/mytt/Driver.o

---- 6) 重键核心

	  cd/etc/conf/cf.d
	
	  ./link_unix

---- 回答两个Y,则在根目录下生成一个新的核心unix,旧的核心文件被保存为unix.o1d 驱动程序已安装完毕,需重新启动unix系统,设备驱动程序才能有效这时系统自动执行myttinit(),在主控台显示信息,表示设备驱动程序已安装。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值