Android添加内核系统调用

2023-05-16

Author:Gary
Date:2019-4-30
Android版本:Android 6.0.1_r1
内核版本:Linux 3.10.40
手机:Nexus 6
参考资料:
http://android.blogs.rice.edu/2013/09/25/adding-system-call-in-android-bionic-library/
http://www.it1352.com/231359.html
https://www.cnblogs.com/wuyuegb2312/archive/2012/08/09/2629719.html

一.编译源码

由于Android系统中不包含内核的源码,所以需要分别下载编译Android和Kernel的源码。这部分比较复杂且不是本文的重点,读者需自行解决。这里给出几个参考文档,实测比较靠谱:

Android编译:https://blog.csdn.net/pcsxk/article/details/52013904
内核编译:https://blog.csdn.net/u012417380/article/details/73353670

以上两项编译成功后才能进行下面的步骤。

二.内核修改

1. 函数声明

在kernel/include/linux/syscalls.h文件末尾添加函数声明

asmlinkage long sys_getpos(unsigned int fd);

2. 函数实现

可以在一个已存在的C文件中添加或者新建一个C文件添加,这里出于简单选择前者。
在kernel/kernel/timer.c中实现函数:

SYSCALL_DEFINE1(getpos,unsigned int,fd)
{
	return fd * 2;
}

3. 添加系统调用号

在kernel/arch/arm/include/uapi/asm/unistd.h中添加系统调用号

#define __NR_getpos (__NR_SYSCALL_BASE+384)

修改系统调用计数器(kernel/arch/arm/include/asm/unistd.h):

#define __NR_syscalls (384)

修改为

#define __NR_syscalls (388)

注意这里的__NR_syscalls只能以4为单位递增否则编译会出错

4. 在系统调用表中声明

在文件kernel/arch/arm/kernel/calls.S中添加:

/* 384 */	CALL(sys_getpos)

5. 编译刷入后即可

三.Android源码修改

1. 声明系统调用

在bionic/libc/SYSCALLS.TXT中添加系统调用的声明:

int     getpos(int) arm

按照参考文档的说法,只需要在SYSCALL.TXT中添加这一句话就可以通过脚本/bionic/libc/tools/gensyscalls.py自动生成其余文件,但是我这脚本运行报错,所以其余文件通过手动修改,读者可以自己测试下脚本能否正常运行。

2. 汇编系统调用实现

这里的汇编程序并不需要自己编写,因为汇编程序功能都是一样的,只是保存一下寄存器现场传入参数然后调用系统调用后恢复现场,所以将汇编程序修改一下函数名就可以了。
在/bionic/libc/arch-arm/syscalls中新建一个getpos.S文件,写入以下内容:

/* Generated by gensyscalls.py. Do not edit. */

#include <private/bionic_asm.h>

ENTRY(getpos)
    mov     ip, r7
    ldr     r7, =__NR_getpos
    swi     #0
    mov     r7, ip
    cmn     r0, #(MAX_ERRNO + 1)
    bxls    lr
    neg     r0, r0
    b       __set_errno_internal
END(getpos)

3. 添加映射表

在/bionic/libc/libc.map中添加一行函数名即可:

