Linux字符设备驱动机制探索论文-精品

2024-04-16

Linux字符设备驱动机制探索论文-精品(通用4篇)

篇1:Linux字符设备驱动机制探索论文-精品

Linux字符设备驱动机制探索论文

课程名称 Linux内核设计与实现

姓 名 王 华 山

班 级 10计科(嵌入式)

学 号 1031301224

院 系 数计学院

专 业 计算机科学与技术

目录„„„„„„„„„„„„„„„„„„„„„„„„„1 一.字符设备概述„„„„„„„„„„„„„„„„„„..2

二.相关数据结构之间的关系说明………………………………10

三.字符设备驱动实例„„„„„„„„„„„„„„..12

四.字符设备驱动中的并发控制„„„„„„„„„„..19

五.字符设备的阻塞与非阻塞操作„„„„„„„„„„„.21

六.参考文献„„„„„„„„„„„„„„„„„„„„.23

七.心得体会„„„„„„„„„„„„„„„„„„„..24

一.字符设备概述

1.字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等。但以字符为单位并不一定是指以字节为单位。

字符设备驱动程序中会涉及到许多有关设备的概念,如什么是设备文件、什么是主次设备号、如何注销设备号、字符设备中有哪些主要的数据结构及它们的作用各是什么、各种函数调用方法等等,下面介绍部分相关概念。(1)设备文件及其作用

概念:linux 设备文件就是一个实实在在看得见的文件,只不过这个文件是“设备类型”,它是用来代表一个设备的,一般在设备驱动加载之后创建,在设备驱动卸载后移除。有了设备文件,如果想对设备进行等操作。只需对设备文件进行等操作即可。实现流程:设备文件操作----->系统内核----->设备驱动----->硬件设备,设备文件也是一个文件,c 库中对文件的操作包括打开、写、读、定位等,分别是通过fopen、fwrite、fread、fseek 等c 库函数实现的。

作用:设备驱动的作用就是将这些对设备文件的打开、读、写、定位等操作转化为对硬件设备的打开、读、写、定位等操作。创建设备文件的方法:1.手工创建mknod 方法:mknok filename type major minor(major-主设备号;minor-次设备号;type-设备类型可取:c(字符设备),b(块设备))执行此命令 之后就可以看到在当前目录下生成了一个名为filename 的文件。2.自动创建

(2)主次设备号及其作用

概念:设备号就是系统为设备分配的一个编号。在/dev 目录下-ll,可以看到有每个设备文件都有两个号,他们就是主次设备号。

作用:主设备号是用来标识与设备文件相连的驱动程序,主设备号用来反映设备类型;次设备号被驱动程序用来辨别操作的是哪个设备,次设备号用来区分同类型的设备。设备文件需要设备号才能创建;设备驱动也需要设备号才能装载。设备文件正是通过主设备号找到它的驱动;设备驱动正是利用次设备号才知道他要操作的具体是哪个设备。内核中描述设备号的方法:

内核中用dev_t 类型来描述,其实质是是unsigned int 32位整数,其中高12位为主设备号,低20位为次设备号用宏MAJOR(dev_t dev)解出主设备号,MINOR(dev_t dev)分解出次设备号。(3)linux内核分配主次设备号的

静态申请:1.根据/documentation/devices.txt,确定一个没有使用的主设备号 2.使用register_chrdev_region 函数注册设备号:int register_chrdev_region(dev_t from,unsigned count,const char *name)(from-希望使用的设备号;count-望申请使用的设备号数目;nanme-shebeiming(体现在/proc/devices))静态注册的缺点是移植时容易发生冲突,但是简单。

动态分配:使用allo_chrdev_region 分配设备号:int allo_chrdev_region(dev_t *dev,unsigned baseminor, unsigned count,const char name)(dev 非配到的设备号)

baseminor-起始次设备号count-需要分配的设备号数目;name-设备名)(4)注销设备号的方法

设备号是宝贵的资源,都应该在不再使用它们时释放这些设备号

