Linux Kernel

Android HAL层与Linux Kernel层驱动开发简介

末鹿安然 提交于 2019-12-19 18:22:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记。 HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬件方面的各项参数不被外泄,而一个设备的驱动程序包含了硬件的一些重要参数,所以驱动的开源势必会使硬件厂商蒙受损失,Google为了保护硬件厂商的利益,所以在Android系统中加入了HAL层,在HAL层中不必遵循GPL协议,所以代码可以封闭。 所以如果硬件驱动开源的写在Kernel里,Framework直接调用,而不愿意开源的就写在HAL层里,实现闭源。 那究竟HAL怎样实现闭源的呢?我们来画个简图.(注意:本文只提供攥写驱动的大致思路,不对细节代码负责。) 一,编写驱动期以及LoadingTime: 编写驱动分为两个部分,一个是HAL层的驱动代码,一个是Kernel层的驱动代码。 1,HAL框架提供了三个结构体,分别为hw_device_t , hw_module_t ,hw_module_methods_t。 编写HAL层驱动首先要依据这三个结构体作扩展,我们创建自己驱动的device_t,module_t代码,并且写hw_module_methods

Android中HAL层与内核驱动之间的关系

旧时模样 提交于 2019-12-19 18:21:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 首先,Android的HAL是为了一些硬件提供商提出的“保护proprietary”的驱动程序而产生的东东,简而言之,就是为了避开linux kernel的GPL license的束缚。Android把控制硬件的动作都放到了user space中,而再kernel driver里面只有最简单的读写寄存器的操作,而完全去掉了各种功能性的操作(比如控制逻辑等),这些能够体现硬件特性的操作都放到了Android的HAL层,而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。 从网上看到的这样一段话,还存在的疑问是,1.既然“把控制硬件的动作都放到了user space中“,那kernel driver的作用是什么, 2.HAL层与内核驱动层之间是怎么交互的,他们之间的接口函数是什么呢? ==================== 内核里的设备驱动其实就是实现硬件的各种功能及调用接口, 至于怎么使用这硬件功能由应用程序的调用来决定的。 应用程序调用内核驱动的接口基本是统一的标准接口, 也就是所谓的系统调用接口。Android里的HAL层其实就是把调用内核驱动实现的功能封装成一个个的类,供java来调用 ============

未来Linux Kernel 将不支持可变长数组VLA

此生再无相见时 提交于 2019-12-12 12:53:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 但使用 VLA 会存在问题,包括增加运行时开销——因为数组长度需要在运行时确定; LLVM Clang 编译器不支持结构内 VLA,它只支持 C99 风格的 VLA;存在安全隐患。Linus Torvalds 对 VLA 的使用公开表达过不赞成,认为相比固定长度,VLA 产生了更多的代码和更慢的代码。 通过开发中的Linux 4.20内核,它现在可以实现无VLA ...可变长度数组(VLA)可以方便并且是C99标准的一部分,但可能会产生意想不到的后果。 VLA允许在运行时而不是编译时确定数组长度。 Linux内核长期以来一直依赖于内核不同部分的VLA(包括结构内部),但现在持续数月(如果计算内核Clang的工作数年,则已经过去几年)已经删除了可变长度数组的使用在内核中。它们的问题是: - 由于需要在运行时确定数组的大小,因此使用可变长度数组会给代码添加一些较小的运行时开销。 - LLVM Clang编译器不支持结构中的VLA,因此对于那些想要在GCC之外构建内核的人来说,Clang只支持C99风格的VLA。 - 可以说最重要的是,VDA可能会对内核的堆栈使用产生安全隐患。 Linus Torvalds在过去对VLA的使用表达了他的不满,例如“使用VLA是积极的愚蠢!它产生了更多代码,更多_slower_代码

cephfs linux kernel client针对linux page cache的操作

依然范特西╮ 提交于 2019-12-10 03:27:21
针对linux page cache的操作主要体现在struct address_space_operations数据结构中,cephfs处理linux page cache的函数集合如下: const struct address_space_operations ceph_aops = { .readpage = ceph_readpage, .readpages = ceph_readpages, .writepage = ceph_writepage, .writepages = ceph_writepages_start, .write_begin = ceph_write_begin, .write_end = ceph_write_end, .set_page_dirty = ceph_set_page_dirty, .invalidatepage = ceph_invalidatepage, .releasepage = ceph_releasepage, .direct_IO = ceph_direct_io, }; ceph_readpage(struct file *filp, struct page *page) |__调用readpage_nounlock(filep, page) 在加锁的情况下读取一个物理内存页的数据 |_

Centos Linux kernel内核升级

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 15:09:54
一、 Linux kernel官网 https://www.kernel.org There are several main categories into which kernel releases may fall: Prepatch Prepatch or "RC" kernels are mainline kernel pre-releases that are mostly aimed at other kernel developers and Linux enthusiasts. They must be compiled from source and usually contain new features that must be tested before they can be put into a stable release. Prepatch kernels are maintained and released by Linus Torvalds. Mainline Mainline tree is maintained by Linus Torvalds. It's the tree where all new features are introduced and where all the exciting new development

