问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

x86架构下linux驱动编程 看什么书?

发布网友 发布时间:2022-04-22 20:27

我来回答

1个回答

热心网友 时间:2022-05-05 06:22

编写好驱动,通过挂载的方法将驱动程序挂载到内核里面,大致步骤如下:
一: 1>建立以.c为后缀的c语言程序文件(里面包含了设备名及设备号等)
2>建立Makefile文件(作用是通过make来产生设备文件*.ko文件,里面可以建立自己的平台所需的设备文件如:arm等).make产生相应的设备文件
二: 要在/dev下建立相应的设备结点(设备名),用insomd *.ko命令将相应的驱动设备文件挂载到内核中.
三:编写测试文件(.c文件)用来测试内核是否已近成功挂载到内核.(编写好相应的测试文件后,用gcc –o Filename Filename.c(测试文件名)来产生相应的可执行文件).
四:如果设备驱动挂载成功,当执行测试文件(./Filename)时会产生相应的结果.

五:可能用到的相关命令:
1.lsmod:列出内核已经载入模块的专题.
输出:
Mole(模块名)size(大小)used by (被..使用)
2.demop:分析可加载模块的依赖性,生成moles.dep文件和映射文件
3.uname –r 显示内核版本(在编写Makefile时使用到)
4.modprobe : linux内核添加和删除模块(相关参数请查看man帮助文档)
5.modinfo:显示内核模块的信息.
6.insmod: 向linux内核中加载一个模块,用法:insmod[filename] [mole options…]
7.rmmod: 删除内核中的模块, 用法: rmmod [-f,w,s,v][molename]
8.dmesg: 显示内核缓冲区,内核的各种信息,内核启动时的信息会写入到/var/log/下.

六.例子1:
第一步:增加头文件和宏定义
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/mole>
#include <linux/kernel>

第二步:添加与字符设备定义及注册有关的数据成员
//定义设备名称
#define DEVICE_NAME "test" //设备名
#define BUF_SIZE 1024
static char tmpbuf[BUF_SIZE];

//定义主次设备号
static unsigned int TestMajor=0; //主
static unsigned int TestMinor=0; //次

static struct cdev *test_cdev;
static dev_t dev;

第三步:增加open/release函数

static int test_chardev_open(struct inode *inode,struct file *file)
{
printk("open major=%d, minor=%d\n", imajor(inode),
iminor(inode));
return 0;
}

static int test_chardev_release(struct inode *inode,struct file *file)
{
printk("close major=%d,minor=%d\n",imajor(inode),
iminor(inode));
return 0;
}

第四步:增加read函数
static ssize_t test_chardev_read(struct file *file,char __user *buf,
size_t const count,loff_t *offset)
{
if(count < BUF_SIZE)
{
if(copy_to_user(buf,tmpbuf,count))
{
printk("copy to user fail \n");
return -EFAULT;
}
}else{
printk("read size must be less than %d\n", BUF_SIZE);
return -EINVAL;
}
*offset += count;
return count;
}

第五步:增加write函数
static ssize_t test_chardev_write(struct file *file, const char __user*buf,size_t const count,loff_t *offset)
{
if(count < BUF_SIZE)
{
if(copy_from_user(tmpbuf,buf,count))
{
printk("copy from user fail \n");
return -EFAULT;
}
}else{

printk("size must be less than %d\n", BUF_SIZE);
return -EINVAL;
}
*offset += count;
return count;
}

第六步:添加增加file_operations成员

static struct file_operations chardev_fops={
.owner = THIS_MODULE,
.read = test_chardev_read,
.write = test_chardev_write,
.open = test_chardev_open,
.release = test_chardev_release,
};

第七步:在模块的入口添加设备的设备号获取及设备注册
static int __init chrdev_init(void)
{
int result;

if(TestMajor)
{
dev=MKDEV(TestMajor,TestMinor);//创建设备编号
result=register_chrdev_region(dev,1,DEVICE_NAME);
} else {
result=alloc_chrdev_region(&dev,TestMinor,1,DEVICE_NAME);
TestMajor=MAJOR(dev);
}
if(result<0)
{
printk(KERN_WARNING"LED: cannot get major %d \n",TestMajor);
return result;
}

test_cdev=cdev_alloc();
cdev_init(test_cdev,&chardev_fops);
//test_cdev->ops=&chardev_fops;
test_cdev->owner=THIS_MODULE;
result=cdev_add(test_cdev,dev,1);
if(result)
printk("<1>Error %d while register led device!\n",result);

return 0;
}

第八步:在模块的出口函数增加设备设备号释放及设备注销函数

unregister_chrdev_region(MKDEV(TestMajor,TestMinor),1);
cdev_del(test_cdev);

第九步:编译并加载该模块

第十步:根据设备号的设置,在文件系统中建立对应的设备节点
#mknod /dev/test c XXX XX

例子2:
驱动文件:
#include <linux/init.h>
#include <linux/mole.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/uaccess.h>

