Android内核源码阅读---ashmem.c

RK3568 Android11开机动画踩坑实录:为什么我的MP4视频播不出来? 本文详细解析了RK3568 Android11开机动画MP4视频无法播放的常见问题及解决方案。从视频编码格式、分辨率限制到文件系统路径和Property配置,提供了全面的故障排查指南和优化建议,帮助开发者快速解决bootanimation播放问题。 阅读详情

ashmem 的意思就是 Anonymous Shared Memory ,即匿名共享内存。 Android 系统主要包括五个部分,分别是 Linux 内核、本地库、 Dalvik 虚拟机、应用程序框架和应用程序。对于其中的 Linux 内核部分,最初 Android 是基于 2.6.25 的,而且 Android 内核基本是同 Linux 内核同步更新的, Android 在 Linux 内核的基础上做了一些修改和功能上的添加。目前最新的开源版本是 Android2.3 ,它是基于 Linux-2.6.35 的,它于 2010 年 12 月 7 日公布。  

其中 Android 在 Linux 内核的功能上的添加,就有 ashmem ,它为进程提供大块共享内存,同时为内核提供回收和管理这个内存的机制,其源代码位于 Android 源码中的 kernel/mm/ashmem.c 中:( Android 内核版本 2.0 ( Eclair ),它是基于 2.6.29 )

1 、用到的数据结构:

(1)struct ashmem_area : Android 共享内存区,当父文件(应该也可以理解成父进程)调用 open() 函数时有效,至它调用 release() 函数消亡,通过“ ashmem_mutex ”来保护其互斥性。具体定义如下:

  1. struct  ashmem_area {  
  2.     char  name[ASHMEM_NAME_LEN];  
  3.     struct  list_head unpinned_list;  
  4.     struct  file *file;  
  5.     size_t  size;  
  6.     unsigned long  prot_mask;  
  7. };  
char name[ASHMEM_NAME_LEN];  /* 申请的一块 ashmem 的名称 */

struct list_head unpinned_list;  /* ashmem 区的链表,用来把所有区连接起来 */

struct file *file;       /* 支持 shmem-based 的文件, struct file 结构体定义 */

size_t size;          /* 内存映射的大小,以 bytes 为单位 */

unsigned long prot_mask; /* 一个类似于标志位的变量 */

(2)struct ashmem_range :代表 unpinned ( evictable )页的区间,生命周期从 unpin 到 pin ,同样由“ ashmem_mutex ”来保证其互斥性。

  1. struct  ashmem_range {  
  2.     struct  list_head lru;  
  3.     struct  list_head unpinned;  
  4.     struct  ashmem_area *asma;  
  5.     size_t  pgstart;  
  6.     size_t  pgend;  
  7.     unsigned int  purged;  
  8. };  
struct list_head lru;          /* LRU (最近最少使用)链表 */

struct list_head unpinned;    /* unpinned 区域链表 */

struct ashmem_area *asma;  /* 相关的 ashmem 区域 */

size_t pgstart;              /* 页开始位置(包含在页内) */

size_t pgend;              /* 页结束位置(包含在页内) */

unsigned int purged;        /* 标志变量, ASHMEM_NOT 或 ASHMEM_WAS_PURGED */

定义的几个全局变量:

  1. static  LIST_HEAD(ashmem_lru_list);  
/* LRU 链表的定义 */

  1. static  unsigned  long  lru_count;  

/ * LRU 链表计数器 */

  1. static  DEFINE_MUTEX(ashmem_mutex);  

/* 用来保证互斥性的 ashmem_mutex 初始化 */

  1. static   struct  kmem_cache *ashmem_area_cachep __read_mostly; /  

* 指向 ashmem_area 的指针变量 */

  1. static   struct  kmem_cache *ashmem_range_cachep __read_mostly;  

/* 指向 ashmem_range 的指针变量 */

宏定义实现的函数:

  1. #define range_size(range)  ((range)->pgend - (range)->pgstart + 1)   

