linux驱动管理,linux运维

这篇文章给大家聊聊关于linux驱动管理,以及linux运维对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

动力电池管理系统涉及linux底层驱动吗

1、概述

随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,Android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状态的监控(电池电量、电池状态及电池温度等)。下面将详细分析android的电池系统架构。

2、Android电池系统架构

Android系统中对电池的管理驱动层继承了linux下的power supply class,而在用户层则是在BatteryService.Java中通过广播的方式将如下一些电池相关的属性上报给上层app使用。这些属性都是在java中声明,在jni中调用更新的。

而这些属性都是在com_android_server_BatteryService.cpp这个本地代码-jni中通过调用sys文件系统访问驱动层中电池相应的状态进行更新的。

3、BatteryService

代码路径:

frameworks/base/services/java/com/android/server/BatteryService.java

BatteryService作为电池及充电相关的服务,主要作了如下几件事情:监听 UEvent、读取sysfs中的状态、广播Intent.ACTION_BATTERY_CHANGED。

3.1、监听UEvent:

BatteryService实现了两个UEvenObserver mUEventObserver(如上代码所示)。uevent是Linux内核用来向用户空间主动上报事件的机制,对于JAVA程序来说,只实现 UEventObserver的虚函数 onUEvent,然后注册即可。

3.2、读取sysfs电池状态

update读取sysfs文件做到同步取得电池信息,然后根据读到的状态更新BatteryService的成员变量,并广播一个Intent来通知其它关注电源状态的组件。当kernel有power_supply事件上报时,mUEventObserver调用update()函数,然后update调用native_update从sysfs中读取相关状态(com_android_server_BatteryService.cpp)。

3.3、广播Intent.ACTION_BATTERY_CHANGED

通过广播Intent.ACTION_BATTERY_CHANGED,将电池状态、电池电量、电池工艺等属性打包,发送给其它的使用者,也就是说,只要在app程序里监听了Intent.ACTION_BATTERY_CHANGED这个广播,就能获取到电池的各种状态属性!

4、本地代码-jni

代码路径:

frameworks/base/services/jni/com_android_server_BatteryService.cpp

这是battery用户空间的本地代码,调用sys文件系统访问驱动程序,并向上层BatteryService封装本地方法以隔离平台化的差异。

在这个文件的头部有如下定义:

这个就是底层battery驱动所生成的sys文件系统路径。

在这个文件里封装了一个本地方法:

供上层BatteryService使用。另外,在这个文件中通过GetFieldID,得到BatteryService.java类中声明的电池属性ID,如下:

关于java与c/c++互调的问题,这里就不再赘诉了,网上有很多的资料。

在这个文件里通过操作相应的sys文件系统来获取电池的各种属性值,看看如下这段代码:

POWER_SUPPLY_PATH已经在文件头部定义过了,对应路径:"/sys/class/power_supply",然后遍历整个文件夹,查找各个能源供应设备的各种属性,如上选中部分是用来查找交流设备的属性的。

各能源设备属性概况如下:

"/sys/class/power_supply/ac/online" AC电源连接状态

"/sys/class/power_supply/usb/online" USB电源连接状态

"/sys/class/power_supply/battery/status"充电状态

"/sys/class/power_supply/battery/health"电池状态

"/sys/class/power_supply/battery/present"使用状态

"/sys/class/power_supply/battery/capacity"电池 level

"/sys/class/power_supply/battery/batt_vol"电池电压

"/sys/class/power_supply/battery/batt_temp"电池温度

"/sys/class/power_supply/battery/technology"电池技术

当供电设备的状态发生变化时,driver会更新这些文件,然后通过jni中的本地方法android_server_BatteryService_update向java层发送信息。

如何从 Linux 平台删除驱动程序

Linux下大部分驱动都是以模块方式加载到内核的,所以要删除一个驱动,主要从模块下手。所以首先要学会如何查看已经加载的模块:

lsmod

第一列是模块的名字,根据模块名字往往可以猜出哪个模块是你要删除的驱动。如果对硬件不熟悉的话就要试着通过其他命令来找相关的信息。

比如我要删除无线网卡的驱动,那么我可以用:

lspci| grep less

lspci命令会列出所有PCI设备,而grep会找出返回结果中包含less的行。无线是Wireless,所以返回结果就会包含有我的无线网卡的信息,比如:

02:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8192E Wireless LAN Controller(rev 01)

可以看出型号是RTL8192E,这个时候再用lsmod命令,查看有没有与8192相关的模块名就可以了。

找到模块名字后(比如我的无线网卡叫做r8192e_pci)就可以用如下命令卸载模块:

rmmod模块名

对于我的无线网卡就是rmmod r8192e_pci。这时候驱动就已经成功被卸载了,但是是临时的,重启又会重新加载,如果要永久卸载这个驱动的话还需要改一点东西。

在Ubuntu下进入/etc/modprobe.d目录下(其他发行版会有些差别),编辑blacklist.conf文件,加入一行(一般加在最下面):

blacklist模块名

这样就将你要删的驱动加入了黑名单,以后就再也见不到它啦!:)

linux系统怎样查看显卡驱动安装与否

1、查看系统版本:lsb_release-a。

2、more/proc/cpuinfo可以查看CPU名字、内核心数。

3、查看内存详细内存more/proc/meminfo。

4、查看硬盘和分区df-h。

5、查看网络信息:ifconfig。

注意事项:

系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。

阅读剩余
THE END