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

我在学习写linux驱动程序,以前没接触linux,看《linux设备驱动》看不懂,请高手指点,应该怎样入门?

发布网友 发布时间:2022-04-29 01:48

我来回答

2个回答

热心网友 时间:2023-10-24 12:47

我也在学诶,一起学吧
老师推荐了一本<linux设备驱动程序>中国电力出版社的.看看.
我也没看懂 呵呵

Linux驱动简介
linux中的大部分驱动程序,是以模块的形式编写的.这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载.
模块的概念
linux内核是一个整体是结构.因此向内核添加任何东西.或者删除某些功能 ,都十分困难.为了解决这个问题.引入了内核机制.从而可以动态的想内核中添加或者删除模块.模块不被编译在内核中,因而控制了内核的大小.然而模块一旦被插入内核,他就和内核其他部分一样.同时,如果模块出现问题.,也许会带来系统的崩溃.
1.1模块的实现机制:
启动时,由函数 void inti_moles() 来初始化模块,.因为启动事很多时候没有模块.这个函数往往把内核自身当作一个虚模块.
如由系统需要,则调用一系列以sys 开头的函数,对模块进行操作. 如:sys_creat_moles(),sys_inti_moles() ,sys_deldte_moles()等等.
这里会用到一些模块的数据就结构,在/usr/scr/linux/include/linux/mole.h 中,有兴趣的朋友可以找出来一看块的加入有两种方法:一是手动加入:如:insmod molename.另一种是根据需要,动态的加载模块.如你执行命令: $mount -t msdos /dev/hdd /mnt/d 时.系统便自动加载 FAT模块,以支持MSDOS的文件系统.
1.2 模块编程
写一个模块,必须有一定的多进程编程基础.因为你变得程序不是以一个独立的程序的来运行的.另外,因为,模块需要在内核模式下运行,会遇到在内和空间和用户空间数据交换的问题.一般的数据复制函数无法完成这一个过程.因此系统已入了一些特殊的函数以用来完成内核空间和用户空间数据的交换.
这些函数有:void put _user (type valude,type *u_addr)memcpy_tofs()
等等,有兴趣的朋友可以仔细的看看所有的函数,以及他们的用法.需要说明的是.模块编程河内核的版本有很大的关系.如果版本不通可能造成,内核模块不能编译,或者.在运行这个模块时,出现不可测结果.如:系统崩溃等.
明白了这些以后.你就可以尝试着编写内核模块了.对于每一个内核模块来说.必定包含两个函数
int init_mole() 这个函数在插入内核时启动,在内核中注册一定的功能函数,或者用他的代码代替内和中某些函数的内容(估计这些函数是空的).因此,内和可以安全的卸载.(个人猜测)
int cleanup_mole() 当内核模块谢载时,调用.将模块从内核中清除.
给出一个hello world 的例子
/*hello.c a mole programm*/
/* the program runing under kernel mod and it is a mole*/
#include" linux/kernerl.h"
#include"llinux/mole.h"
/* pross the CONFIG_MODVERSIONS*/
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include""linux/modversions.h"
#end if
/* the init function*/
int init_mole()
{
printk(" hello world !\n');
printd(" I have runing in a kerner mod@!!\n");
return 1;
}
/* the distory function*/
int cleanup_mole()
{printk(" I will shut down myself in kernerl mod /n)";
retutn 0;
}
这样一个例子就完成了.我们也写一个makefile 的例子,以适于我们在大程序重的应用.一下是makfile 文件的内容
# a makefile for a mole
CC=gcc
MODCFLAGS:= -Wall _DMODULE -D_KERNEL_ -Dlinux
hello.o hello.c /usr/inculde?linux/version.h
CC $(MODCFLAGS) 0c hello.c
echo the mole 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
这样你的模块就可以随意的插入和删除了.

热心网友 时间:2023-10-24 12:47

还是先学简单的吧,Windows的!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
css布局绝对定位和相对定位疑惑? 湖北对口单招有哪些大学 湖北单招最好考的学校有哪些 玻璃隔断吗 《八佰》中的南岸刀子,《药神》中的沉默黄毛 有哪些适合新手养的蛇品种推荐? 新手喂养什么宠物蛇比较好? 色叔叔茜色是什么色 仓鼠上窜下跳一直不停,是什么原因? 禽医静心谈鸭黄病毒的主要症状有哪些?鸭子得了黄病毒怎么治疗? 重庆历年高考状元的学校? 2019年查一下重庆11中那年考过重庆高考状元 晚上梦见床上漏电,从床上吓得一边尖叫一边跑下了床,这是怎么回事。 德国买什么东西便宜 我家第一个女孩子叫糖糖第二个女孩叫什么名字 60岁老妇嫁28岁小伙,整容成“少女”,如今两人状况如何? 10年前,那位不顾反对坚持生下两个女儿的60岁老太,如今她过得怎样? 近40岁的年龄差,60老太为爱整容,她与年轻小伙婚后生活如何? 当年60岁老太整容嫁给25岁小伙,称自己这辈子不后悔,如今过得怎么样? 9年前,不顾反对生下一对双胞胎女孩的60岁老太,如今过得怎样? 60岁老太对28岁小伙动心,这小伙是闺蜜的儿子,结果怎么样了? 音乐乐理知识问题 两小节的休止符如何组合 NTFS和FAT32的区别? 怎样在两小时内快速写完作业 当年60岁的安徽老太,不顾2个儿子反对嫁给28岁的小伙,后来怎么样? 乐理中填休止符需要注意什么,哪些拍子能合起来 60多岁老太“被贷款”150万,无法偿还成老赖,她究竟是如何被贷款的? 乐理中的休止符我这样理解正确吗?? 乐理知识-什么是休止符 60岁老太整容成少女模样,只为嫁25岁小鲜肉,后来怎样? iOS15关闭拨号界面语音留言- 问一问 本田缤智电池多久要换? 08年重庆高考状元是谁? 2011年重庆高考状元? 梦见外面狂风暴雨打雷,自己在床上睡觉,山魈从窗户外面伸手想抓我脑袋,被吓醒代表什么意思? 脑梗病人,复查一下,查什么 脑梗后复查都应检查哪些项目 脑梗需要做什么检查? 梦见娘家老宅床上睡了刺痛触电的感觉 FE的英文缩写 怎么设置苹果设置指纹的时候不震动 脑梗塞的病人应做哪些检查(查体和辅助检查) 脑梗复查需要做什么检查啊?急急急,谢谢您 iphone关闭指纹震动 百度公司RD,UE,FE,QA,GA是什么身份 本田缤智电瓶容量多大,缤智怎么看电瓶电量 我梦见自己睡在一个有轨道的床上,可以滑来滑去,吓醒了,不知有什么寓意 脑梗后遗症复查应做哪些检查呢? fe前端工程师中的fe是什么意思 iPhone录指纹如何取消震动提醒