/* 用来返回 unpinned 页的 size */

  1. #define range_on_lru(range)  ((range)->purged == ASHMEM_NOT_PURGED)   

/* 修改标志 purged 的值为 ASHMEM_NOT_PURGED ,表示这段内存没有清空 */

  1. #define page_range_subsumes_range(range, start, end)  (((range)->pgstart >= (start)) && ((range)->pgend <= (end)))   

/* 判断是否在页内,参数为 range 结构体、起始地址、结束地址 */

  1. #define page_range_subsumed_by_range(range, start, end)  (((range)->pgstart <= (start)) && ((range)->pgend >= (end)))   

/* 判断是否在页外 */

  1. #define page_in_range(range, page)  (((range)->pgstart <= (page)) && ((range)->pgend >= (page)))   

/* 判断是否在页内,参数为 range 结构体、页号 */

  1. #define page_range_in_range(range, start, end) (page_in_range(range, start) || page_in_range(range, end) ||  page_range_subsumes_range(range, start, end))   

/* 判断是否在页内参数为 range 结构体、起始地址、结束地址 */

  1. #define range_before_page(range, page)  ((range)->pgend < (page))   

/* 判断 rangge 结构体定义的页时候在 page 之前 */

4 、函数实现:

(1) 内联函数:

  1. static   inline   void  lru_add( struct  ashmem_range *range)  

/* 对 LRU 链表进行添加结点 */

  1. static   inline   void  lru_del( struct  ashmem_range *range)  

/* 对 LRU 链表进行删除结点 */

  1. static   inline   void  range_shrink( struct  ashmem_range *range,  size_t  start,  size_t  end)  

/* 修改 range 结构体定义的内存的大小,可以进行缩短 */

基本函数:

 

  1. static   int  range_alloc( struct  ashmem_area *asma,   struct  ashmem_range *prev_range,  
  2.                   unsigned int  purged,   size_t  start,  size_t  end)  

/* 初始化一个ashmem_area结构体 */

  1. static   void  range_del( struct  ashmem_range *range)  

/* 删除一个ashmem_area,就是从链表中删除 */

static struct file_operations ashmem_fops 成员函数:

  1. struct  file_operations定义如下:  
  2. static   struct  file_operations ashmem_fops = {  
  3.     .owner = THIS_MODULE,  
  4.     .open = ashmem_open,  
  5.     .release = ashmem_release,  
  6.     .mmap = ashmem_mmap,  
  7.     .unlocked_ioctl = ashmem_ioctl,  
  8.     .compat_ioctl = ashmem_ioctl,  
  9. };  

成员函数定义如下:

  1. static   int  ashmem_open( struct  inode *inode,  struct  file *file)  

/* 创建一个文件对象,也就是为一个 ashmem_area 结构体申请一段空间 */

  1. static   int  ashmem_release( struct  inode *ignored,  struct  file *file)  

/* 释放文件对象,也就是释放 ashmem_area 结构体 */

  1. static   int  ashmem_mmap( struct  file *file,  struct  vm_area_struct *vma)  

/* 将制定的文件映射到制定的进程区域中 */

  1. static   long  ashmem_ioctl( struct  file *file, unsigned  int  cmd, unsigned  long  arg)  