LIBC {
  global:
    getpos; #Add here
    __assert;

4. 添加调用号

在文件中添加调用号,注意要与之前内核添加的调用号一致。在文件bionic/libc/kernel/uapi/asm-arm/asm/unistd.h中添加:

#define __NR_getpos (__NR_SYSCALL_BASE + 384)

注意这里有个问题,系统调用号384已经被之前的某些系统调用占用了。但是我们从内核中可以得知内核根本没有提供这个调用号的系统调用所以之前的肯定没有作用的,删掉即可。

5. 测试系统调用

在bionic/libc/bionic/open.cpp中进行测试,添加以下代码:

extern "C" int getpos(int);
int open(const char* pathname, int flags, ...) {
  const char * tag = "DebugPos";
  const char * format = "%d*2 = %d";               
  __libc_format_log(ANDROID_LOG_DEBUG, tag, format, 5,getpos(5));
  .......
  .......

6. 编译写入

注意编译写入时不要写入boot.img,否则把我们之前编译的内核覆盖掉了,会无法开机。

四.运行结果

开机后在终端输入 adb logcat | grep 'DebugPos'
在这里插入图片描述
可以看到调用成功了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android添加内核系统调用 的相关文章

  • Flutter :已处置的 CameraController,在已处置的 CameraController 上调用了 buildPreview()

    如何正确初始化和处理相机控制器 我在用camera 0 9 4 5 与许多人一起 其他错误 https stackoverflow com questions 70592464 flutter change the path of reco
  • Android主线程的IO操作

    我的问题有两个 是否建议在 Android 的主线程上进行 IO 操作 或者它是否有可能导致我的应用程序崩溃 如果在主线程上执行 IO 操作不理想 我可以使用哪些其他框架 以便当我的应用程序加载时它可以执行一些基本的 IO 文件读取并将值存
  • 如何替换 Android 中已弃用的 Bundle/Argument get(key) 调用

    我有以下扩展函数 允许我在应用程序活动和片段之间传递捆绑数据项 inline fun
  • 在 ChromeO 上安装未知来源的 apk

    我今天早上更新了我的 Chromebook Asus Flip 以获取 Play 商店 我的 Chromebook 安装了 M53dev 通道版本 它运作良好 我可以安装并运行从 Play 商店下载的 Android 应用程序 我想测试我的
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 为什么反射会减慢Android手机的速度

    我多次读到反射会降低手机性能 这有多真实 例如 在我的例子中 我从 Web 服务获取一些参数 这些参数与我在 Android 应用程序中的类的参数同名 所以我只是使用java字段和反射设置这些参数的值 它似乎并没有降低性能 有人可以向我解释
  • 覆盖 Android 中的电源按钮

    我正在开发一个应用程序 其中我需要在按下电源按钮时执行一个操作 但不幸的是我无法处理按下电源按钮时的操作 我尝试使用 onKeyDown 和dispatchKeyEvent 方法 但似乎没有任何效果 任何人都可以建议我解决这个问题的任何其他
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 从ListView中隐藏行而不占用空间

    我有一个带有关联 ArrayAdapter 的 ListView 它在多个活动中显示其内容 不幸的是 现在有必要 我的 ListView 在其中一项设置中不显示其所有元素 而仅显示 属性 未设置为 true 的元素 我想避免使用两个具有不同
  • 如何禁用操作栏上“向上”按钮的翻转?

    背景 我做了一个 应用程序管理器 https play google com store apps details id com lb app manager 替代应用程序 我希望添加 RTL 从右到左 语言的翻译 因为我知道在某些 And
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用 SharedPreferences 保存多个值?

    我正在开发一个字典应用程序 在我的应用程序中 我假设用户想要保存最喜欢的单词 我决定使用共享首选项保存这些值 我知道 SQLite 和文件更好 但我坚持使用 SharedPreferences 所以继续使用它 下面是我的代码 Overrid
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • 如何在android中通过蓝牙向配对设备发送短信?

    在我的应用程序中 我想通过蓝牙发送和接收短信 我可以在列表视图中看到配对设备名称和地址的列表 但是当我尝试向配对设备发送文本时 什么也没有发生 在其他设备中没有收到文本 这是我向配对设备发送消息的代码 private void sendDa
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从

随机推荐

  • 2.6.34内核编译

    2 6 34内核编译 内核版本号 xff1a 2 6 34 15 系统版本号 xff1a 12 04 05 虚拟机 xff1a VMware 12 更新日期 xff1a 20181102 准备工作 下载Vmware并破解下载Ubuntu12
  • 32位内核增加系统调用

    32位内核增加系统调用 内核版本 xff1a 2 6 34 15 系统版本 xff1a Ubuntu 12 04 系统位数 xff1a 32位 更细日期 xff1a 20181102 一 修改系统调用表 在文件arch x86 kernel
  • 解决WinSCP连接虚拟机

    介绍一个 FTP客户端 IIS7服务器管理工具 作为FTP客户端 xff0c 它支持批量管理ftp站点 定时上传和定时下载 xff0c 定时备份 xff0c 且操作简洁 同时iis7服务器管理工具还是vnc客户端 并且支持批量管理管理win
  • Linux关闭MySQL的日志记录功能

    网上找了很多的博客 xff0c 但是位置都不对或者是个空文件 最终找到的配置文件位于 etc mysql mysql conf d路径下的mysqld cnf文件用管理员权限编辑文件 xff0c 在文件内添加 innodb flush lo
  • Python3 lambda,map,reduce,filter

    Python3 lambda map reduce filter 转载自 https www cnblogs com hf8051 p 8085424 html https blog csdn net BobYuan888 article
  • Spark+Python函数总结

    Spark 43 Python函数总结 整理自 https www cnblogs com yangzhang home p 6058076 html https blog csdn net nanruoanhao article deta
  • Spark + Python入门

    Spark 43 Python实践入门 整理自 xff1a https www cnblogs com yangzhang home p 6056133 html http spark apache org docs latest quic
  • Numpy函数总结

    Numpy函数总结 整理自 https www jianshu com p 83c8ef18a1e8 基础属性 引入模块 gt gt gt import numpy as np 创建一个list并转化为numpy数组 创建简单的列表 gt
  • pip提速方法

    Author Gary Date 2019 4 12 方法1 在pip参数中添加镜像源地址 豆瓣 xff1a http pypi douban com simple 清华 xff1a https pypi tuna tsinghua edu
  • 使ssh可以以root用户直接登录

    出于安全考虑 ubuntu默认不允许root远程登录 解决方案 安装openssh软件 sudo apt install y openssh server 编辑 SSH 的文件 sudo nano etc ssh sshd config 将
  • 安装Arduino以及ESP8266开发环境

    安装Arduino以及ESP8266开发环境 Author Gary 更新日期 2018 11 20 1 下载安装ArduinoIDE 没什么好说的 xff0c 下载地址 xff1a https www arduino cc en Main
  • 使用Screen来管理终端

    使用Screen来管理终端 转载整理自 xff1a https blog csdn net u013901768 article details 81189348 需要使程序一直运行的情况下 xff0c 可以采用开机自启动的方式 这里为了便
  • 终端关闭后让程序继续运行

    更新 实测此方法有问题 xff0c ctrl 43 z后进程会停止运行 xff0c 即使挂起了也没用了 xff0c 如需挂起后还能继续执行请参考https blog csdn net m0 37340681 article details
  • HiveDDL

    一 数据类型 1 基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 INT int 4byte有符号整数 20 BIG
  • Linux解除端口占用-kill进程总结

    Linux解除端口占用 需要解除端口占用时 xff0c 可以通过端口或者进程名查找进程 xff0c 再通过该进程的pid来杀掉该进程 xff1b 也可以通过进程名直接杀死进程 方法1 根据端口查找进程 sudo lsof i lt 端口号
  • Matplot学习总结

    数据可视化库Matplotlib学习总结 更新日期 20181109 安装 需要先安装numpy pip install numpy pip install matplotlib 如果下载速度慢可以参考 https blog csdn ne
  • 使用GDB调试Android Native层代码

    Author Gary Date 2019 2 21 转载整理自 xff1a https wladimir tm4pda github io porting debugging gdb html https www cnblogs com
  • Shell总结

    Author Gary Date 2019 2 22 转载整理自 xff1a http www runoob com linux linux shell variable html bin bash 是一个约定的标记 xff0c 它告诉系统
  • Android I/O截获

    Author Gary Date 2019 3 15 系统版本 Android 6 0 1 r1 Android I O截获 xff0d xff0d 将Android系统中的汇编系统调用封装为C函数 由于项目要求 xff0c 需要拦截And
  • Android添加内核系统调用

    Author Gary Date 2019 4 30 Android版本 Android 6 0 1 r1 内核版本 Linux 3 10 40 手机 Nexus 6 参考资料 http android blogs rice edu 201