JVM源码分析之一个Java进程究竟能创建多少线程

扶醉桌前 提交于 2019-12-06 08:29:40
概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于Linux Kernel的源码分析,今天要说的是JVM里比较常见的一个问题 这个问题可能有几种表述 一个Java进程到底能创建多少线程? 到底有哪些因素决定了能创建多少线程? java.lang.OutOfMemoryError: unable to create new native thread 的异常究竟是怎么回事 不过我这里先声明下可能不能完全百分百将各种因素都理出来,因为毕竟我不是做Linux Kernel开发的,还有不少细节没有注意到的,我将我能分析到的因素和大家分享一下,如果大家在平时工作中还碰到别的因素,欢迎在文章下面留言,让更多人参与进来讨论 从JVM说起 线程大家都熟悉, new Thread().start() 即会创建一个线程,这里我首先指出一点 new Thread() 其实并不会创建一个真正的线程,只有在调用了start方法之后才会创建一个线程,这个大家分析下Java代码就知道了,Thread的构造函数是纯Java代码,start方法会调到一个native方法start0里,而start0其实就是 JVM_StartThread 这个方法 从上面代码里首先要大家关注下最后的那个if判断 if (native_thread->osthread() ==

CentOS 7.3 手动编译安装最新版本Linux Kernel

帅比萌擦擦* 提交于 2019-12-05 21:14:36
本文演示机器系统版本是CENTOS7.3。 查看系统版本信息。 [root@localhost ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core [root@localhost ~]# [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [root@localhost ~]# [root@localhost ~]# cat /proc/version Linux

CentOS-6.5离线安装docker-1.7教程

拈花ヽ惹草 提交于 2019-12-04 09:15:47
CentOS-6.5 离线安装docker-1.7 教程 0. 准备 本文是模拟实际上线时,没有网络的情况下使用rpm包安装docker-1.7的方法。不过安装中也是使用yum,相比较直接使用rpm安装,yum可以解决一些库文件的依赖关系。 # cd /etc/yum.repos.d/ # mkdir bak # mv * bak/ 1. 安装libcgroup # cd cgroup/ # yum installlibcgroup-0.40.rc1-16.el6.x86_64.rpm 2. 安装 lxc # yum installlua-filesystem-1.4.2-1.el6.x86_64.rpm lua-alt-getopt-0.7.0-1.el6.noarch.rpmlxc-libs-1.0.7-2.el6.x86_64.rpm lxc-1.0.7-2.el6.x86_64.rpmlua-lxc-1.0.7-2.el6.x86_64.rpm 3. 安装docker # yum installdocker-io-1.7.1-2.el6.x86_64.rpm 4. 更新 device-mapper-libs # yum installdevice-mapper-* 5. 设置开机自启 # chkconfig docker on 6. 检查支持情况 # lxc

论学PHP开发 php培训

£可爱£侵袭症+ 提交于 2019-12-04 08:16:29
Linux网管123---第9章.各种杂项管理工作-2.管理进程 Linux教程 兄弟连IT教育 随着时间增加,您可能会想看看 Linux 上正在执行的行程。要得到行程列表的话,键入 ``ps -aux',看起来会像下面这个样子: USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND bin 69 0.0 1.0 788 320 ? S Nov 30 0:00 /usr/sbin/rpc.portmap frampton 10273 0.0 2.1 1136 664 p0 S 14:12 0:00 -bash frampton 10744 0.0 1.1 820 360 p0 R 17:25 0:00 ps -aux frampton 10745 0.0 0.8 788 264 p0 S 17:25 0:00 more nobody 10132 0.0 1.8 1016 588 ? S 13:36 0:00 httpd nobody 10133 0.0 1.8 988 568 ? S 13:36 0:00 httpd nobody 10413 0.0 1.8 1012 580 ? S 14:56 0:00 httpd nobody 10416 0.0 1.8 1012 580 ? S 14:56 0:00 httpd

JVM源码分析之一个Java进程究竟能创建多少线程

烈酒焚心 提交于 2019-12-03 21:38:46
概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于Linux Kernel的源码分析,今天要说的是JVM里比较常见的一个问题 这个问题可能有几种表述 一个Java进程到底能创建多少线程? 到底有哪些因素决定了能创建多少线程? java.lang.OutOfMemoryError: unable to create new native thread 的异常究竟是怎么回事 不过我这里先声明下可能不能完全百分百将各种因素都理出来,因为毕竟我不是做Linux Kernel开发的,还有不少细节没有注意到的,我将我能分析到的因素和大家分享一下,如果大家在平时工作中还碰到别的因素,欢迎在文章下面留言,让更多人参与进来讨论 从JVM说起 线程大家都熟悉, new Thread().start() 即会创建一个线程,这里我首先指出一点 new Thread() 其实并不会创建一个真正的线程,只有在调用了start方法之后才会创建一个线程,这个大家分析下Java代码就知道了,Thread的构造函数是纯Java代码,start方法会调到一个native方法start0里,而start0其实就是 JVM_StartThread 这个方法 从上面代码里首先要大家关注下最后的那个if判断 if (native_thread->osthread() ==