void unregister_chrdev_region(dev_t from,unsigned cout|):释放从from 开始的count 个设备号

2.在linux系统中,字符设备以特别文件方式在文件目录树中占据位置并拥有相应的i结点。i结点中的文件类型指明该文件是字符设备文件。可以使用与普通文件相同的文件操作命令对字符设备文件进行操作,例如打开、关闭、读、写等。字符设备是最基本、最常用的设备。概括的说,字符设备驱动主要要做三件事:

1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;

2、在结构体外分别实现结构体中定义的这些函数;

3、向内核中注册或删除驱动模块。

下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4 个字节的全局变量int global_var,而这个设备的名字叫做“simchr”。对“simchr”设备的读写等操作即是对其中全局变量global_var 的操作。驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对 所控设备的初始化工作,并调用register_chrdev()函数注册字符设备: static int __init gobalvar_init(void){ if(register_chrdev(MAJOR_NUM, “ simchr ”, &gobalvar_fops)){ //„注册失败 } else { //„注册成功 } } 其中,register_chrdev 函数中的参数MAJOR_NUM 为主设备号,“simchr”为设备名,gobalvar_fops 为包含基本函数入口点的结构体,类型file_operations。当simchr 模块被加载时,gobalvar_init 被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。与模块初始化函数对应的就是模块卸载函数,需要调用 register_chrdev()的“反函数” unregister_chrdev():

static void __exit gobalvar_exit(void){ if(unregister_chrdev(MAJOR_NUM, “ simchr ”)){ //„卸载失败 } else { //„卸载成功 } }

随着内核不断增加新的功能,file_operations 结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open()、release()、read()、write()、ioctl()、llseek()、poll()等。open()函数 对设备特殊文件进行open()系统调用时,将调用驱动程序的open()函数:int(*open)(struct inode * ,struct file *);其中参数inode 为设备特殊文件的inode(索引结点)结构的指针,参数file 是指向这一 设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用MINOR(inode-> iERESTARTSYS;} if(down_interruptible(&sem)){ returnEFAULT;} up(&sem);return sizeof(int);} static ssize_t simchr_write(struct file *filp, const char *buf, size_t len, loff_t *off)19 { if(down_interruptible(&sem)){ returnEFAULT;} up(&sem);flag = 1;//通知数据可获得

wake_up_interruptible(&outq);return sizeof(int);} module_init(simchr_init);module_exit(simchr_exit);编写两个用户态的程序来测试,第一个用于阻塞地读/dev/simchr,另一个用于写/dev/simchr。只有当后一个对/dev/simchr 进行了输入之后,前者的read 才能返回。打开两个终端,分别运行上述两个应用程序,发现当在第二个终端中没有输入数据时,第一个终端没有输出(阻塞),每当我们在第二个终端中给simchr输入一个值,第一个终端就会输出这个值

六.参考文献

《linux设备驱动第三版》(第一章 设备驱动简介、第三章 字符驱动、第四章并发和竞争情况、第十一章 内核中的数据类型、第十四章 Linux设备模型《linux内核设计与实现》、百度文库(Linux字符设备驱动程序设计概述、Linux字符设备驱动实例、字符设备驱动基本编程、深入浅出Linux设备驱动编程、Linux字符设备驱动学习笔记等)

七.心得体会

通过这次论文设计,对Linux系统的字符设备驱动有了初步的认识:Linux下的设备驱动程序分为字符设备驱动、快设备驱动和网络设备驱动程序。驱动程序在硬件和软件之间起纽带的作用,用户进程是通过设备文件来与实际的硬件打交

道.每个设备文件都有其文件属性,表示是字符设备还是块设备。每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备。

篇2:Linux字符设备驱动机制探索论文-精品

Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。

下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做“globalvar”。对“globalvar”设备的读写等操作即是对其中全局变量global_var的操作。

驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备:

static int __init globalvar_init(void){ if (register_chrdev(MAJOR_NUM, “ globalvar ”, &gobalvar_fops)) { //…注册失败 } else { //…注册成功 }}

其中,register_chrdev函数中的参数MAJOR_NUM为主设备号, “globalvar”为设备名,globalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当globalvar模块被加载时,globalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。

与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的“反函数”

unregister_chrdev():static void __exit globalvar_exit(void){ if (unregister_chrdev(MAJOR_NUM, “ globalvar ”)) { //…卸载失败 } else { //…卸载成功 }}

随着内核不断增加新的功能,file_operations结构体已逐渐变得越来越大,但是大多数的驱动程序只是利用了其中的一部分。对于字符设备来说,要提供的主要入口有:open()、release()、read()、write()、ioctl()、llseek()、poll()等。

open()函数 对设备特殊文件进行open()系统调用时,将调用驱动程序的open() 函数:

int (*open)(struct inode * ,struct file *);

其中参数inode为设备特殊文件的inode (索引结点) 结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用 MINOR(inode->i - rdev) 取得)、控制使用设备的进程数、根据执行情况返回状态码(0表示成功,负数表示存在错误)等;

release()函数 当最后一个打开设备的用户进程执行close ()系统调用时,内核将调用驱动程序的release() 函数:

void (*release) (struct inode * ,struct file *) ;

release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等。

read()函数 当对设备特殊文件进行read() 系统调用时,将调用驱动程序read()函数:

ssize_t (*read) (struct file *, char *, size_t, loff_t *);

用来从设备中读取数据。当该函数指针被赋为NULL 值时,将导致read 系统调用出错并返回-EINVAL(“Invalid argument,非法参数”)。函数返回非负值表示成功读取的字节数(返回值为“signed size”数据类型,通常就是目标平台上的固有整数类型)。

globalvar_read函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off){ … copy_to_user(buf, &global_var, sizeof(int)); …}

write( ) 函数 当设备特殊文件进行write () 系统调用时,将调用驱动程序的write () 函数:

ssize_t (*write) (struct file *, const char *, size_t, loff_t *);

向设备发送数据。如果没有这个函数,write 系统调用会向调用程序返回一个-EINVAL。如果返回值非负,则表示成功写入的字节数。

globalvar_write函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off){…copy_from_user(&global_var, buf, sizeof(int));…}

ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为:

int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long);

unsigned int参数为设备驱动程序要执行的命令的代码,由用户自定义,unsigned long参数为相应的命令提供参数,类型可以是整型、指针等。如果设备不提供ioctl 入口点,则对于任何内核未预先定义的请求,ioctl 系统调用将返回错误(-ENOTTY,“No such ioctl fordevice,该设备无此ioctl 命令”)。如果该设备方法返回一个非负值,那么该值会被返回给调用程序以表示调用成功。

llseek()函数 该函数用来修改文件的当前读写位置,并将新位置作为(正的)返回值返回,原型为:

loff_t (*llseek) (struct file *, loff_t, int);

poll()函数 poll 方法是poll 和select 这两个系统调用的后端实现,用来查询设备是否可读或可写,或是否处于某种特殊状态,原型为:

unsigned int (*poll) (struct file *, struct poll_table_struct *);

我们将在“设备的阻塞与非阻塞操作”一节对该函数进行更深入的介绍,

设备“gobalvar”的驱动程序的这些函数应分别命名为gobalvar_open、gobalvar_ release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此设备“gobalvar”的基本入口点结构变量gobalvar_fops 赋值如下:

struct file_operations gobalvar_fops = { read: gobalvar_read, write: gobalvar_write,};

上述代码中对gobalvar_fops的初始化方法并不是标准C所支持的,属于GNU扩展语法。

完整的globalvar.c文件源代码如下:

篇3:Linux字符设备驱动机制探索论文-精品

目前, Linux作为开放源码的操作系统已广泛应用, 其强大的网络处理能力、高稳定性和较强的安全性得到了普遍的认同, 但不可回避的是Linux上的应用程序相对来说还十分有限, 对各种硬件的支持远不如Windows系统。其中对硬件的广泛支持能力主要取决于各种设备的驱动程序, 由于目前许多硬件厂商在出售各种板卡等产品时, 一般都不带Linux下的设备驱动程序, 这使那些想在Linux上搞开发应用的人员受到了很大的限制。

因此, 本文对Linux设备驱动程序的编写方法作了一些总结, 也编写了一个应用实例, 详细讨论了与操作系统的软件接口部分, 为那些想将其他系统下的驱动程序移植到Linux下的人员提供参考。该文参照Linux-2.4的内核源代码提供有关数据结构和函数。

二、系统的硬件设计

本设计的硬件设计如图1和图2所示, 只需要一个25针的D型插座、8个二极管和8个电阻, 就可以模拟一个十字路口的交通灯。

由微机接口技术可知, 并口的最小配置由一些8位的端口组成。写到输出端口的数据, 表现为25脚D型插座输出引脚上的电平信号。该接口是打印机使用的PC机并行接口。因为驱动的设备是LED发光二极管, 这里不能使用并口打印机的驱动程序。

PC机的并口控制卡经常使用的2个I/O并口基地址是0x378和0x278, 在并口通信中使用的电平信号是标准的TTL电平:0伏和5伏。我们要把驱动程序的下部分插到时间队列, 这将使用Linux的定时器报时, 即每秒中断100次。

三、Linux设备驱动程序的工作原理

设备驱动程序的工作原理如图3所示。在I/O设备管理中, 与设备相关的代码是设备驱动程序。组成设备驱动程序的代码按照执行时间是否确定, 可将其分为同步执行和异步执行的代码。在Linux内核中把同步执行的代码称为驱动程序的下半部, 把异步执行的代码称为上半部, 这是因为异步执行的代码是中断服务程序, 它直接访问设备硬件, 而且在一般情况下是先于同步执行的代码而运行。而驱动程序的下半部包含用户请求的I/O系统调用, 包括读、写数据以及执行等操作, 比如read () 和write () 调用等;还包含对用户发出的控制请求的响应, 比如启动或关闭设备等。由于用户发出的I/O功能调用和控制请求是在确定的时间内发生, 所以它是同步事件, 从执行的先后顺序上看, 它在中断程序的后面被执行, 所以把它称为驱动程序的下半部。

逻辑I/O层处理的是与用户I/O操作请求有关, 但与具体I/O设备的驱动程序无关的操作。或者说逻辑I/O层实现启动所有I/O设备驱动程序之前都必须执行的操作。通过逻辑I/O层向用户层提供通用一致的接口, 如打开、读、写、关闭等系统调用。

四、Linux设备驱动开发

Linux对硬件的驱动支持有两种方式:一种使用Linux内核中提供的机制来实现, 另一种直接在用户空间实现。由于用户空间驱动程序的局限性, 特别是响应时间的滞后, 往往选择前一种方式。

(一) LKM机制简介

Linux内核提供了两种机制来开发设备驱动程序, 一种直接把驱动程序联编到内核中, 另一种则是通过称为Linux可加载模块 (LKM) 机制来开发可动态加载和卸载的驱动模块。为了平衡这两者的关系, 采用LKM机制。利用这种机制可以开发Linux内核模块, 并且可以动态地对它加载和卸载。

Linux的内核模块被加载到内核后, 它可以任意地利用内核提供的各种资源和服务。Linux内核维护了一张所有内核所用资源的符号表 (称为内核资源符号表) 。当一个模块被加载, Linux就会修改内核资源符号表, 将该模块所提供的服务和资源加入。这样另一个模块载入时, 如果需要可以引用这个模块的资源。卸载一个模块时, 需要知道当前模块是否正在被使用, 如果没有被使用, 在卸载时能够通知该模块将它卸载, 以便由它自己释放已占用的系统资源。同时Linux还要从内核资源符号表中删除该模块提供的所有资源和服务。

(二) 编制Linux设备驱动程序的基本方法与实现

系统调用是操作系统内核应用程序之间的接口, 设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件细节。在应用程序看来, 硬件设备只是一个设备文件, 可以通过相应的系统调用像操作普通文件一样对硬件设备进行操作。

凡属Unix类操作系统的设备驱动程序, 基本遵循由SVR4提出的DDI/DKI (设备-驱动程序接口/驱动程序-内核接口) 规范, 对内核与驱动之间管理接口进行严格定义。DDI/DKI要求一个驱动程序包括驱动程序与内核、驱动程序与硬件、驱动程序与引导3个部分。

1. 设备驱动程序与内核

设备驱动程序与内核接口是编制驱动程序工作量最大的一部分。它的具体内容是提供内核与设备驱动程序的接口以及编制设备驱动程序的同步操作函数, 具体到本设计中就是struct file_operations结构。此结构包括了驱动程序对它所管理的设备能够完成的所有操作。这些操作也就是应用程序能够对设备发出请求调用的所有操作函数, 这些函数组成了设备驱动程序的下部分。在本设计的交通灯设计中, 只有输出灯的状态, 没有读进灯的状态, 所以没有读的功能。Struct file_operations结构实现为:

根据对设备的操作的顺序和性质, 可以将下半部操作函数 (file_operations结构) 大体上分为三大类:设备的打开与释放操作、设备的读写操作和设备的控制操作。

(1) 设备的打开和释放操作。在使用一个设备之前, 首先要打开设备。它用来完成对设备的初始化准备工作, 并增加该设备的引用计数, 与此相对应的操作函数是trlight_open () 。释放设备的操作函数是trlight_release () , 它的功能与trlight_open () 相反。

(2) 设备的读写操作。在本交通灯设计中, 只有写操作, 没有读操作, 与之对应的是trlight_write () 函数, 它完成将用户数据从用户空间搬到内核空间。Linux内核提供了特殊函数实现超越地址空间进行复制, 这个特殊函数是内核函数copy_from_user () 。

(3) 设备的控制操作。一个完整设备驱动程序的下半部函数除了打开/关闭、读/写操作以外, 还要对设备进行控制操作。控制操作是控制硬件设备以及I/O通道, 本设计的控制操作是灯的打开和关闭, 与之对应的是static int trlight_ioctl (struct inode*inode, struct file*file, unsigned int cmd, unsigned long arg) 函数。

2. 驱动程序与硬件

在现代处理器中, 内核管理的系统硬件资源就是要管理的中断资源。在中断处理中, 设备一旦启动并准备好后, 就会利用中断系统来通知驱动程序的上半部, 请求对它进行操作。由于Linux内核为中断提供了方便、实用的接口, 所以编写和安装中断处理程序并不是一件困难的事情。但是由于中断服务例程属于异步事件, 因此在调试时要注意一些事项, 否则很容易使系统崩溃。在本设计中, 没有利用硬件的中断, 所以相对比较容易调试, 不会出现系统崩溃的问题。系统只是利用了Linux内核系统提供的定时队列, 这个队列中的所有任务是在中断时间内运行的, 每次中断的时间是10 ms, 也就是说任务每秒钟运行100次。

首先要定义一个时间队列的元素, 即

接着, 把这个函数插到时间队列, 即

这样就完成了上半部的编写。

3. 驱动程序与引导

在早期, Unix内核是静态编译和链接的, 因此要求一开始在创建内核时就要包含所有内核功能函数以及设备驱动程序。尽管有许多设备驱动程序并不经常使用, 但它是内核的一部分, 因此要一直驻留在内存中。由于内核占用的内存是不可以换页的, 因此导致内核占用的内存资源过大。同时每添加一个新的驱动程序, 都必须重新编译链接并再次引导系统。为了节省内存空间, 在现代操作系统中, 把在系统运行过程中能够加载到内核作为内核代码运行的模块称为内核模块。内核模块可以动态加载也可以动态卸载。

五、驱动程序的安装与调试

(一) 编译设备驱动程序

编写完驱动程序后, 要对编写之后的驱动程序进行编译。本设计通过makefile文件, 使用make命令进行编译, 以生成驱动程序的可执行代码。

下面对于编译的参数进行简单的说明:

(二) 驱动程序的安装

六、结论

本设计的交通灯驱动程序是操作系统内核和机器硬件的接口, 在Linux下设备驱动程序实现了设备作为特殊文件进行处理, 使设备接受输入和将输出送到设备。这样屏蔽了实际的硬件构成, 方便用户使用, 具有一定的意义。

摘要:本文总结了Linux系统下设备驱动程序的工作原理, 介绍了基于LKM (LinuxKernelModel) 的Linux字符设备驱动开发方法, 完成利用计算机并口的交通灯设备的驱动程序。本设计在内核为Linux-2.4.8环境下编译通过, 并可以运行。

关键词:Linux,驱动程序,模块装载,操作系统

参考文献

[1]郑伟, 吴乃优.Linux内核空间设备驱动程序的开发[J].微计算机信息, 2003.

[2]王小龙, 何克忠, 房小翠, 等.Linux设备驱动开发方法及应用实例[J].北京工商大学学报, 2005.

[3]潘俊强, 刘莉.Linux字符设备驱动程序的设计[J].杭州应用工程技术学院学报, 2000.

篇4:Linux字符设备驱动机制探索论文-精品

关键词:校企合作 双赢 利益机制

作为一种以社会和市场需求为导向的办学机制,校企合作是学校与企业以发展的共同目标为基础,以知识、技术、效率为契合点,利用学校和企业的场所和资源,培养适合生产、服务、管理一线应用型技能人才为主要目标的办学模式。培养学生职业核心能力,就要与行之有效的校企合作相结合,而行之有效的校企合作则需要在一定的长效机制下才能顺畅运行。

1.校企合作是高等职业院校发展的有效途径

目前高等教育规模已经发展到了一定程度,尤其是高等职业教育面临着从“办学规模”到“办学质量”的发展瓶颈。高职教育应该主动适应社会需求、进行大力度的改革,提高教育教学质量。

职业院校不同于其他类型的高校,职业院校以培养高等技术应用型专门人才为目标,这就决定职业院校在教会学生理论知识的同时,更要注重专业技能的培养。专业技能的培养是学校校内教育所不能实现的,必须依靠行业、企业,通过建立专业与行业、企业之间的合作来共同培养。离开行业、企业的土壤,技能培养就是一句空话。因此高职教育必须走“校企合作”之路。

2.基于利益的校企合作长效机制是校企合作的保障

学校或专业与行业、企业之间应当建立深度融合的校企合作,而基于利益驱动的校企合作长效机制则是高职院校培养高技能型应用人才的保障。

获取一定利润是企业经营的主要目标。高职院校学生在毕业时所具备的实践操作技能往往达不到企业的要求,而学生在校期间企业往往不愿为学生提供实践机会,原因就是因为这样做不能为企业产生直接效益,相反,学生进入企业实践,还可能会给企业的正常运作带来影响。因此获取一定利益,才是促进校企合作的动力。

校企合作是双方的事情,需要双方的精诚合作,双方凭借各自的资源,投入到合作中,以期获取自身利益。企业通过校企合作建立与学校或者专业的深度合作,参与课程改革、课程内容设定、课程标准制定、专业教学等专业建设活动中,获取用人方面的优势(如为储备人才、订单培养、优先选拔等);校方或专业通过与企业的深度合作,获取企业资源的使用权、企业专家教学、技能指导、学生实习或就业等优势。另外,校企合作中合作项目的设定和选择是一个关键,因为选择能够带来经济效益的合作项目,让企业在合作中获取经济利益,即建立基于利益驱动的校企合作长效机制才是促进双方合作根本动力。

建立校企合作的長效机制则需要双方转变合作观念,要立足双方共同发展去思考如何合作,努力实现共赢,同时不能只依靠外部因素去推动校企合作,更主要的是依靠内部机制来激发校企合作的活力。

合作双方首先建立共同的利益基础和发展目标。学校提高办学质量、打造能为企业提供技术攻关、员工培训、科技成果转化的知识力量,同时培养出服务企业一线的高技能型人才,以充分发挥自身资源优势来匹配企业的资源优势,企业才能积极参与校企合作,校企合作的利益机制才能建立。

3.基于利益机制的校企合作长效机制建立途径

3.1 订单培养

“订单培养”也可以称其为“委托培养”。招生条件、招生范围和招生规模等都由企业制定,学校与企业签订人才培养协议书,双方共同制定人才培养计划、教学实施计划、课程大纲、课程标准、课程考核方式及标准等并共同实施之。合作企业重点参与技能教学和学生的顶岗实习,旨在培养出高技能人才。订单培养的学生实质上就是为企业量身打造,更加符合企业用人要求,毕业后能够较快上岗。

3.2 定向输出

定向输出可以认为是订单培养的延伸,订单培养只要指单个企业与校方合作,签订针对某专业的共同培养人才的协议,定向输出则可以是大型企业集团为下属各分公司、子公司等储备人才,代表集团和分公司、子公司与校方合作,按照其对人才专业、技能水平等的要求,在多个专业与校方合作培养人才,企业与各个专业共同制定人才培养计划、教学实施计划课程大纲、课程标准、课程考核方式及标准等,并共同组织教学活动。定向输出与订单培养一样,在技能教学和顶岗实习阶段,企业人员要全程参与,旨在培养具备符合企业人才需求的高技能人才。

定向输出的学生毕业后到制定的企业就业,根据各自专业不同,到合作企业及其下属分公司、子公司相应岗位就业。

3.3 职教集团——行业性集团化办学

职教集团20世纪开始在国外出现,我国在1993年开始起步,目前国内已有50多家职教集团在运行。职教集团是新形势下整合职业教育资源、实现优势互补、谋求多赢的新举措,也是实现职业教育为经济服务、实现校企合作、走产学研结合之路、推动职业教育向规模化方向发展的新模式。

有人将职业教育集团划分为三类:区域性集团化办学、行业性集团化办学、区域性与行业性相结合的集团化办学。我院的校企合作更适合于行业性集团化办学,因为中铁建设集团下属各工程局和中国中铁股份有限公司下属各局是我院毕业生的主要去向。

行业性集团化办学可以由政府出面组建,高职院校和行业主要参与,也可以直接由高职院校和行业自行联合组建。职教集团不改变各自原有的隶属关系,目的在于方便统一高职院校和行业企业的利益、目标,并在统一的管理机制下进行合作。职教集团的优势在于将高职院校和行业企业捆绑在一起,目标一致、利益一致,容易提高双方合作的积极性和主观能动性,这样一来,仅企业一个发展不叫发展,必须带动高职院校和企业一起发展。

3.4 寻求区域产业群的合作

在专业设置上形成专业群,且就业区域在一定范围内的高职院校适合寻求区域产业群的合作途径。区域上的产业联合相对容易,因为这些产业企业在行政划分上隶属于一个地区,政策、法规等大环境都相同。同时,同在一个地区,有关合作相关事宜的沟通更容易实现,降低了双方的合作成本。更重要的是,区域内合作,有利于区域经济的发展,政府支持力度会更大,政府促成其合作的积极性更高,也会给行业企业一定的福利等,提高了企业的积极性,更容易实现校企合作,实现了三方的共赢。

4.结束语

校企合作的关键在于建立双方互利的机制,否则合作很难进行。基于利益的长效机制的建立又受多方面因素的制约和影响,因此,要走诸如以上的合作途径要考虑到方方面面的因素,如政府的参与度、合作的管理机制、利益机制、合作中风险的分担等。高职院校在选择校企合作的模式和合作途径时,要结合自身和行业、企业、政府等条件和因素,选择适合自己的才是根本。

上一篇:[动物]鹦鹉作文下一篇:彩铃相关音乐版权的说明