多核支持:


目前,Bionic不提供或使用读/写内存屏蔽。这意味着可能在某些多核系统中不被支持,这取决于实际的CPU架构。

Android特性:


Android提供了少部分特殊的功能。

- 访问系统属性:

Android向系统中所有的进程提供了一个简单共享的键/值对空间。它提供了properties上的字符号码,每一个都是限制大小的字符串,与一个限制大小的字符串值相关联。

头文件能够被用于读系统属性,也定义键/值对的最大大小。

-Android的用户/组管理:

在Android中没有/etc/passwd 或 /etc/groups,按照设计,只打算给一个手机用户使用。另一方面,Android使用扩展的Linux用户/组管理特性,以确保进程权限,象对不同文件系统目录的访问。

Android策略是这样的,每个已安装的应用程序都有自己的uid_t/gid_t(从10000开始),小于10000的ids保留给系统守护进程.

getpwnam()认得一些硬编码的子系统名(比如.”radio”),会把他们翻译为用户id值,它也认得

"app_1234"是一个组合名字,会把它和10000相加,得到11234. getgrnam()也一样。

getgrouplist()总是返回用户名所属的组,它取用户名做输入参数。

同样地,getgrgid()只会返回一个结构体,它包含一个单元素的成员列表,与用户组的数值一样的用户相对应,

预知详情,参考bionic/libc/bionic/stubs.c。

- getservent()

在Android中没有/etc/services, C库在可执行文件中嵌入只读的服务列表作为代替,它们被依赖于它的不同函数所解析。可以参考bionic/libc/netbsd/net /getservent.c和bionic/libc/netbsd/net/services.h.

内部定义的服务列表可能在未来有变化。这项特性是历史性的,很少使用。

getservent()返回线程本地数据。getservbyport()和getservbyname()也按照同样的方式实现。

- getprotoent()

在Android中没有/etc/protocol,当前不实现getprotoent()和相关函数。如果加入的话,很有可能会与getservent()相同的方式实现。

DNS解析器:


Bionic 使用NetBSD-derived 解析库,按以下方式修改:


- 不实现name-server-switch特性(a.k.a. )


- 读取/system/etc/resolv.conf而不是/etc/resolv.conf


- 从系统属性中读取服务列表。代码查找'net.dns1', 'net.dns2',等等。每个属性应包含一个DNS服务器的IP地址。


这些属性被Android系统的其他部分修改设置(比如dhcpd进程)


在实现上,也支持每进程的DNS服务器列表,使用属性'net.dns1.', 'net.dns2.',等等。这里代表当前进程的ID号。


- 在执行查询时,使用一个适当的随机查询ID(而不是递增1),以提高安全性。


- 在执行查询时,给本地客户socket绑定一个随机端口号,以提高安全性。

- 删除一些源代码,这些源代码会造成许多不幸的线程安全问题。

Bionic不暴露它的DNS解析器的实现细节;中的内容故意空白。解析器的实现可能会在未来完全改变。

PThread 实时定时器:


支持timer_create(), timer_gettime(), timer_settime() and timer_getoverrun()。

Bionic现在也支持SIGEV_THREAD实时定时器(参见timer_create())。

在实现上,简单地使用一个线程一个定时器的机制,不像Glibc使用复杂的启发式技术,在多个定时器具有相同属性的情况下,尽可能减少使用的线程数。

这意味着,如果你的代码使用许多SIGEV_THREAD定时器,你的程序可能会消耗太多内存。无论如何,如果你的程序需要许多定时器,最好直接使用timeout事件代替。

其他定时器(如SIGEV_SIGNAL)由内核处理,使用更少的系统资源。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 angledark0123 的頭像
    angledark0123

    CONY的世界

    angledark0123 發表在 痞客邦 留言(0) 人氣()