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

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

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

  • 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中可以不用物理地址。


附:https://my.oschina.net/assange/blog/543047

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读