Linux驱动开发与Linux嵌入式开发都有哪些相同点和不同点?两者都要学的基础知识都有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动开发与Linux嵌入式开发都有哪些相同点和不同点?两者都要学的基础知识都有哪些?相关的知识,希望对你有一定的参考价值。

Linux嵌入式开发包括了Linux驱动开发.Linux嵌入式开发,包括了从应用层到底层驱动等等,驱动开发就属于底层开发.
都要学的基础知识,就是C语言,Linux,还有各种计算机原理那块的知识.
参考技术A 应该说嵌入式开发范围大一点,linux驱动开发是相对底层的,上面还有应用层开发,下面有硬件,驱动跟其他一些库的开发是在硬件的基础上为应用开发提供接口,而这所有的开发都叫嵌入式开发 参考技术B 嵌入式开发包括了驱动开发。基础知识:程序语言,操作系统,驱动架构,硬件知识等。网上有很多嵌入式学习方面的书单整理,你看看就知道了。 参考技术C 驱动开发需要对硬件有一些基础,而嵌入式开发是纯应用的。两者都需要linux系统基础操作。 参考技术D 基本没有区别,需要学习linux下面系统的开发。

嵌入式开发(七):linux字符型设备驱动初步

参考技术A 姓名:王芷若    学号:19020100180

学院:电子工程学院

【嵌牛导读】:本篇文章整理Linux知识点—Linux字符型设备驱动初步。

【嵌牛鼻子】:Linux设备类型,结构体,驱动模块

【嵌牛提问】:Linux设备有什么类型?关键函数有哪些?

【嵌牛内容】–linux字符型设备驱动初步

一、Linux字符设备驱动初步

1、Linux设备类型

(1)字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。

(2)块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。

(3)网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备驱动程序。在/dev目录下也没有文件来表示网络设备。

2、开发流程

在这里插入图片描述

3、关键函数讲解(以2.6以下版本内核为例)

(1)驱动模块注册register_chrdev()函数

原型:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);

major:主设备号,该值为 0 时,自动运行分配。而实际值不是 0 ;

name:设备名称;

fops:操作函数,实现驱动定义的open、read、write、close等内核函数与应用程序调用的open、read、write、close间的映射;

返回值:

major 值为 0 ,正常注册后,返回分配的主设备号。如果分配失败,返回 EBUSY 的负值 ( -EBUSY ) 。major 值若大于 linux/major.h (2.4内核)中声明的最大值 (#define MAX_CHRDEV 255) ,则返回EINVAL 的负值 (-EINVAL) 。指定 major 值后,若有注册的设备,返回 EBUSY 的负值 (-EBUSY)。若正常注册,则返回 0 值

(2)驱动注销unregister_chrdev()函数

原型:

#include <linux.fs.h>

int unregister_chrdev (unsigned int major, const char *name)

变量:

major 主设备号

name 设备文件

返回值:

major 值若大于 linux/major.h (2.4 内核)中声明的最大值 (#define MAX_CHRDEV 255),返回 EINVAL的负值 (-EINVAL)。指定了 major的值后,若将要注销的 major 值并不是注册的设备驱动程序,返回 EINVAL的负值 ( -EINVAL )。正常注销则返回 0值。

(3)File_operation结构体

file_operations结构是建立驱动程序和设备编号的连接,内部是一组函数指针,每个打开的文件,也就是file结构,和一组函数关联,这些操作主要用来实现系统调用的

struct file_operations

  struct module *owner;//拥有该结构的模块的指针,一般为THIS_MODULES

loff_t (*llseek) (struct file *, loff_t, int);//用来修改文件当前的读写位置

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备中同步读取数据

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向设备发送数据

ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的读取操作

ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的写入操作

  int (*readdir) (struct file *, void *, filldir_t);//仅用于读取目录,对于设备文件,该字段为NULL

unsigned int (*poll) (struct file *, struct poll_table_struct *); //轮询函数,判断目前是否可以进行非阻塞的读写或写入

  int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); //执行设备I/O控制命令

  long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); //不使用BLK文件系统,将使用此种函数指针代替ioctl

  long (*compat_ioctl) (struct file *, unsigned int, unsigned long); //在64位系统上,32位的ioctl调用将使用此函数指针代替

  int (*mmap) (struct file *, struct vm_area_struct *); //用于请求将设备内存映射到进程地址空间

  int (*open) (struct inode *, struct file *); //打开

  int (*flush) (struct file *, fl_owner_t id);

  int (*release) (struct inode *, struct file *); //关闭

  int (*fsync) (struct file *, struct dentry *, int datasync); //刷新待处理的数据

  int (*aio_fsync) (struct kiocb *, int datasync); //异步刷新待处理的数据

  int (*fasync) (int, struct file *, int); //通知设备FASYNC标志发生变化

  int (*lock) (struct file *, int, struct file_lock *);

  ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

  unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

  int (*check_flags)(int);

  int (*flock) (struct file *, int, struct file_lock *);

  ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

  ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

  int (*setlease)(struct file *, long, struct file_lock **);

;

以上是关于Linux驱动开发与Linux嵌入式开发都有哪些相同点和不同点?两者都要学的基础知识都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式开发(七):linux字符型设备驱动初步

谁能给我说一下嵌入式Linux的开发流程包括哪些步骤?请详细介绍,谢谢了

嵌入式Linux驱动开发 01:基础开发与使用

linux驱动开发重点关注内容--摘自《嵌入式Linux驱动模板精讲与项目实践》

Linux内核开发与Linux驱动开发有啥关系?

嵌入式linux与51/430/STM32的嵌入式开发的区别与关联