硬件驱动程序用什么语言编写_硬件驱动程序用什么语言编写的

       大家好,很高兴有机会和大家一起探讨硬件驱动程序用什么语言编写的问题。我将用专业的态度回答每个问题,同时分享一些具体案例和实践经验,希望这能对大家有所启发。

1.C语言竟是如何调用硬件

2.计算机编程语言有哪几种

3.c语言怎么进行硬件编程

硬件驱动程序用什么语言编写_硬件驱动程序用什么语言编写的

C语言竟是如何调用硬件

        大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?以下仅供参考!

        c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言编译成汇编指令,CPU直接执行汇编指令。

所以这个问题就变成,汇编指令是如何操作硬件的?

        如果把硬件平台限制在x86环境下,那么汇编指令操作硬件基本上只有两种方式:

方式一:

        通过向内存空间写数据。硬件会把硬件上的各种寄存器(外行可以理解为访问硬件的接口或者操作硬件的工具)映射到某一块内存地址空间上,之后只要用汇编指令,甚至C语言去读写这一段内存地址空间(并非真正操作物理内存),就可以达到操作硬件的目的了。

        如果题主还有WindowsXP环境(虚拟机也可以),就可以用汇编指令直接操作显存:

        MOV AX,B800

        MOV ES,AX

        XOR DI,DI

        MOV CX,0800

        MOV AX,5555

        REPZ STOSB

        硬件的各种寄存器会被映射到某一块物理内存中,这种方式称为MMIO,在Windows的设备管理器里,右键点设备,看属性-》资源里,不少硬件设备都有“内存范围”的参数,这里的内存范围就表示这个硬件的资源可以通过访问这一段内存来控制它。

方式二:

        x86汇编中,还有两个特殊的指令是IN和OUT,这是x86平台上独有的,上面图里的I/O范围,就是用IN/OUT这两个指令来访问和控制的。

        以上两种访问硬件的方式,第一种是可以用C语言实现的,上面一段汇编,本质上类似于C语言代码:

        char ptr = 0xB8000;

        int i;

        for (i = 0; i 《0x800; i++)

        {ptr + i = 0x55;

        }

        第二种IN/OUT方式没有直接的C语言语法对应,需要自己封装汇编。

        那么为什么平时很难用C语言操作硬件呢?这是因为平时写的代码大多数都在保护模式下,保护模式下,直接访问物理地址会受到限制,C语言操作的地址都是虚地址。

        对于Windows来说,要访问物理地址,需要工作在内核模式,也就是的写驱动才行。

        而在显存方面,首先,题主要先明白物理地址和虚拟地址的概念。

        原来的8086cpu设计的时候,地址空间有一块区域(640K-1M)之间,有一块作为显存使用

        这里你说的预留的地址,是指物理地址,这一段地址的准确范围是000A0000-000BFFFF,不管是32位还是64位CPU,这一段物理内存地址一直都保留给显存使用,不区分32位还是64位,也不区分保护模式还是实模式。

        可见这一段内存至今仍然是留给显卡使用的。

那么现在为什么不能直接用这段内存了?

        因为现在的软件都运行在保护模式下,访问的地址都是虚拟地址,而并非物理地址,包括你使用cmd命令打开的环境,都是虚拟地址,虽然32位XP里能用debug命令向000B8000上写数据并能显示在cmd的界面里,但本质上,这都是虚拟出来的。

如果要想用这段显存怎么办?

        自己写一个简易的操作系统,不启动显卡的各种图形加速功能,CPU进入保护模式后在GDT里映射一个4G的数据段,与物理地址一致,那么向000B8000上写数据,就会像过去DOS一样显示在屏幕上,所以保护模式下也可以访问这一段内存。所以,保护模式下,也可以用它。

