linux 内核模块 和 驱动程序的编写(1)

HDU操作系统课程设计实验一 HDU操作系统课程设计实验一实验一:Linux内核编译及添加系统调用一、设计目的二、内容要求三、实验内容修改Linux内核标签添加系统调用编译内核显示当前系统名称版本的系统调用修改niceprio值的系统调用改变主机名称为自定义字符串的系统调用四、实验核心代码 实验一:Linux内核编译及添加系统调用 这是一个很简单、基础的实验,只需要看懂源码,然后在源码中稍作修改就行。注意:编译内核花费时间比较长,长则一天,短则2-3小时,如果用虚拟机记得多开机器核心数目(机器核心数目越多越快,但不要超过物理机的核心 阅读详情

linux 内核模块 驱动程序的编写(1)

作者

: sunmoon

<http://os.silversand.net>

linux内核是一个整体是结构.因此向内核添加任何东西.或者删除某些功能 ,都十分困难.为了解决这个问题.引入了内核机制.从而可以动态的想内核中添加或者删除模块.

模块不被编译在内核中

,因而控制了内核的大小.然而模块一旦被插入内核,他就和内核其他部分一样.这样一来就会曾家一部分系统开销.同时,如果模块出现问题.,也许会带来系统的崩溃.

1.1

模块的实现机制:

启动时

,由函数 void inti_modules() 来初始化模块,.因为启动事很多时候没有模块.这个函数往往把内核自身当作一个虚模块.

如由系统需要

,则调用一系列以sys 开头的函数,对模块进行操作. :sys_creat_modules(),sys_inti_modules() ,sys_deldte_modules()等等.

这里会用到一些模块的数据就结构

,/usr/scr/linux/include/linux/module.h ,有兴趣的朋友可以找出来一看

块的加入有两种方法

:一是手动加入::insmod modulename.另一种是根据需要,动态的加载模块.如你执行命令: $mount -t msdos /dev/hdd /mnt/d .系统便自动加载 FAT模块,以支持MSDOS的文件系统.

1.2

模块编程

写一个模块

,必须有一定的多进程编程基础.因为你变得程序不是以一个独立的程序的来运行的.另外,因为,模块需要在内核模式下运行,会遇到在内和空间和用户空间数据交换的问题.一般的数据复制函数无法完成这一个过程.因此系统已入了一些特殊的函数以用来完成内核空间和用户空间数据的交换.

这些函数有

:void put _user (type valude,type *u_addr)

memcpy_tofs()

等等

,有兴趣的朋友可以仔细的看看所有的函数,以及他们的用法.需要说明的是.模块编程河内核的版本有很大的关系.如果版本不通可能造成,内核模块不能编译,或者.在运行这个模块时,出现不可测结果.:系统崩溃等.

明白了这些以后

.你就可以尝试着编写内核模块了.对于每一个内核模块来说.必定包含两个函数

int init_module()

这个函数在插入内核时启动,在内核中注册一定的功能函数,或者用他的代码代替内和中某些函数的内容(估计这些函数是空的).因此,内和可以安全的卸载.(个人猜测)

int cleanup_module()

当内核模块谢载时,调用.将模块从内核中清除.

同其他的程序设计教程一样

,我们给出一个hello world 的例子

/*hello.c a module programm*/

/* the program runing under kernel mod and it is a module*/

#include" linux/kernerl.h"

#include"llinux/module.h"

/* pross the CONFIG_MODVERSIONS*/

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include""linux/modversions.h"

#end if

 

/* the init function*/

int init_module()

{

printk(" hello world !/n');

printd(" I have runing in a kerner mod@!!/n");

return 1;

}

/* the distory function*/

int cleanup_module()

{

printk(" I will shut down myself in kernerl mod /n)";

retutn 0;

}

这样一个例子就完成了

.我们也写一个makefile 的例子,以适于我们在大程序重的应用.一下是makfile 文件的内容

# a makefile for a module

CC=gcc

MODCFLAGS:= -Wall _DMODULE -D_KERNEL_ -Dlinux

hello.o hello.c /usr/inculde?linux/version.h

CC $(MODCFLAGS) 0c hello.c

echo the module is complie completely

然后你运行

make 命令 得到hello.o 这个模块.运行

$insmod hello.o

hello world!

I will shut down myself in kernerl mod

$lsmod

hello (unused)

….

$remmod

I will shut down myself in kernerl mod

这样你的模块就可以随意的插入和删除了

.
编写一个简单的内核模块 #include #include #include static int __init lkp_init(void) { printk(KERN_EMERG"Hello,Kernel!\n"); printk(KERN_ALERT"Hello,Kernel!\n"); printk(KERN_CRIT"Hello,Kernel!\n"); printk(KE 阅读详情

相关推荐

linux编写一个简单的内核模块

编写一个简单的内核模块 (一)实验目的 Linux 操作系统的内核是单一体系结构(monolithic kernel)的,也就是说,整个内核是一个单独的非常大的程序。这样,系统的速度性能都很好,但是可扩展性维护性就相对比较差。为了弥补单一体系结构的这种缺陷,Linux操作系统使用了一种全新的机制-模块机制,用户可以根据需要,在不需要对内核重新编译的情况下,模块能动态地载入内核或从内核移出。 本...

qq_41032508的博客 5519

Linux驱动程序入门-----------------------------驱动程序框架

 序言 Linux是Unix操作系统的一种变种,在Linux编写驱动程序的原理思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了

zilong91的专栏 2447

Linux内核模块编写方法技巧

内核模块可以在不重新编译内核的情况下添加到内核代码中运行,其可以动态加载卸载,因此可以根据需要将内核某些功能独立出来作为模块,而不是编译到内核中,这样可以减少内核大小,并且可以按照实际需求选择裁剪或添加某些内核功能。 1. 编写一个内核模块 需要先强调一个最基本的知识,内核模块是要运行在内核态的代码,所以编写内核模块需要包含的头文件都是内核中的头文件,使用的函数都是内核的函数。 编写

落尘纷扰的专栏 4548

嵌入式Linux驱动开发(一)一个简单的Linux内核模块框架

#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h>static int __init mod_init(void) { return 0; }static void __exit mod_exit(void) { printk("cleanup module\n"); } module

mark's blog 1886

Linux内核驱动学习---编写最简单Linux内核模块HelloWorld

以下内容来源于 https://blog.csdn.net/lihaoweiV/article/details/6602261 https://blog.csdn.net/sh21_/article/details/60878812 https://blog.csdn.net/u010632165/article/details/86541941 https://blog.csdn.net/FallingU/article/details/76166194 什么是内核模块 模块是可以根据实际需要可以动态加

weixin_46048542的博客 1726

get_word_count

[root@localhost word_count]# rmmod word_count [root@localhost word_count]# ./build.sh 1:Ubuntu Linux 2:S3C6410开发板 3:Android模拟器 请选择要在那类设备上运行(11 make: Entering directory `/usr/src/kernels/2.6.18-

autumn20080101的专栏 879

Johannes 《Linux内核模块设备驱动开发:编写Linux驱动程序》(1)hello world

shell 表示shell 脚本,uname -r 表明系统的内核版本,/lib/modules/$(shell uname -r)/build 等于表达内核目录,相当于开发路径。所以这个命令等于 make -C /lib/modules/xxx/build M=xxx(当前目录) modules。module.h 提供内核动态加载移除,init.h 提供内核函数如何加载移除。程序最后是内核开发的MODULE_LICENSE(“GPL”).内核的许可证。all .实际的生成命令,等于make all。

dok12的博客 261

linux内核模块驱动程序编写

linux内核是一个整体是结构.因此向内核添加任何东西.或者删除某些功能 ,都十分困难.为了解决这个问题.  引入了内核机制.从而可以动态的想内核中添加或者删除模块.  模块不被编译在内核中,因而控制了内核的大小.然而模块一旦被插入内核,他就内核其他部分一样.这样一来  就会曾家一部分系统开销.同时,如果模块出现问题.,也许会带来系统的崩溃.  1.1模块的实现机制:  启

Jingle的专栏 2274

编写Linux内核模块/驱动程序,并提供ioctl接口

文章目录什么是Linux内核模块驱动程序ioctl?Linux内核模块Linux Kernel Module硬件驱动程序(Hardware Driver)ioctl写一个简单的内核模块内核模块HelloWorld内核模块Makefile编写一个提供ioctl接口的设备驱动程序内核模块Linux的设备设备的分类设备的主编号(major number)副编号(minor number)...

Code of StayrealS 2964

Linux内核模块详解

内核模块 实验目的 内核模块Linux操作系统中一个比较独特的机制。通过这一章学习,希望能够理解Linux提出内核模块这个机制的意义;理解并掌握Linux实现内核模块机制的基本技术路线;运用Linux提供的工具命令,掌握操作内核模块的方法。 实验内容 针对三个层次的要求,本章安排了3个实验。 第一个实验,编写一个很简单的内核模块。虽然简单,但它已经具备了内核模块的基本要素。此同时,...

Kunaly 2万+

linux 内核模块/驱动程序 ioctl接口 实现

目录 什么是Linux内核模块驱动程序ioctl? Linux内核模块Linux Kernel Module硬件驱动程序(Hardware Driver) ioctl 写一个简单的内核模块 内核模块HelloWorld Linux的设备 设备的分类 设备的主编号(major number)副编号(minor number) 编写驱动程序 什么是Linux内核模块驱动程序ioctl? Linux内核模块Linux Kernel Module硬件驱动程序(Hardwa

whatday的专栏 2860

如何编写一个Linux内核模块,这次手把手教你

Linux 系统为应用程序提供了功能强大且容易扩展的 API,但在某些情况下,这还远远不够。硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块Linux 内核模块是一段编译后的二进制代码,直接插入 Linux 内核中,在Ring 0(x86–64处理器中执行最低受保护程度最低的执行环)上运行。这里的代码完全不受检查,但是运行速度很快,可以访问系统中的所有内容。Intel X86架构使用了4个级别来标明不同的特权级。Ring 0实际就是内核态,拥有最高权限。而一般应用程序处于Ring。

嵌入式Linux内核的博客 2817

Linux编写内核模块及文件读写

sysfs是什么sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织。除了二进制文件外(只有特殊场合才使用),sysfs文件内容均以ASCII格式保存,且一个文件只保存一个数据,另外,一个文件不可大于一个内存页(通常为4096字节)。项目要求将char数组保存到属性文件,下面将介绍如何完成。Linux内核模块是什

chrisnotfound 1万+

[Linux驱动开发一]最简单的内核模块

[Linux驱动开发一]最简单的内核模块

weixin_42857944的博客 3384

Linux字符设备驱动程序开发(1)-使用字符设备驱动

1、使用字符设备驱动程序 1.1编译/安装驱动 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块。把下面的范例代码拷贝到Linux系统中: #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h&...

上善若水 7169

1.1 Linux内核模块编写

Linux内核模块是一段单独编译的内核代码,它在Linux内核空间运行,在需要时被加入内核,在不需要时也可从内核中卸载。

lf282481431的博客 2106

linux 模块驱动程序,Linux 内核模块驱动程序的详细编写

linux内核是一个整体是结构。因此向内核添加任何东西。或者删除某些功能 ,都十分困难。为了解决这个问题。引入了内核机制。从而可以动态的想内核中添加或者删除模块。模块不被编译在内核中,因而控制了内核的大小。然而模块一旦被插入内核,他就内核其他部分一样。这样一来 就会曾家一部分系统开销。同时,如果模块出现问题。,也许会带来系统的崩溃。11模块的实现机制:启动时,由函数 void inti_mod...

weixin_36208265的博客 364
上一篇: Linux 内核配置及编译简介
wwwunix
博客等级 码龄26年 103粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值