给Mediatek智能机(arm)增加新的系统调用
来源:互联网 发布:御彩轩计划软件免费 编辑:程序博客网 时间:2024/05/05 18:17
适用于mediatek,65xx智能机系列
先看一个已有的系统调用
(1) 系统调用号
//./include/linux/syscalls.h
./kernel/include/linux/unistd.h -->#include <asm/unistd.h>
./kernel/arch/arm/include/asm/unistd.h
#define __NR_restart_syscall (__NR_SYSCALL_BASE+ 0)
#define __NR_exit (__NR_SYSCALL_BASE+ 1)
#define __NR_fork (__NR_SYSCALL_BASE+ 2)
#define __NR_read (__NR_SYSCALL_BASE+ 3)
#define __NR_write (__NR_SYSCALL_BASE+ 4)
#define __NR_open (__NR_SYSCALL_BASE+ 5)
#define __NR_close (__NR_SYSCALL_BASE+ 6)
...
#define __NR_setns (__NR_SYSCALL_BASE+375)
#define __NR_process_vm_readv (__NR_SYSCALL_BASE+376)
#define __NR_process_vm_writev (__NR_SYSCALL_BASE+377)
(2) 系统调用表
kernel/arch/arm/kernel/calls.S
/* 0 */ CALL(sys_restart_syscall)
CALL(sys_exit)
CALL(sys_fork_wrapper)
CALL(sys_read)
CALL(sys_write)
/* 5 */ CALL(sys_open)
CALL(sys_close)
...
/* 375 */ CALL(sys_setns)
CALL(sys_process_vm_readv)
CALL(sys_process_vm_writev)
(3) sys_open的系统调用实现
在代码中找不到sys_open的实现,其实sys_open的实现在文件fs/open.c中
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
./include/linux/syscalls.h
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
==> SYSCALL_DEFINEx(3, _##open, const char __user *, filename, int, flags, umode_t, mode)
==> askmlinkage long sys_open(const char __user *, filename, int, flags, umode_t, mode)
(4)新的系统调用
a, ./kernel/arch/arm/include/asm/unistd.h
#define __NR_my_syscall (__NR_SYSCALL_BASE+378)
b. //kernel/arch/arm/kernel/calls.S
/* 375 */
CALL(sys_setns)
CALL(sys_process_vm_readv)
CALL(sys_process_vm_writev)
CALL(sys_my_syscall)
c . //mediatek/kernel/drivers/xlog/xlog_printk.c文件中增加(随便找了一个文件)
asmlinkage void sys_my_syscall(void)
{
printk("**********sys_mysyscall***********\n");
}
EXPORT_SYMBOL(sys_my_syscall);
d. 编译kernel
./mk mbk77_twn_cu_jb r k bootimage
编译完成后烧写boot.img
e. main.cpp
#include <stdio.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
extern "C" {
#define __NR_my_syscall 378
int main()
{
syscall(__NR_my_syscall);
return 0;
}
}
f. 通过mm编译,adb push到/data目录下,chmod 0777 修改属性
运行程序,并通过dmesg查看。
下面是运行的结果:
- 给Mediatek智能机(arm)增加新的系统调用
- 在ARM Linux内核中增加一个新的系统调用
- Linux添加新的系统调用(for arm )
- 为arm linux内核添加新的系统调用
- 给树莓派增加一个Linux系统调用
- ARM Linux 下增加系统调用(不推荐的方法)
- linux下增加一个新的系统调用实现pstree功能
- 阅读笔记:如何给OpenSolaris增加一个系统调用
- android framework增加新的系统服务
- 给GRIDVIEW增加新行遇到的问题
- 给当前 redo 增加一组新的 redo group
- 给libpcap增加一个新的捕包方法
- 如何给虚拟机vmware增加新的磁盘
- 如何给linux(ubuntu)增加新的外置分辨率
- oracle 给表增加新的字段(alter)
- ARM体系结构的发展之:ARMv6增加的系统支持
- 基于ARM的智能储物系统设计
- 基于ARM与DSP的智能仪器系统设计
- python 验证邮箱
- 杂聊游戏
- linux cache and buffer
- GDB常用调试命令
- 当程序崩溃的时候怎么办 part-1
- 给Mediatek智能机(arm)增加新的系统调用
- Android下通过root实现对system_server中binder的ioctl调用拦截
- 当程序崩溃的时候怎么办 Part-2
- 大家好,我是安卓杀手,今天是我第一天注册博客 欢迎收看
- relocation R_X86_64_32 against `a local symbol'
- AFNetworking速成教程
- VSTO开发中格式文本内容控件与纯文本内容控件关于背景色的一个POC
- SEO学习(十)——网站结构优化
- python小技巧(初学者适用)