显卡那么多显存是怎么映射的?

        有很多内存地址被映射给显存了,就是通过这种映射关系,把一些物理地址留给显存,使得CPU能像访问内存一样访问显存资源。

        当然,实际情况是,2G显存未必完全映射,而是只映射一部分地址,显卡有一些开放的寄存器能够控制哪部分显存映射过来,这样就能使得CPU在使用比较少的物理地址范围的情况下,访问全部的显存。

        还有一个很有意思的事情:在虚拟机里,找到映射的高地址部分的第一块内存区域,写一个能直接访问物理地址的程序(比如一个驱动),去读这一块内存,然后写到文件里,再用屏幕截图,也写到文件里,会发现截图的内容和显存里读出来的内容基本上是一样的。

        网友awayisblue

        要回答你的问题,我们需要要知道:

        硬件是一种什么样的存在

        什么是驱动。

        C语言怎么操作硬件

        我就不严格去定义这些概念了,我就以一个例子来通俗地讲解一下吧。

        首先讲硬件:

        先介绍一款单片机芯片STM8。

        这款芯片里面有cpu, 内存,寄存器(先不要觉得看到新名词压力大,继续往下看)等等,相当于我们的电脑了,但还要外接其它硬件。

        这里你需要知道的概念是:

        芯片的引脚跟寄存器是相对应的,寄存器是8位的内存单元(对,存在于内存上面),当你往这个内存单元里面写入数据时,芯片的引脚的电压会发生变化,比如说我写入的是01100001,则芯片上与之对应的8个引脚的电压状态(分为高电平与低电平两种)会输出:低高高低低低低高。

        cpu可以执行代码指令,指令可以操作内存。

        结论:所以从上面两点可以我们可以知道,cpu可以执行指令,使芯片的引脚电平(电压)发生变化。

        关于这款显示器,我们需要知道的是:

        它是有引脚的,这些引脚可以跟到前面介绍的那款单片机芯片的引脚相连。

        该显示器有自带的内存,用于存储要显示的字符,显示器从该内存里面读取字符来来显示。

        单片机芯片与该显示器相连后,可以通过引脚往该显示器的内存里写数据(通过多个引脚电平的高低不同来代表不同的数据,比如说:低高高低低低低高 代表01100001,这个数据写在显示器的.内存里面,被显示器所显示,当然,会根据ASCII来显示数字对应的字符,01100001对应的字符是‘a’),除了接收数据的引脚外,还有控制显示器的引脚(这个我们会在驱动那里介绍,继续往下看)。

        结论:单片机芯片与显示器相连,可以通过引脚输出的电平来控制显示器的字符显示。

        那么,综合上面,也就是说,单片机芯片cpu可以通过执行指令来控制显示器的字符显示。

        而这里,题主所说的硬件,指的就是这个显示器了。

        接下来讲驱动:

        那么,什么是驱动呢?驱动无非就是硬件跟软件的中间层,但我们不纠结这种关系,直接来看一下,对于我们这个例子,驱动指的是什么。首先我们要知道:

        显示器支持很多种操作,比如说清除显示,光标移动,读取数据,写数据等等。

        这些操作数据引脚和控制引脚来实现。

        引脚可以通过单片机芯片来控制。

        结论:我们可以通过在单片机芯片里面写显示器的“驱动”程序来屏蔽掉硬件(显示器硬件)层。

        于是这里驱动程序,指的是显示器所支持操作的程序表示。比如说清除显示,我们可以编写一个clear()函数,光标移动,我们编写一个move_cursor()函数,读取数据和写数据分别为read()和write(),然后分别实现就可以了(通过向寄存器里写数据的形式,进而控制引脚的电平变化,再而控制显示器,这个过程前面已有介绍)。这些函数就是驱动程序了。为什么上面说驱动程序可以屏蔽掉硬件呢?因为程序员可以使用前面的驱动程序来直接操作显示器(硬件),而不用知道太多关于硬件的事情,而一般的驱动程序也可以由厂家来提供。

        再说明一点:一般这些驱动程序可以用汇编写(出于运行效率的考虑),也可以用C语言来编写的,比如说我上面的例子,就可以直接用C语言来编写。当然C语言内联汇编的形式也可以。

        最后讲C语言怎么操作硬件:

        相信到这里,C语言是怎么操作硬件的已经比较明白了。

这里总结一下:

        C语言由CPU运行(实际上是先编译成机器码存在芯片里面然后执行),可以去操作内存。

        内存里有一段是跟寄存器相对应的,而寄存器是跟芯片的引脚相对应的,于是操作该段内存就能控制芯片引脚的电压变化。

        硬件(比如说显示器)有引脚(或者说排线,这些也是一样的东西),这些引脚跟芯片的引脚相连可以接受芯片的控制。

        可以把对某个硬件的操作做成一系列操作函数,这些操作函数就是驱动程序了。

        于是我们的C语言只要去调用这个驱动程序就可以直接操作硬件了。(当然驱动程序也可以由C语言来编写,所以C语言操作硬件并不一定要经过驱动程序)。

