当前位置:  技术问答>linux和unix

到底设备文件是什么

    来源: 互联网  发布时间:2017-01-14

    本文导语:  最近在看ioctl,对设备文件很疑惑,就是 真实的硬件设备和/dev/下的设备是怎样的关系 比如我们对硬件的读写一般就是通过iic,读写寄存器, 而对/dev下的设备文件read或write就不是对真实的硬件寄存器读或写  驱动为...

最近在看ioctl,对设备文件很疑惑,就是
真实的硬件设备和/dev/下的设备是怎样的关系
比如我们对硬件的读写一般就是通过iic,读写寄存器,
而对/dev下的设备文件read或write就不是对真实的硬件寄存器读或写 
驱动为何创建这样的设备文件,有时一个硬件还创建多个设备文件,如config control什么的。
看了ldd中的例子scull,就是对内存操作,但这个例子是没有真实硬件设备对应的,并没介绍和
真实硬件关系9也许是我没有看到0,请大侠解惑

|
 1、设备文件是Linux里对硬件的抽象。
 2、因为最早的Unix系统就是从一个文件系统演变而来的,这也是类Unix系统的一个独到之处。
 3、从面相对象思想来考虑,设备在OS内必须抽象出来,又加上前边诞生的背景,造就了这一现状。不单单是设备被抽象成了文件,还有很多系统服务程序(进程)也被抽象成了文件(比如/proc下的好多东西)。
 4、以文件形式统一管理,使得接口比较统一,操作设备可以和一般文件一样(不是很不可思议么?),不需要定义其它的操作标准。使得整个OS展现也比较简洁。
 5、linux分的有内核态和用户态,内核态可以访问用户态,但是用户态却不可以直接访问内核态(可以系统调用),此时,通过文件来实现,也方便了用户空间和系统空间的交互(从某种意义上来说)。
 6、通过同一以文件形式管理,使得驱动的实现接口也比较统一,如file_operation中定义的,这也是内核与驱动对接的地方,统一又简洁,不用为不同的硬件实现不同的接口。

我是这么理解的,希望我的回答对您有用。。。。。呵呵

|
最后会关联上硬件的,就像你讲的像寄存器写值,以前写过一个简单led驱动,会根据应用程序中ioctl中关键字不一样而在驱动中用witch,case,区分像寄存器中写入不同的值来控制led

|
针对Linux kernel 2.6.X来说:
1. 设备文件是Linux里对硬件的抽象,是由kernel 启动完成后创建了init(PID = 1)的用户进程,
init再执行/etc/init.d/rcS等配置文件里启动了udevd或者mdevd服务程序(是kernel space里的进程), udevd扫描/sys目录(sysfs)中的uevent文件(linux驱动模型)而自动管理(在/dev目录创建或者删除)的设备文件。

2. 驱动创建设备文件的目的是让application调动驱动提供的服务,因为kernel space里,CPU工作在保护模式,不能直接访问硬件。一个驱动当然可以创建多个设备文件,只要驱动开发者愿意。

3. LDD, ULK是经典的好收,多看看,多思考,多调试。

|
ioctl一般是字符设备操作。你就理解为那是一个文件,用户空间和内核空间都可以读,写,就可以了。这个名字是很迷惑人,哈哈。关键是理解它的模型。

|
设备文件就是与设备通信的接口,通过设备文件中的主次设备号以及其他信息可以找到对应的设备,然后可以进行具体的操作!

|
这个是肯定的,驱动和内核说到底是软件,还得通过硬件起作用

|
看看驱动是怎么写的,
file_operation
 实现的read write  ioctl  都由驱动提供,

用记打开一个/dev/xx文件夹,  然后read  write ioctl 实现会调驱动提供的接口。

驱动的read write ioctl等可能就对寄存器进行操作了。


|

和楼主一样,大家回到的很多书上都讲过,我觉得还没有真正回答楼主的问题。
同学习中。。。

我也有和楼主一样打破沙锅问到底的习惯。

|
PS,Linux里的文件分为:正规文件,设备文件,链接文件。设备类型分为:字符设备,块设备,网络设备(只有网络设备没有设备文件,因为由于历史原因,网络是socket接口,这由于tcp/ip协议栈最早是BSD系统中实现(Unix-like)。

知识量比较大,深入的理解需要系统的全面的知识!慢慢来,以后,你会理解的。


    
 
 

您可能感兴趣的文章:

  • 各位高人,关于IDE的驱动程序,我看蒙了,谁能告诉我到底linux源文件中到底那些是跟IDE硬盘驱动有关的?
  • jsp文件到底需不需要编译?
  • 请教锁文件到底是怎么回事?它是什么原理?怎么工作的?多谢!
  • Linux内核的源文件到底在哪个目录下啊?
  • 急问高人:后缀名为ZFS的文件到底怎么打开?
  • 到底包含哪个termios.h头文件?
  • #include<sys/stat.h> 中的stat.h文件到底在哪个目录下面?
  • 求救:我的APACHE配置文件到底怎么了?大家都进来帮帮忙,谢谢。只有50了,倾家荡产问问题。
  • samba 的问题...............到底如何使用它共享windows的文件阿.
  • #include <linux/*.h> :到底加载的哪个路径下的文件?
  • 一直没搞清楚,文件系统到底是怎么回事
  • qt 在windows vs中编程 为什么说头文件 qvbox.h 找不到 而qfont.h却可以找到 这到底是什么原因呢
  • 文件描述符到底是什么东西?
  • Linux下jdk以及tomcat的环境变量到底要设置在哪个文件中?在线等,希望大家踊跃发言!
  • 终端、终端设备、控制台到底有什么区别和联系?(在线等,急!)
  • 在LINUX下编网络设备驱动到底用什么工具比较好?
  • 设备节点到底是个啥?
  • 设备驱动,到底驱动了哪个硬件设备?
  • 字符设备驱动程序编写中,被读写的数据到底应该定义在什么地方?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker 1.12.0到底有哪些不同之处
  • SMARTDRV后台缓冲到底起什么作用呢?
  • 网站到底怎么实现盈利赚钱:个人网站赚钱方法大总结
  • ejb到底怎么回事呀?
  • ---初级问题,byte类型到底表示什么含义--
  • interface 到底有什么用???实现接口,怎么实现??
  • 句柄?句柄?“句柄”到底是什么东西?怎样理解?
  • 到底什么是堆栈?
  • 在线等!大哥们,printk函数到底怎么看他输出的结果?马上给分
  • 到底是提交执行那个?
  • package到底怎么用?
  • umask命令到底怎么用?
  • ioctl() 到底有什么作用??
  • sembuf.sem_num到底如何理解?--初学者向各位请教
  • du命令到底怎么用?
  • 不同的shell之间到底有何区别,与命令有关系吗
  • 请问一下点号到底有什么作用?
  • GCC的naked到底要怎么搞?
  • 学linux到底是学些什么?
  • Makefile 里面的 &< 到底代表什么意思呢?
  • 到底怎么样调试linux内核啊?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3