文档章节

操作系统、驱动和硬件的关系的思考

itviewer
 itviewer
发布于 2015/12/12 04:11
字数 1706
阅读 1421
收藏 16

这些问题是困扰一个人理解整个电脑架构的难点,比如

  • 操作系统和驱动是什么关系,为什么需要驱动?

  • cpu、内存需要驱动吗?

  • 为什么操作系统可以先装到电脑上,然后再去安装其它驱动,比如主板、显卡等等?

我觉得这里起作用的是一些公开的规范,即一个操作系统能在基于某个cpu的主板上运行的基本规范。对于基于Intel cpu的主板或电脑厂商,包括设备商和操作系统商都遵循一个基本规范。

比如操作系统要跑起来需要的基本条件,有cpu、有内存、有外存、有显卡,这是一个操作系统能进入基本界面需要的条件,如果操作系统不能处理某种类型的上述硬件,那根本进不了桌面,怎么可能再去装其它驱动程序。这时就需要一个基本规范,上述硬件按这种规范设计(比如系统总线、接口等等),操作系统内置这些基本规范实现。

这样操作系统就能在这个主板上跑起来了,能够进入界面了。这个时候,可以允许不同硬件设备有自己的规范了,比如为了更好的显示效果,需要安装特定的显卡驱动。但前提是,这个显卡要遵循一个基本规范,操作系统默认才能进入基本界面。这时候的操作系统界面可能由于没有厂商特定驱动只能实现基本工作,比如显示的桌面字体很大,模糊等。

这时候,厂商需要根据操作系统操作硬件的接口规范,实现驱动程序,装到操作系统上。然后操作系统在需要该硬件时就告诉驱动做什么,具体由驱动程序实现怎么做,本质上是把一堆0和1指令转换为高低电平,驱动硬件电路工作。

对于基本的功能,如cd、usb等,这些设备也都有基本的规范,否则要从cd或usb安装操作系统是不现实的。对于额外的功能比如USB3.0、cd的刻盘功能等,这些不是启动操作系统必须的,所以可以允许在系统启动后再安装特定驱动实现特定功能。

对于硬盘这种块设备,也是遵循通用的规范的,比如基本的对硬盘的读写。否则操作系统根本不可能往硬盘上写数据,也就不可能装系统。

 

这对于使用Windows的用户而言,问题不大。但是当使用Linux,要将其移植到自己的设备的时候,这些知识就很重要了。

这是实现Linux操作系统移植的基础。只有理解了,操作系统和硬件、驱动的关系,才能移植操作系统。

详细的Linux内核结构介绍可参考:

http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

http://www.wowotech.net/linux_kenrel/11.html

 

一般的,内核可以分为3个层面,上层是系统调用接口,中间层是通用内核功能,最下层是基于特定硬件(一般是cpu)的规范实现,构成了通常称为 BSP(Board        Support Package)的部分。但其中的各种驱动并不是必要的,比如没有网卡不影响系统启动、没有显卡驱动不影响进入命令行shell。当然,Linux内核一般也集成了很多常见的设备驱动,比如某个常用型号的网卡。

所谓操作系统移植,是移植的那些有特定规范的硬件设备驱动。通用的规范的设备,比如USB、读写硬盘、cd等,这些是系统内核内置的功能,一般不需要移植。

其实移植工作很大程度上是根据Linux的配置菜单,选择自己主板上各种特定厂家设备对应的驱动模块。

如果开发某个硬件比如声卡的厂商,自己不去实现驱动,基本上第三方是不可能搞的,除非硬件厂商公布自己的特定硬件设计规范,这样第三方是可以根据这些规范来开发驱动的。但自己的特定硬件规范属于商业机密,公布出来,基本上别人也就可以生产一样的产品了。

目前,由于Windows和Android比较流行,硬件设备商一般会提供这两个平台的驱动程序。Windows可以通过二进制安装包提供,Android可以通过二进制方式提供。而对于gnu Linux,多数可能不提供,少数提供开源驱动,少数以二进制方式提供。

所以,我感觉,如果硬件厂商没有提供某个操作系统的驱动,那我们需要考虑的是是否有其它产品代替。因为不可能自己去实现硬件厂商特定的、不公开其规范的驱动程序。

这样,所谓的Linux系统移植,对于板商而言无非就是根据Linux内核的配置菜单,选择一些已经集成进内核的驱动,或者根据厂商的驱动源码自己编译,或者直接使用厂商提供的二进制驱动程序。经过这样的配置,也就形成了针对自己特定主板的内核。

而真正的驱动移植,是某个硬件的厂商,其程序员根据自己的产品规范实现某个操作系统的驱动程序。一般这个人了解整个硬件产品的架构信息,具备制作同类硬件产品的理论基础。

这也就是操作系统移植了。

(或许有些地方没我理解的这么简单,有待进一步学习)

操作系统搞明白了,接下来的问题就是怎么进入操作系统了,也就是bootloader移植。大概原理见这里:

http://blog.csdn.net/shell_albert/article/details/8230666

我理解的思路是,一种是规划好存储设备的分区结构,在uboot中写死kernel的物理地址,uboot去读取这个物理地址一定长度的文件即内核,加载执行,之后就是Linux挂自己的文件系统的事情了,Linux内核会扫描存储设备的分区信息,这样就可以在uboot启动参数中指定rootfs分区,Linux内核就去挂载了。

 

另一种是uboot自带文件系统识别功能,在uboot中可以不用物理地址。

 

© 著作权归作者所有

itviewer
粉丝 20
博文 218
码字总数 44686
作品 0
海淀
技术主管
私信 提问
《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一   技术日新月异,产业斗转星移,滚滚红尘,消逝的事...

21cnbao
2015/08/10
0
0
《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)网购链接

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》 china-pub 天猫 dangdang 京东 China-pub 8月新书销售榜 推荐序一   技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物...

21cnbao
2015/08/10
0
0
计算机基础学习总结

1.编程语言的作用: 编程的本质就是让计算机去工作,而编程语言就是程序员与计算机沟通的桥梁 2.操作系统和硬件的关系: 操作系统通过控制器调用驱动程序让硬件工作。 3.应用程序,操作系统,...

ganzhoulin123
2017/11/11
0
0
软件设计是怎样炼成的(5)——规划系统的骨架(架构设计)(下篇)

摘要: 概要设计和详细设计,可能是最开始听说的设计,但后来发现如果局限在这两个设计的框架下,可能会有诸多不顺,我们需要架构设计、数据库设计、模块设计和用户体验设计,本文主要分享架...

fireball1975
2014/02/18
0
0
谈WDM与WDF (windows驱动开发)

转载自http://yinaiyun52.blog.163.com/blog/static/36251574200826112436776/ WDF驱动模型 如所周知,自Windows 2000开始,开发驱动程序必以WDM为基础的,但其开发难度之大,根本不能奢望像...

simpower
2018/08/21
101
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
26分钟前
3
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
28分钟前
4
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
33分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
36分钟前
6
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部