计算机编程语言有哪几种

       14种常见编程语言优缺点汇总

       概述:C

       语言是一门通用计算机编程语言,应用广泛。面向过程的,数据与算法分开。它的重点在于算法和数据结构。1972年由美国贝尔实验室在B语言的基础上设计出。

       优点:结构化编程语言,层次清晰,可以嵌入编程,可以跟硬件打交道,作底层开发。

       缺点:不太适用于企业级的开发。

       应用:嵌入式编程,硬件驱动程序设计。

       C++

       概述:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛:C++支持多种编程范式--面向对象编程、泛型编程和过程化编程。1983年,贝尔实验室 在C语言的基础上推出

       优点:多用途,支持多种程序设计风格,还有大量的库。

       缺点:复杂性,非常难于编写,安全性也无法保证。

       应用:桌面应用程序,如QQ、迅雷,游戏后台。

       java

       概述:Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球较大的开发者专业社群。Sun Microsystems公司1995年正式推出。

       优点:易学,强制面向对象,分布式,接口统一,安全性高。

       缺点:运行速度慢,不能做底层开发。

       应用:开发大型企业级项目。

       C#

       概述:C#是微软公司发布的一种面向对象的、运行于NET Framework之上的高级程序设计语言。微软公司在2000年6月发布。

       优点:面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、版本控制、代码安全管理。

       缺点只能运行在Windows上,没有丰富的第三方软件库可用。

       应用:大型系统、特定应用的小型系统。

       PHP

       概述:是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域,于1994年由RasmusLerdorf创建。

       优点:开放源代码、免费、简单快捷、跨平台性强、效率高、面向对象。

       缺点:对多线程支持不太好,语法不太严谨。

       应用:服务端脚本,命令行脚本,桌面应用程序。

       VB

       概述:Visual Basic是一种由微软公司开发的结构化的模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。微软公司1991年推出。

       优点:功能强大,简单易学、效率高。

       缺点:不支持继承、无原生支持多线程、异常处理不完善。

       应用:桌面程序,c/S系统。

       Ruby

       概述:一种为简单快捷的面向对象编程而创的脚本语言,在20世纪90年代由日本人松本行弘(YukihiroMatsumoto)开发。

       优点:语法简单,可移植性高,开发效率高,支持垃圾回收。

       缺点:性能不如纯静态编译语言,完全没有类型检查,灵活但容易隐藏潜在的问题,没有很完善的开发,重构的工具,不支持真正的多线程。

       应用:以服务器端应用程序为主,系统管理,快速开发互联网应用。

       Python

       概述是一种面向对象,解翠装机程序设算行展发行于1991年。

       优点:简单易学,速度快,免费开源,可移植性高,丰富的库。

       缺点:单行语句和命令行输出,独特的语法。

       应用:系统编程,图形处理,数学处理,文本处理,数据库编程。

       Objective-c

       概述:是扩充C的面向对象编程语言。它主要使用于MacOSX和GNUstep这两个使用OpenStep标准的系统。1980年代初布莱德·考克斯(Brad Cox)在其公司Stepstone发明。

       优点:单一继承,动态定型。

       缺点:不包括命名空间机制,不支援运算子多载。

       应用:iOS操作系统,ios应用程序,Mac OSX操作系统,Mac OSX上的应用程序。

       Prolog

       概述:Prolog(Programmingin Logic的缩写)是一种逻辑编程语言,由Aix-Marseille大学的Alain Colmerauer与Phillipe Roussel等人于60年代末研究开发。

       优点:没有特定的运行顺序,程序和数据高度统一,强大的递归功能。

       缺点:小编未整明白,请大家写评论拍砖。

       应用:人工智能。

       Golang

       概述:Google开发的一种编译型,可平行化,并具有垃圾回收功能的编程语言。于2009年11月正式宣布推出。

       优点:代码更简明、清楚,拥有动态语言的特点,完全开源,语言层面对并发的支持。

       缺点:运行速度比较慢,缺少安全检查。

       应用:系统编程,Web应用。

       Perl

       概述:一种功能丰富的计算机程序语言,设计者为拉里沃尔(Larry Wall),于1987年12月18日发表。

       优点:简单,几乎可以在任何地方运行,强大的正则表达式和模式匹配功能,复杂灵活的数据结构。

       缺点:代码难以阅读,动态类型语言,不是很可靠,学习曲线比较长。

       应用:Unix系统维护,CGI应用程序,Web站点维护,数据库处理。

       Golang

       概述:Google开发的一种编译型,可平行化,并具有垃圾回收功能的编程语言。于2009年11月正式宣布推出。

       优点:代码更简明、清楚,拥有动态语言的特点,完全开源,语言层面对并发的支持。

       缺点:运行速度比较慢,缺少安全检查。

       应用:系统编程,Web应用。

       Perl

       概述:一种功能丰富的计算机程序语言,设计者为拉里沃尔(Larry Wall),于1987年12月18日发表。

       优点:简单,几乎可以在任何地方运行,强大的正则表达式和模式匹配功能,复杂灵活的数据结构。

       缺点:代码难以阅读,动态类型语言,不是很可靠,学习曲线比较长。

       应用:Unix系统维护,CGI应用程序,Web站点维护,数据库处理。

