Android内核源码bionic目录下的源码的学习笔记

好记性不如烂笔头。今天要做的学习是关于bionic目录下的代码。

首先需要看的是_errno.c这份代码。

volatile int*  __errno( void )
{
  return  &((volatile int*)__get_tls())[TLS_SLOT_ERRNO];
}

从上面可以看出,返回的是一个指向int类型的指针。

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。

第二个需要说到的_set_errono.c的这份代码。

这个函数最终会被系统进行调用。

同时在这个函数里面,即使数据超过边界,依旧不会认为是个错误。因为在Linux中,错误的编码不会超过131.

if(n > -256) {
        return __set_errno(-n);
    } else {
        return n;
    }

OpenBSD是一个多平台的,基于4.4BSD的类UNIX操作系统,是BSD衍生出的三种免费操作系统(另外两种是NetBSD和FreeBSD)之一,被称为世界上最安全的操作系统

接下来需要学习的是arc4random.c。

static pthread_mutex_t  _arc4_lock = PTHREAD_MUTEX_INITIALIZER;
#define  _ARC4_LOCK()      pthread_mutex_lock(&_arc4_lock)
#define  _ARC4_UNLOCK()    pthread_mutex_unlock(&_arc4_lock)

定义锁的作用是保护文件中的全局的变量。

只要注意这个文件是用来生成0~1之间的随机数就可以了。

接下来看一下basename.c这个类。

在这个文件中,仅仅存在一个函数,返回的是一个字符串。

if (bname == NULL) {
        bname = (char *)malloc(MAXPATHLEN);
        if (bname == NULL)
            return(NULL);
    }

很明显存在分配存储空间。

接下来看到的这个文件是bionic_clone这个文件。

主要查看里面的clone方法。

int
clone(int (*fn)(void *), void *child_stack, int flags, void*  arg, ...)
{
    va_list  args;
    int     *parent_tidptr = NULL;
    void    *new_tls = NULL;
    int     *child_tidptr = NULL;
    int     ret;

    /* extract optional parameters - they are cummulative */
    va_start(args, arg);
    if (flags & (CLONE_PARENT_SETTID|CLONE_SETTLS|CLONE_CHILD_SETTID)) {
        parent_tidptr = va_arg(args, int*);
    }
    if (flags & (CLONE_SETTLS|CLONE_CHILD_SETTID)) {
        new_tls = va_arg(args, void*);
    }
    if (flags & CLONE_CHILD_SETTID) {
        child_tidptr = va_arg(args, int*);
    }
    va_end(args);

    ret = __bionic_clone(flags, child_stack, parent_tidptr, new_tls, child_tidptr, fn, arg);
    return ret;
}

1、参数列表

2、父线程与子线程指针以及返回数值的定义。

接下来查看的文件是clearenv这个文件。

int clearenv(void)
{
    char **P = environ;

    if (P != NULL) {
        for (; *P; ++P)
            *P = NULL;
    }
    return 0;
}

由上面可以看出environ是一个纸箱指针的指针,也可以理解为是一个字符串的二维数组。

在dlmalloc文件中要注意下面的方法:

static size_t release_unused_segments(mstate m) {
  size_t released = 0;
  msegmentptr pred = &m->seg;
  msegmentptr sp = pred->next;
  while (sp != 0) {
    char* base = sp->base;
    size_t size = sp->size;
    msegmentptr next = sp->next;
    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
      mchunkptr p = align_as_chunk(base);
      size_t psize = chunksize(p);
      /* Can unmap if first chunk holds entire segment and not pinned */
      if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
        tchunkptr tp = (tchunkptr)p;
        assert(segment_holds(sp, (char*)sp));
        if (p == m->dv) {
          m->dv = 0;
          m->dvsize = 0;
        }
        else {
          unlink_large_chunk(m, tp);
        }
        if (CALL_MUNMAP(base, size) == 0) {
          released += size;
          m->footprint -= size;
          /* unlink obsoleted record */
          sp = pred;
          sp->next = next;
        }
        else { /* back out if cannot unmap */
          insert_large_chunk(m, tp, psize);
        }
      }
    }
    pred = sp;
    sp = next;
  }
  return released;
}

在pthread-timers中主要关注下面的一个结构体的定义:

struct thr_timer {
    thr_timer_t*       next;     /* next in free list */
    timer_t            id;       /* TIMER_ID_NONE iff free or dying */
    clockid_t          clock;
    pthread_t          thread;
    pthread_attr_t     attributes;
    thr_timer_func_t   callback;
    sigval_t           value;