说明:函数实现如下:

  1. static   long  ashmem_ioctl( struct  file *file, unsigned  int  cmd, unsigned  long  arg)  
  2. {  
  3.     struct  ashmem_area *asma = file->private_data;  
  4.     long  ret = -ENOTTY;  
  5.     switch  (cmd) {  
  6.     case  ASHMEM_SET_NAME:  
  7.         ret = set_name(asma, (void  __user *) arg);  
  8.         break ;  
  9.     case  ASHMEM_GET_NAME:  
  10.         ret = get_name(asma, (void  __user *) arg);  
  11.         break ;  
  12.     case  ASHMEM_SET_SIZE:  
  13.         ret = -EINVAL;  
  14.         if  (!asma->file && !(arg & ~PAGE_MASK)) {  
  15.             ret = 0;  
  16.             asma->size = (size_t ) arg;  
  17.         }  
  18.         break ;  
  19.     case  ASHMEM_GET_SIZE:  
  20.         ret = asma->size;  
  21.         break ;  
  22.     case  ASHMEM_SET_PROT_MASK:  
  23.         ret = set_prot_mask(asma, arg);  
  24.         break ;  
  25.     case  ASHMEM_GET_PROT_MASK:  
  26.         ret = asma->prot_mask;  
  27.         break ;  
  28.     case  ASHMEM_PIN:  
  29.     case  ASHMEM_UNPIN:  
  30.     case  ASHMEM_GET_PIN_STATUS:  
  31.         ret = ashmem_pin_unpin(asma, cmd, (void  __user *) arg);  
  32.         break ;  
  33.     case  ASHMEM_PURGE_ALL_CACHES:  
  34.         ret = -EPERM;  
  35.         if  (capable(CAP_SYS_ADMIN)) {  
  36.             ret = ashmem_shrink(0, GFP_KERNEL);  
  37.             ashmem_shrink(ret, GFP_KERNEL);  
  38.         }  
  39.         break ;  
  40.     }  
  41.     return  ret;  
  42. }  

其中 ashmem_ioctl 函数可以实现的功能有:

① ASHMEM_SET_NAME 设置名称,调用 set_name 函数。

② ASHMEM_GET_NAME 获取名称,调用 get_name 函数。

③ ASHMEM_SET_SIZE 设置 ashmem 的大小,通过改变 ashmem_area 中的成员变量设置。

④ ASHMEM_GET_SIZE 获得 ashmem 的大小,通过读 ashmem_area 的成员变量获取。

⑤ ASHMEM_SET_PROT_MASK 设置 prot_mask ,调用 set_prot_mask 函数。

⑥ ASHMEM_GET_PROT_MASK 获取 prot_mask ,通过读 ashmem_area 的成员变量获取。

⑦ ASHMEM_PIN 使用 pin 语法,调用 ashmem_pin_upin 函数,通过判断再调用 ashmem_pin 函数。

⑧ ASHMEM_UNPIN 使用 upin 语法,调用 ashmem_pin_upin 函数,通过判断再调用 ashmem_upin 函数。

⑨ ASHMEM_GET_PIN_STATUS 获取 pin 状态,调用 ashmem_pin_upin 函数,通过判断再调用 ashmem_get_pin_status 函数。

⑩ASHMEM_PURGE_ALL_CACHES " 净化 " 所有 cache ,调用 ashmem_shrink 函数。

(4) 模块函数:定义模块的入口函数和出口函数。

static int __init ashmem_init (void)

/* 模块编程的规范,入口函数 */

static void __exit ashmem_exit (void)

/* 模块编程的规范,出口函数 */

 

原文地址: http://blog.youkuaiyun.com/wzyhb123456789/archive/2010/12/27/6101192.aspx

【AI平台】n8n入门2:第一个工作流,调用本地大模型 n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。 阅读详情

相关推荐

深入解析EDID中Display Descriptor Block的配置技巧与实战应用

本文深入解析EDID中Display Descriptor Block的配置技巧与实战应用。通过剖析像素时钟、有效像素、消隐区与同步脉冲等核心参数,并结合1280x720@60Hz的实战配置案例,指导开发者如何正确为定制硬件或非标准显示器编写“身份证”,避免黑屏、分辨率异常等问题,确保显示设备完美点亮。

1a2s3d4f5g的博客 878

Ashmem匿名共享内存驱动

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34107955的博客 374

微信好友恢复全攻略(2025年3月更新)

适用于仅被拉黑场景(成功率100%)针对7天内误删场景(成功率78%)

2301_77933942的博客 1万+

android系统核心机制 基础(10)Ashmem匿名共享内存机制

