linux中设备和驱动到底有啥区别,有啥联系啊?学习2.6的内核,搞得好晕呢!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中设备和驱动到底有啥区别,有啥联系啊?学习2.6的内核,搞得好晕呢!相关的知识,希望对你有一定的参考价值。
设备和驱动,有啥区别,一个硬件一个软件。linux驱动现在到2.6版已经改进很多了,现在的驱动架构早已框架化,硬件生产商提供一套sheet表,里面详细注明了该硬件的各项参数,重点是各个寄存器的赋值方式,中断号,某些特殊管脚的地址等,参照这个sheet表,照linux驱动设计流程写驱动,一般是cdev(其他的没写过不太懂,这就不提了),重点是注册中断,对管脚的轮询,读写寄存器等。这样硬件的状态通过硬中断或轮询管脚状态获得,上报给工作队列,唤醒进程,在对寄存器读写操作,这样硬件和软件就联系起来了。
lz重点是要学驱动还是kerenl?学kernel的话2.6版本太高了(若只是学习代码修改修改除外),很多东西隐藏太深不易理解啊!追问
重点想学习驱动,不知道什么水平才能作为linux驱动工程师啊?
参考技术A 2.6.x版本的内核,核心部分变动不大。每个小版本之间,都是在不停的添加新驱动、解一些小bug、对现有系统进行完善。
你如果让我在这里说每个版本之间的区别的话,估计要写好几页了。建议你到官网(www.kernel.org/目前已经可以访问了)上去看下每个版本的ChangeLog。这个东西,没有任何人比它说的更详细了。如果你对某个修改比较感兴趣,还可以下载对应的patch包,看看那些Hacker究竟做了哪些修改。
当然,最方便的方法,还是使用git把Kerne的代码下载下来,然后用git log命令可以看到每次修改的历史信息的。非常方便和详细。
不明白的请追问。追问
谢谢您的回复,感觉很受用,不过那个设备和驱动是什么关系啊?比如那个总线-设备-驱动模型,设备和驱动有何不同啊?我所理解的设备是外围的硬件,驱动是驱动硬件的软件,为什么设备还有结构体描述它呢?
参考技术B 设备建立在驱动之上;例如串口,它是一个设备,我们可以用读写文件的方式去访问它,而驱动则是直接跟串口的硬件层打交道的,它提供相关的接口函数给设备 参考技术C LINUX中外部硬件也是用文件形式来表示的就是etc目录下的,叫做设备,驱动还是驱动程序C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?
目录
一、内存存储区域中堆与栈的区别
动态分配的是堆里面的内存。相比于栈存放的局部变量有以下几点不同:
1、动态分配中内存的管理需要程序员进行控制,基本流程是先申请,使用完后进行释放;不释放的话会造成内存泄漏。
2、动态分配可申请很大的空间(堆,向高地址扩展,所以空间往很大了想),虽然受制于当前内存使用状况,机器参数等,但相比于栈(栈顶固定,向低地址扩展,所以空间固定,1M~2M)还是要大得多。
3、动态分配的效率较低。申请内存时,会在一个空闲内存链表中寻找满足申请空间大小的内存块,找到之后分割满足用户需求的内存块返回给用户。哈哈,有点类似于你在一个房间里找一块空间放物品,虽然每次很大可能找到差不多的空间使用,但由于你每次堆放的物品大小都不一致,所以不能很好的全局规划,最后造成房间里很乱,很多犄角旮旯的地方,存在很多碎片空间。每次放新的物品都要在房间里转一圈才能找到合适的空间,甚至可能出现失败的情况,因为房间里已经找不到整块的连续的空间供你使用。
二、动态分配函数解析
1、malloc
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
如果设置的参数为 0,则返回空指针或者一个特殊的指针(会被 free() 忽略)。
void *malloc(int num);
使用该函数后需要根据具体的接收指针的类型强制转换一下。 并判断是否为空,因为可能出现分配失败的情况。
// 分配一个长度为 10 的数组,一共 40 byte
int *array = (int *)malloc(sizeof(int) * 10);
if (array == NULL)
printf("malloc failed\\n");
return -1;
2、realloc
若 malloc 分配的内存不够用,可以使用该函数进行扩容。原有的内容不变,新申请的空间未初始化。
如果 address 是 NULL,则该函数等同于 malloc 函数;
如果 newsize 为 0,则该函数等同于 free 函数。
void *realloc(void *address, int newsize);
你可能会问,为啥不用 malloc 重新申请呢? 嘿嘿,malloc 重新分配的话,其空间不会被初始化的,需要你把原来的值先备份,并free掉该空间后,重新赋值到新的变量上,效率很低的。
char *strs = (char *)malloc(sizeof(char) * 2);
// 扩容 1 个
strs = (char *)realloc(strs, sizeof(char) * 3);
3、free
申请的空间需要释放。虽然有时候程序跑完就结束,系统也会自动回收内存,但良好的代码编写习惯还是要养成。同一个动态申请内存的指针只能free一次,否则会报错的呀(free(): double free detected in tcache)。
void free(void *address);
4、使用建议
(1)为了防止出现野指针,指针必须初始化为 NULL ,使用完后释放资源资源,需重新使其变为 NULL。
(2)指针都应该指向一个合法的内存地址,要注意类似 char *str
等类型的代码,必须分配内存空间后再赋值。
(3)给指针分配内存的时候,一定要充足,防止内存越界。类似于结构体等类型,需要计算其所占内存空间(可查看C结构体的内存对齐知识点)。
(4)指针内存分配结束后,记得初始化,其默认值可能不为0。
(5)使用 malloc 分配内存的时候可能遇到机器内存不足的情况,所以使用前一定要检查 if(NULL != p)
(6)参考以下使用顺序
int *p = (int *)malloc(10 * sizeof(int));
if (NULL != p)
...
free(p);
p = NULL;
参考:
C/C++内存管理详解 - 邱明成 - 博客园 (cnblogs.com)
(66 封私信 / 2 条消息) malloc内存未释放问题? - 知乎 (zhihu.com)
C static关键字解析,看完就懂,不迷糊_我要出家当道士-CSDN博客
LinuxC面试宝典笔记.pdf_C语言面试高级-其它文档类资源-CSDN文库
以上是关于linux中设备和驱动到底有啥区别,有啥联系啊?学习2.6的内核,搞得好晕呢!的主要内容,如果未能解决你的问题,请参考以下文章
麻烦问一下Linux下GPIO驱动的问题,ioctl函数和write函数有啥区别,
C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?