本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载。

环境搭建:

硬件:OK6410开发板

目标板操作系统:linux 2.6

交叉编译环境:windows 7 + vmware work station + redhat 9 + arm-gcc-linux

步骤:

编写简单内核模块,如下

#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void){
printk("hello_init");
return ;
}
static void hello_exit(void){
printk("hello_exit");
}
module_init(hello_init); //加载时调用
modeule_exit(hello_exit);//卸载时调用

编写makefile(网上现成的模板):

KERNELDIR = /home/linux-2.6./linux-2.6.36.2-v1.05 //交叉编译环境中的内核源码路径
PWD := $(shell pwd)
CC = arm-linux-gcc obj-m := driver01.o //与编译的.c文件同名 modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //前面要有tag clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules clean

编译产生driver01.ko,拷贝至目标板(采用SD卡),执行:insmod driver01.ko,控制台打印“hello_init”。执行lsmod后显示:

备注:

1. “ error: generated/bounds.h: No such file or directory” 编译错误,makefile中的kerneldir是内核源码的地址,在编译时用于头文件的引用。bounds.h是需要linux编译后生成,因此出现该问题需要make一下linux源码;

2. "module license 'unspecified' taints kernel" 告警,原因是内核模块源码中未增加“MODULE_LICENSE("GPL");”

3. arm-linux-gcc安装完后,在redhat linux中通过修改etc/profile增加环境变量,如下:

# Path manipulation
if [ `id -u` = ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /home/arm/usr/local/arm/4.3.2/bin
fi

4. 在windows 7下通过ssh客户端连接vmware上的redhat时,IP用的是vmawre的虚拟网卡,而非xp时真实的网口ip。

linux 2.6 驱动笔记(一)的更多相关文章

  1. linux 2.6 驱动笔记(三)

    驱动的并发与应用的并发实现一样,以信号量为例,修改基本字符驱动代码如下: 1. 增加sem定义 struct globalmem_dev{ struct cdev cdev; /*linux 2.6 ...

  2. linux 2.6 驱动笔记(二)

    字符设备驱动 linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分: 1. 定义一个字符类型设备驱动的结构体 struct globalmem_dev ...

  3. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  4. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  5. LINUX驱动笔记 目录

    笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...

  6. TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

    作者:彭东林 邮箱:pengdonglin137@163.com 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   Na ...

  7. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  8. [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  9. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

随机推荐

  1. POJ 3469 Dual Core CPU 最大流

    划分成两个集合使费用最小,可以转成最小割,既最大流. //#pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...

  2. 异步I/O操作

    今天在看boost库的时候注意到异步I/O操作时,缓冲区有效性问题. 如何实现异步操作:以异步读操作为例async_read(buffer, handler): void handler() {} v ...

  3. mysql.connector操作mysql的blob值

    This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...

  4. 云存储的那些事(2)——数据分布算法CRUSH

    在分布式系统中,数据最终还是要存储到物理设备上的,ceph的底层设备抽象角色是OSD,那么数据是如何被决定放在哪块OSD上的,答案就是CRUSH算法. 关键字:CRUSH.一致性hash.ceph数据 ...

  5. js二维数组与字符串

    1. 二维数组:数组中的元素,又引用了另一个数组对象 何时使用:只要保存横行竖列的数据, 具有上下级包含关系的数据, 创建二维数组: 1. var arr=[]; col arr[0]=[" ...

  6. 修改win7电脑中所有文件的默认查看方式

    怎么修改win7电脑中所有文件的默认查看方式   如何设置才可以得到如下的效果:比如说打开一个盘符或者一个文件夹,进行设置之后,这个盘符里或者这个文件夹下的所有子文件夹.所有子文件夹里的所有文件都以“ ...

  7. 什么是F#

    作者:Alexey Bykov@EastBancTech原文:http://bit.ly/1nGroOz翻译:kk1982.com转载请注明 简介 F#是由微软研究团队为.NET平台研发的一种现代函数 ...

  8. Java 获取 Unix时间戳

    unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒. 在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题. 但是,因为需求是需要int类 ...

  9. I2C VHDL程序

    http://blog.sina.com.cn/s/blog_9bd80b7601012o9y.html library ieee ; use ieee.std_logic_1164.all ; us ...

  10. fcc

    function spinalCase(str) { if(str.split(/\W|_/).length==1){ for(var i=0;i<str.length;i++){ if(/[A ...