#define DEVICENAME "ccccc"

unsigned int major=221;
unsigned int minor=0;
struct cdev *abc;
dev_t dev;
static char bufrh[1024]="read success!";

static int aaaaa_open(struct inode *inodep, struct file *filep)
{
printk("read success!\n");
return 0;
}

int aaaaa_release(struct inode *inodep, struct file *filep)
{
return 0;
}
static ssize_t aaaaa_read (struct file *filep, char __user *buf, size_tcount, loff_t *offset)
{
if(copy_to_user(buf, bufrh, 1))
{
printk("copy_to_user fail!\n");
}
return 0;
}

ssize_t aaaaa_write (struct file *filep, const char __user *buf,size_t count, loff_t *offse)
{
printk("write!\n");
return 0;
}

static const struct file_operations fops = {
.owner = THIS_MODULE,
.open = aaaaa_open,
.release = aaaaa_release,
.read = aaaaa_read,
.write = aaaaa_write,

};

static int __init aaaaa_init(void)
{
int a;
dev=MKDEV(major, minor);
a=register_chrdev_region(dev, 1, DEVICENAME);

abc=cdev_alloc();
abc->owner=THIS_MODULE;
cdev_init(abc, &fops);

cdev_add(abc, dev, 1);

return 0;
}

static void __exit aaaaa_cleanup(void)
{
cdev_del(abc);
unregister_chrdev_region(dev, 1);
}

mole_init(aaaaa_init);
mole_exit(aaaaa_cleanup);
MODULE_LICENSE("GPL ");

Makefile文件:

obj-m += firstqd.o(相应设备文件名)

KERDIR = /usr/src/linux-headers-2.6.32-24-generic
#KERDIR=/home/linux2.6/linux #arm骞冲彴
PWD=$(shell pwd)

moles:
$(MAKE) -C $(KERDIR) M=$(PWD)moles

pc:
gcc -o fristqd firstqd.c
arm:
arm-linux-gcc -o fristqd firstqd.c

clean:
rm -rf *.o *~core *.depend *.cmd *.ko *.mod.c *.tmp_versions

测试文件(test.c):

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>

char buf[1024];
char bufw[1024]="write success";
int main()
{
int fd,m,n;
fd=open("/dev/aaa",O_RDWR);
if (fd)
{
m=read(fd,buf,100);
printf("read kernel:%s\n",buf);

n=write(fd,bufw,10);
}
//printf("ni hao");
return 0;

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 买psp3000好还是ipod Touch3好? 关于MOTO,E6的问题 车祸,十级伤残,大概能赔到多少钱 十级伤残一般能赔偿多少钱? 工伤,10级伤残能赔多少钱 手机屏幕出现5G网络连接是怎么回事 5g手机有5g网络吗 4g手机和5g手机连WIFI网速有区别吗? 是不是我在手机上发现有一个5G标识,就意味着我使用的是5G网络呢? 为什么手机有时是4g有时是5g和收费有关系吗? 5G手机和网络是什么东西?和我的无线路由器5G有什么区别 手机信号5G标识意味着5G信号吗? 一直说的5G手机,跟其他手机有什么区别吗?技术上有没有什么困难? 华为5g和华为手机有关系吗??? 移动5G网络对手机的配置有什么要求 5G和4G有什么区别,4G手机用的了5G吗 5G手机是不是特别消耗流量? 5G网络出了手机有影响吗 5G网络快出来了,用的话跟什么手机有关系吗,现在的4G手机能用5G网吗,或者5G手机什么时候上市? 5G手机为什么没有5G网? 琥珀蜜蜡平安扣J50425132价格应该是多么? 做梦梦到在自己公司大厅大便是什么意思 老是梦见自己在公共场所大便? 谁会解梦啊,我已经连续两个晚上,梦见自己在公共场合憋不住而拉屎,而且... 周公解梦。梦见拉大便是好是坏? 梦到在公共场合拉屎还带根虫 解梦, 1,,梦见自己在公共场所(好像是火车站)拉大便,拉 做梦梦见自己在公共场合拉大便拉了很久很硬然后被人指责自己哭 C4D建模+渲染需要什么样配置? C4D的使用需要什么样的电脑配置才可以运行 配一台电脑主机价格8500到10000(用于C4D,OC渲染器,AE)问下什么配置合适? 怎么看电脑配置能不能用C4D? 想问下用C4D渲染电脑都要什么配置 学习ae,c4d需要什么配置的电脑,2014 组装一台建模、渲染的电脑,预算12000,可用2020版3dmax.c4d的.含各种配件,如何配? 请问C4D的OC渲染器支持的显卡是越好越快吗? - 信息提示 想提升电脑配置,求帮忙看下,我工作主要用到C4D渲染和AE,游戏玩吃鸡,我这电脑要怎么换配置才可以? 请问我的这个平板电脑配置可以运行C4D吗?会很卡吗? 苹果电脑怎么提前知道Cinema 4D在自己现有电脑配置进行渲染效果如何?