    /* the following are used to communicate between
     * the timer thread and the timer_XXX() functions
     */
    pthread_mutex_t           mutex;     /* lock */
    pthread_cond_t            cond;      /* signal a state change to thread */
    int volatile              done;      /* set by timer_delete */
    int volatile              stopped;   /* set by _start_stop() */
    struct timespec volatile  expires;   /* next expiration time, or 0 */
    struct timespec volatile  period;    /* reload value, or 0 */
    int volatile              overruns;  /* current number of overruns */
};

1、指向当前的空闲队列的指针

2、定义相关的线程  信号量 以及对应的回调的函数

3、定义一些在时间片的线程与一些函数之间互相调用的变量

时间: 2024-10-11 18:12:17

Android内核源码bionic目录下的源码的学习笔记的相关文章

Android内核源码bionic目录下的子目录arch-arm源码分析笔记

依旧是好记性不如烂笔头,今天需要学习的是arch-arm目录下的代码. 首先我们先看一下inclue目录下的endian这个头文件我们主要是需要知道下面的几点知识. 1.先看一下下面的代码的片段 #if !defined __ARM_ARCH_5__ && !defined __ARM_ARCH_5T__ && !defined __ARM_ARCH_5TE__ && !defined __ARM_ARCH_5TEJ__ && !define

Android记录17-sdk更新、Eclipse下查看源码、chm文档提供等干货

Android记录17-sdk更新.Eclipse下查看源码.chm文档提供等干货 本篇博客分享一些Android开发者提高开发效率的一些干货,之从Google被和谐了之后,Android开发者可谓痛不欲生,只能通过翻墙的方式去查看官网,sdk更新不了,无法下载源码等问题就出现了,作为一位有追求的Android开发者,不可能只满足于使用sdk这种初级技能了,提高开发效率和代码质量是每位开发者应该去追求的,下面小巫整理总结了一些解决方案供各位参考,让Android开发变得高大上一些. sdk更新

.NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题

作者: zyl910 一.缘由 项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持“Add As Link”方式引入文件.这时需要手工修改project.json文件了. 可能是因为最新版本已将 project.json 转为 .csproj,导致我花了一些功夫才找到配置办法,故写了这篇笔记. 二.引用其他目录下的源码等文件的办法 2.1 官网说明 官网的 project.json 和 csproj 属性之间的映射 里简单介绍了

Android 获取SDCard中某个目录下图片

本文介绍Android开发中如何获取SDCard中某目录下的所有图片并显示出来,下面的我们提供的这个函数是通用的,只要提供路径就可以查询出该目录下所有图片的路径信息,并保存到一个List<String>中. 1.获取SDCard中某个目录下图片路径集合 public List<String> getPictures(final String strPath) { List<String> list = new ArrayList<String>(); Fil

在android工程中,res目录下又有anim、drawable、layout、menu、raw、values和xml文件夹,分别用来保存?

res目录主要是存放资源文件的!layout 布局 这个就是你经常看到的与用户交互的界面的 xml 文件,就是各个 view 的排列和嵌套,没什 么好说的啦 风格和主题. 风格主要是指 view 的显示风格 ;anim 一般是设置动画,画资源分为两种,一是实现图片的 translate.scale.rotate.alpha 四种变化.还可以设置 动画的播放特性:另一种是帧动画,逐帧播放设置的资源; drawable 主要是是存放所使用的图片的! menu:菜单 菜单即可以从代码中实现也可以在资源

Android中如何获取asset目录下的ini文件

1.获取资源的输入流 假设资源位于assets目录下: Context.getAssets().open("sample.txt") : public void deepFile(Context ctxDealFile, String path) { try { String str[] = ctxDealFile.getAssets().list(path); if (str.length > 0) {// 如果是目录 File file = new File("/d

linux下的c语言编程学习笔记

视频参看csdn学院王阳和下面的linux环境下c语言编程基础相当的经典,其中王阳的视频讲的很好,相当的经典 编译hellogcc.c需要依赖/home目录下的头文件 为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式.在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ...

做了一个浏览指定文件格式的 TreeView(方便查看Source目录下的源码)

unit DirTreeView; interface uses   SysUtils, Classes, Controls, Forms, ComCtrls; type   TDirTreeView = class(TTreeView)   private     FRootPath: string;     FExt: string;     FFileName: string;   protected     procedure Collapse(Node: TTreeNode); ove

android中如何获取指定目录下的图片

需要对指定目录的图片文件进行列表,借鉴了网上的方法,发现列表出来是所有的文件,这样用起来很不方便,在这里也没找到解决的办法,经过自己的进一步研究终于搞定,发上来给有用的同学.用下面这种方式能实现查询实现查询sd卡某一个子目录下的图片文件详细信息 : //selection: 指定查询条件 String selection = MediaStore.Images.Media.DATA + " like %?"; //设定查询目录 String path="/mnt/sdcard