2013年7月19日 星期五

system call for arm platform (1)

android的external/kernel-headers/original目錄
from:
https://github.com/billwangwl/android_linux_stuff/blob/master/android_bionic_kernel-headers-original_explanation_zh_CN.html

external folder中linux kernel header的作用

在Linux中,有一个external/kernel-headers/original,这个文件夹中有很多linux的头文件,与kernel/include/linux有很多重复的文件。

 1、Android external folder

  External refers to external open source libraries. That means libraries that the Android platform depend upon but that are not primarily developed and maintained by the Android open source project. Typical examples are webkit for the browser, FreeType for fonts, SqlLite for databases and so on. As more features are added to Android, more of these libraries are included in external.

 external folder是外部的open source lib,这些lib是android依赖的,但是主要的开发和维护又不是android来做

 http://stackoverflow.com/questions/10477565/android-external-folder-functionality

  2,external/kernel-headers/original 

 (external/kernel-headers/original/README.TXT)

 这个文件夹里的头文件是Bionic来用生成一个干净的user-land(user space)头文件。基于GPL2+。  

3、Bionic

 Bionic libc是BSD standard C library发展而来,最早是Google为Android开发。作用主要有三个: 

a) BSD license: 通过BSD license,Android程序就和GPL分隔开来。

b) Bionic比GNU C Library要小的多。

c) Bionic的速度更快。

 Bionic也缺少很多完整的libc的特性,比如宽字符和C++的异常处理。一些函数也没有实现。 

(http://discuz-android.blogspot.com/2008/10/google-android-native-libc-bionic.html

HAL层,以及除了kernel以外的任意用到的C头文件,都是bionic中的。

 ./core/pathmap.mk,pathmap_INCL := libc:bionic/libc/include (http://www.linuxidc.com/Linux/2011-03/33672.htm

Android编译环境所用的交叉编译工具链是prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin /arm-eabi-gcc,-I和-L参数指定了所用的C库头文件和动态库文件路径分别是bionic/libc/include和out /target/product/generic/obj/lib

 (http://www.360doc.com/content/09/0624/17/36491_4018938.shtml )

 kernel中用的头文件在kernel/include中。user space用的头文件在bionic下。

 4,Bionic kernel header 

 (bionic/libc/kernel/README.TXT)

 Bionic有一套干净的Linux头文件,这些头文件是通过bionic/libc/kernel/tools解析一份原始的,没有修改过的linux头文件生成的,这份头文件就在external/kernel-headers/original

干净的头文件只包括类型和宏定义,不过处于效率的考虑,不会生成一些静态内联函数。 

这些生成的头文件可以用于编译C++,C,也能够按照ANSI模式编译(linux kernel中用到了大量GNU扩展)。

生成头文件的过程是:

 *external/kernel-headers/original 包含通常linux kernel source tree中的include目录。这里仅仅只应该包含android依赖的kernel头文件。

 *bionic/libc/kernel/common 包含平台无关的头文件。 

from:

 http://blog.csdn.net/muge0913/article/details/7518568

 About sys_ni_syscall in Kernel System Call Table

不是所有的系统调用都有实际内容,如sys_ni_syscll在kernel/sys_ni.c中定义:
asmlinkage long sys_ni_syscall(void)
{
    return -ENOSYS;
}

你会发现在sys_call_table中sys_ni_syscall占据了很多内容,其实它代表着已被淘汰的系统调用。其实只要是被内核淘汰的系统调用都会被sys_ni_systcall代替。之所以这样是为了老的程序在新的内核上运行时不至于出现大的问题。如不应调用这个系统调用却调用了那个系统调用了。

from:

http://bbs.csdn.net/topics/350141651

cond_syscall

#ifndef cond_syscall  
     #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
#endif

告诉编译器,当在符号表中没有x时,就用sys_ni_syscall这个符号来代替。这样的话,一些在特殊系统中没有定义出的系统调用的函数,就被默认为是sys_ni_syscall了。

沒有留言:

張貼留言