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、malloc 

   2、realloc

   3、free

   4、使用建议


一、内存存储区域中堆与栈的区别

动态分配的是堆里面的内存。相比于栈存放的局部变量有以下几点不同:

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 内存管理 | 菜鸟教程 (runoob.com)

C/C++内存管理详解 - 邱明成 - 博客园 (cnblogs.com)

(66 封私信 / 2 条消息) malloc内存未释放问题? - 知乎 (zhihu.com)

C static关键字解析,看完就懂,不迷糊_我要出家当道士-CSDN博客

LinuxC面试宝典笔记.pdf_C语言面试高级-其它文档类资源-CSDN文库

以上是关于linux中设备和驱动到底有啥区别,有啥联系啊?学习2.6的内核,搞得好晕呢!的主要内容,如果未能解决你的问题,请参考以下文章

equals()和==到底有啥区别啊?

麻烦问一下Linux下GPIO驱动的问题,ioctl函数和write函数有啥区别,

大名鼎鼎的RPC和MQ到底有啥区别和联系

C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?

openjdk到底是啥东西啊?有啥作用啊?是否说在linux下编写java程序必须安装openjdk啊?谢谢回答。

刚接触图形图像,对各个工具很迷糊,想知道openGL,GDI,Matlab这些都有啥联系与区别,该怎么使用啊?