c语言怎么进行硬件编程

       计算机编程语言有以下几种:

       1、C语言:C语言是一种广泛使用的高级编程语言,它具有高效、可移植和可靠性等特点,被广泛应用于系统编程和嵌入式系统开发。

       2、C++:C++是在C语言的基础上发展起来的,它是一种面向对象的编程语言,具有高效、可扩展和可重用性等特点,广泛应用于游戏开发、图形界面设计和大型软件系统开发等领域。

       3、Java:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由Sun Microsystems公司于1995年5月推出,Java平台(即JavaSE,JavaEE,JavaME)的总称。

       4、Python:Python是一种解释性的、动态的、面向对象的编程语言,具有简洁、易学、高效等特点,被广泛应用于数据科学、机器学习、Web应用开发等领域。

       5、JavaScript:JavaScript是一种脚本语言,用于Web开发和前端设计,具有交互性、动态性和可扩展性等特点,被广泛应用于网站开发和浏览器应用开发等领域。

       6、PHP:PHP是一种服务器端脚本语言,用于动态Web页面开发,具有易学、快速开发等特点,被广泛应用于网站开发和Web应用开发等领域。

计算机编程语言的应用:

       1、系统编程:系统编程涉及操作系统的设计和维护,以及硬件驱动程序的开发。C语言和C++是系统编程中最常用的编程语言,因为它们可以直接与硬件交互,具有高效的性能和可靠性。

       2、嵌入式系统开发:嵌入式系统是一种专用的计算机系统,通常被嵌入到其他设备中。嵌入式系统开发需要使用针对特定硬件和应用程序优化的编程语言,例如C、C++和汇编语言等。

       3、游戏开发:游戏开发需要高效的图形处理和实时响应,因此使用C++和C#等面向对象的编程语言来开发游戏引擎和游戏逻辑。

       4、图形界面设计:图形界面设计需要创建用户友好的界面,使用户能够与计算机进行交互。Java和C++是常用的图形界面设计语言,因为它们具有丰富的GUI库和跨平台兼容性。

       5、大型软件系统开发:大型软件系统需要处理大量的数据和复杂的业务逻辑,因此使用Java、C++和Python等面向对象的编程语言来开发。

       6、数据科学和机器学习:数据科学和机器学习需要进行数据处理、分析和预测,使用Python、R和Scala等编程语言,因为它们具有强大的数据处理能力和丰富的机器学习库。

       呵呵,对硬件直接操作的只有为"硬件特地编辑的二进制指令".

       C语言确实是有汇编的特点,但不能对硬件直接进行操作. 必须通过编译和连接后产生(.EXE)文件才可以间接操作系统.

       理论上是C语言编辑---编译---连接---这几个步骤后生成机械指令(这里指二进制指令)才可以间接操作系统.

       显示器,打印机,硬盘,键盘都是通过:C语言编写的驱动程序再调用设备的.

       还有别的问题吗?

       好了,今天关于“硬件驱动程序用什么语言编写”的探讨就到这里了。希望大家能够对“硬件驱动程序用什么语言编写”有更深入的认识,并且从我的回答中得到一些帮助。