1 Ashmem匿名共享内存机制 简介 Ashmem是一种匿名共享内存机制,主要用于进程间大量传递数据。 1.1 为什么要有Ashmem匿名共享内存机制? Android系统已经添加了Binder这个高效的跨进程通信的机制,那为什么还要搞一个Ashmem 匿名共享内存机制呢? 因为binder机制主要用于进程间的通信,适合进程间的方法调用(A进程的X方法调用B进程的Y方法),但如果进程间需要传输大量数据则并不可行,关于binder传递数据的限制我们可以看Binder初始化时的宏定义($AOSP/fr

wangdsh的博客 5480

SQL-拼多多 面试题:连续3次为球队得分的球员名单

1.使用LAG开窗函数 筛选出 下一次和下下一次得分,并用进球时间进行排序。2.使用where筛选出值得嘉奖的球员。

Ftr1998的博客 643

保姆级教程:用Jetson Orin Nano和ROS2 Humble搞定PIXhawk 4飞控通信(含配置文件详解)

本文提供了一份详细的Jetson Orin Nano与PIXhawk 4飞控通信配置指南,涵盖硬件连接、ROS2 Humble环境搭建、MAVROS2配置及通信调试全流程。通过实战案例和配置文件详解,帮助开发者快速实现无人机上位机与飞控的稳定通信,适用于无人机开发与自动化控制场景。

weixin_33670786的博客 475

Ashmen 匿名共享内存

ashmem的意思就是Anonymous Shared Memory,即匿名共享内存。Android系统主要包括五个部分,分别是Linux 内核、本地库、Dalvik 虚拟机、应用程序框架和应用程序。对于其中的Linux内核部分,最初Android是基于2.6.25的,而且Android内核基本是同Linux内核同步更新的,Android在Linux内核的基础上做了一些修改和功能上的添加。目前最新

kenall的部落格 1208

告别重打包:在Android 9上实现免Root的Frida-Gadget持久化Hook(附AOSP源码修改详解)

本文详细介绍了在Android 9上实现免Root的Frida-Gadget持久化Hook技术方案。通过修改AOSP源码,绕过传统重打包方式面临的签名校验和完整性检查,实现在非Root环境下的系统级Hook。文章包含核心代码修改、编译配置调整及调试技巧,为移动安全研究提供高效稳定的解决方案。

weixin_33726313的博客 501

Android跨进程通信--共享内存(ashmem)实例

当用户进程执行unpin 操作时,驱动会生成一个 ashmem_range 的节点,这个节点会挂到一个全局链表 LRU 中,当系统内存不足时,会调用驱动注册的 ashmem_shrinker() 函数来释放内存,而 ashmem_shrinker() 函数将通过 LRU 链表来找到解锁的内存并释放模块,内存被释放后 ashmem_range 将会被移除,但是还会留在进程的 unpinned_list 中,同时其内部属性 purged 会设置成 true 代表已经被释放,就不会被重复释放了。

Dream It Possible 3860

ArcGIS Pro 制作这种地图海报

ArcMap 版本与 ArcGIS Pro 版本的制图功能相差太多,无论从美观上还是制图效率都远远优于 ArcMap,用了一段时间的 ArcGIS Pro ,真心推荐有条件的大家赶紧试一试!一个软件也能搞定一张不错的海报哦!----吐槽:好的设计真的是门花时间的活,这个教程大概花了我7小时左右,我都忘了我自己教程中截图多少张了!(可能是我速度太慢了)测试数据:阿里云盘分享-----北极海冰数据.https://www.aliyundrive.com/s/SUhsnqfkmXh。

J_Giser的博客 1427

FPGA实现PCIe接口

PCI Express(PCIe)是一种高速串行计算机扩展总线标准,在FPGA中实现PCIe接口可以实现与主机系统的高速数据通信。以下是FPGA实现PCIe接口的关键技术要点。

whm128的博客 1460

记一次在OrangePiZero2(香橙派zero 2)上部署Redroid(云手机)的过程

一句废话 这次换一种写作风格,尝试一下轻松的行文方式。 起因 很久以前看见有群友讨论关于docker部署Android系统,拿来挂机玩游戏一类的。当时听了感觉很有意思,后面粗浅地在zero2上部署了一下,容器虽然是跑起来了,但是scrcpy连接总是黑屏,后来我试着帮助一个群友部署,也部署失败了。最近又想起来这回事,所以决定再试一试。下面就说说我的尝试过程。 Step 0: 我不想读那么多废话,只想能跑起来,怎么办? 这里我把编译好的内核和模块放上来,你 将它安装进系统,然后直接pull android11的

CNflysky的博客 1万+

【ComfyUI】Wan 2.2 14B 首尾帧转视频 平滑过渡

本文介绍了基于 Wan2.2 ComfyUI 的视频生成工作流,通过预训练模型、提示词与参考图像的结合,实现高质量视频合成。工作流采用高低噪声模型与 LoRA 模块优化风格与细节,确保画面过渡平滑稳定。核心流程包括模型加载、图像输入、提示词编码、潜空间采样、解码与视频合成,最终生成动态转场视频。节点设计涵盖 CLIPTextEncode、KSamplerAdvanced 等关键模块,协同完成从文本到视频的全链路生成。正向提示词作为核心驱动力,直接影响视频的动作、镜头与画面变化。

Mr数据杨 1701

第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范

Android系统架构与AOSP规范摘要 Android是基于Linux内核构建的分层操作系统,采用清晰的五层架构设计: Linux内核层:提供进程调度、内存管理、驱动支持等基础功能,包含Binder等Android特有组件 硬件抽象层(HAL):通过标准C接口屏蔽硬件差异,实现驱动与上层解耦 系统运行库层:包含Native库和ART运行时,执行核心功能与字节码 Java API框架层:以系统服务形式暴露核心功能给应用 应用层:运行在独立沙箱中的各类应用 各层间定义清晰的接口边界,通过JNI、HAL标准接口

9年Android老兵,专注车载系统与移动架构。深耕Java/Kotlin,玩转Lua/Python。擅长百度/高德地图深度定制,分享拒绝浅尝辄止的硬核干货。 709

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

第 5 章:内核

Linux 内核是每一台 Android 设备的底层基础。它管理硬件、实施安全边界、调度进程,并提供底层原语,例如 Binder 进程间通信与共享内存,整个 Android 框架都构建在这些原语之上。但 Android 设备上运行的内核并不是官方原版上游 Linux 内核。在超过十五年的发展历程中,Android 积累了一套内核修改、树外驱动以及配置要求,使其区别于任何桌面或服务器版 Linux 发行版。

dengfuma的专栏 235

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

第 8 章:内存管理

本文深入剖析了Android内存管理系统的完整技术栈,从硬件层到应用层,涵盖以下核心内容: 架构演进 Android 17引入重大变革:ZRAM管理从system_server迁移至专用Rust守护进程mmd,新增按进程粒度的ZRAM回写与预取机制 16KB大页迁移正在进行,影响内存统计、zRAM交换单元等基础行为 核心组件 lmkd:用户态低内存杀手,基于PSI压力指标决策进程查杀,维护2001级OOM分数槽位 mmd:统一管理ZRAM配置(压缩算法/回写策略/重压缩),支持多设备独立配置 ION/DMA

dengfuma的专栏 350

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android系统的Ashmem匿名共享内存子系统分析(2)- 运行时库cutils的Ashmem访问接口

如果是,那么第15行就将它的 PROT_EXEC 位也设置为1,因为当一个进程的 personality 属性的 READ_IMPLIES_EXEC 位被设置为1时,就表示当它有权限读一块内存时,也隐含着它对该内存有执行权限。此后,应用程序只能删除它的访问保护位,而不能增加它的访问保护位。调用函数 open 打开设备文件 /dev/ashmem 时,Ashmem 驱动程序的函数 ashmem_open 就会被调用主要是为应用程序创建一个 ashmem_area 结构体,用来描述一块匿名共享内存。

Android系统工程师--小馬佩德罗 803

Android 匿名共享内存基础数据结构篇(二)

Android匿名共享内存系统架构图 如上图所示,Android系统匿名共享内存(以下以Ashmem代替)以Ashmem驱动为基础,在运行时库提供了cutils library来对Ashmem驱动进行访问,同时又在Framework层提供了C++和Java类接口来访问cutils。 这篇文章主要学习kernel层ashmem的基础数据结构,先来看看Ashmem到底是什么!源码版本An...

camel@Y blog 923

Ashmem机制

Ashmem

m0_37999066的博客 775

Ashmem 简述

1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段物理内存映射到各自的虚拟地址中,从而实现内存共享。 它以驱动程序的形式在内核空间中实现,并通过文件描述符来传递共享内存的句柄。 相对于 Linux 的共享内存, Ashmem 驱动中添加了互斥锁以此实现了同步的机制,并能够辅助内存管理系统来有效地管理不再使用的内存块。 2. 原理 两个进程就像两个平行的世界,A 进程没法直接访问 B 进程的数据,其用户空

run068的博客 5961

android下dev设备的权限问题

倘若应用程序需要对/dev/xxx进行读写操作,就需要提升其权限。提权方法不唯一,需要根据具体需求情况而选择。归根结底,终究都落到chmod 777 /dev/xxx 上,不同的是,chmod操作被执行在何时何地,在此做个分析总结。         内核启动后会执行/system/init,传说中的系统1号进程,init程序起初的任务是初始化,包括各种mkdir来构建文件系统,得到硬件信息建立设

沐 白 4169

ashmem.c驱动源码分析

/* mm/ashmem.c ** ** Anonymous Shared Memory Subsystem, ashmem ** ** Copyright (C) 2008 Google, Inc. ** ** Robert Love ** ** This software is licensed under the terms of the GNU General Publi

wuye110的专栏 810

匿名共享内存Ashmem实例--C++

ashmem主要 用于两个进程 的内存共享. 使用步骤: 1、server端调用ashmem_create_region创建一个共享内存,调用mmap进行内存映射,并把这个fd通过binder返回给client端面 2、client使用从server端拿到的句柄fd,调用mmap进行内存映射,这样client和server端 就映射到了同一块内存区域,从而实现共享。 相关代码实现 首先看

new_abc的专栏 5324

匿名共享内存 C++ 实现

一、Ashmem C 语言接口 通常可以使用 libcutils 库中的 ashmem_create_region 函数创建一块共享内存区域: #define ASHMEM_DEVICE "/dev/ashmem" /* * ashmem_create_region - creates a new ashmem region and returns the file * descriptor, or <0 on error * * `name' is an optional label to g

朝花夕拾 5141

安卓ashmem学习内核解析

Android系统的匿名共享内存Ashmem驱动程序利用了Linux的共享内存子系统导出的接口来实现,本文通过源码分析方式详细介绍Android系统的匿名共享内存机制。在Android系统中,匿名共享内存也是进程间通信方式的一种。相比于malloc和anonymous/named mmap等传统的内存分配机制,Ashmem的优势是通过内核驱动提供了辅助内核的内存回收算法机制(pin/unpin)。

启程 1544

linux匿名共享内存,Ashmem匿名共享内存驱动

匿名共享内存匿名共享内存的实现是已Ashmem驱动程序为基础所构建起来的一套方案,基于linux的临时文件系统tmpfs.ashmem系统大概分成三层,如下: 最下方的是kernel层,也就是我们即将介绍的ashmem驱动程序,在启动时它会创建一个/dev/ashmem的设备文件。而上层的cutils库就通过文件访问操作open,ioctl来访问驱动程序。另外cutils主要提供了三个函数ashm...

weixin_42510645的博客 887
上一篇: 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发
下一篇: Android 应用程序之间数据共享—ContentResolver
hellolwl
博客等级 码龄24年 16粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值