Add a syscall to kernel and replace linux kernel of RPi.


Prepare:

  1. Cross compiler
  2. Linux Kernel for RPi

Reference:

Official guide


Firstly, get the latest kernel:

git clone https://github.com/raspberrypi/linux

Assume that the kernel directory is 'linux' and you have already installed cross-compiler tool.


Secondly, modify the source to add a simple syscall.

1. linux/arch/arm/kernel/sys_arm.c

Add syscall definition.

In order to simplify the process, we add the definition directly in the source that exists, so that we need not to modify the Makefile. And sys_arm.c is what we need.

Add the following definition to sys_arm.c

asmlinkage long sys_mysyscall(int num)
{
printk("My syscall with argument: %d\n",num);
return 0;
}

There is a second file(Call.S) in the same directory that we need to modify. But, in order to make the process more clear, we change another file first.

2.linux/arch/arm/include/unistd.h

Add macro define of our syscall to this file.

In this file, __NR_SYSCALL_BASE define the base address of syscall. And we will use this macro to define the address of our own function. Like this:

#define __NR_mysyscall (__NR_SYSCALL_BASE+223)

We use the 223th address, because this address is unused.

3.linux/arch/arm/kernel/call.S

Bind the definition and the address of our syscall function.

We have function definition in sys_arm.c and function address in unistd.h. Then we should tell the system, these two is associated.

Add this line in the file:

CALL(sys_mysyscall)

Be sure that this line is added in the 223th entry.

4. linux/include/linux/syscalls.h

Add the declaration of the syscall.

We must let system know 'ther is' a syscall 223. As we usually do, add the feclaration of the function to *.h:

asmlinkage long sys_mysyscall(int num);

Now the syscall is added in the linux kernel. Begin to compile the kernel.


Compile kernel

Personally, I create a new directory kernel-build for output.

That is /home/darren/opt/raspberry/kernel-build. It is not necessary.

Clean

Firstly, clean the project.

#Do you know that who is Mr.Proper? Ha...
make mrproper

Configure

Secondly, configure for your Raspberry.

There are some differences between RPi1 and RPi2. But luckily, the official offer us a template. We need not to do this by our own.

#RPi1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
O=/home/darren/opt/raspberry/kernel-build bcm_defconfig #RPi2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
O=/home/darren/opt/raspberry/kernel-build bcm2709_defconfig

Okay, that is so easy...

Make

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
O=/home/darren/opt/raspberry/kernel-build -j 12

Here '-j n' is the number of thread (Is it right? ). To speed up, let it be the 1.5 * the number of processors of your pc.

And you may know the nomber of processor by

cat /proc/cpuinfo | grep processor | wc -l

Install

Insert the sd card to computer. You may get two directories--root and boot.

Denote them like these two:

/media/boot/
/media/root/

Then run this command:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=/home/darren/opt/raspberry/kernel-build -j 12 INSTALL_MOD_PATH=/media/root/ modules

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=/home/darren/opt/raspberry/kernel-build -j 12 INSTALL_MOD_PATH=/media/root/ modules_install

Your could replace the kernel.img(or kernel7.img for RPi2) with linux/arch/arm/boot/Image

cp linux/arch/arm/boot/Image /media/boot/

Reboot and all is well.


Syscall

Finally, write a function to call our function:

void inline_asm(int num)
{
asm volatile (
"mov r7, #223\n" //系统调用号
"mov r0, %[value]\n" //参数
"svc #0\n" //监督调用
:: [value] "r" (num) //return 留空,并将 num 作为传入参
);
} int main()
{
int num = 10;
syscall(223, num); //直接使用 223 号系统调用
num = num << 2;
inline_asm(num);
return 0;
}

Add a Syscall的更多相关文章

  1. golang调用c++的dll库文件

    最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...

  2. Go win32 - 1

    上次说到,我们的GO可以执行系统调用,嘿嘿 不假,但如果你认为你已经掌握了,哈哈,那么不然 网上的例子,总是不深入,不彻底,除非是官网上的demo,也就是说只有设计者才知道告诉你什么才是它设计的正真意 ...

  3. 栈溢出之rop到syscall

    当程序开启了nx,但程序有syscall调用的时候.这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve('/bin/sh',null,null),这是这次alictf一道pw ...

  4. syscall to rop

    前言 hitcon 2017 的 start 题,比较简单,练练手. 题目链接: https://gitee.com/hac425/blog_data/tree/master/hitcon2017 正 ...

  5. [Fw]How to Add a System Call(Fedora Core 6 Kernel : 2.6.18)

    How to Add a System Call Kernel : 2.6.18編譯環境 : Fedora Core 6 假設要加的system call為 sys_project, 有一個int的輸 ...

  6. AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  9. Syscall,API,ABI

    系统调用(Syscall):Linux2.6之前是使用int0x80(中断)来实现系统调用的,在2.6之后的内核是使用sysentry/sysexit(32位机器)指令来实现的系统调用,这两条指令是C ...

随机推荐

  1. css 选择器优先级

    优先级自上而下逐渐递减 1. 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式. 2.作为style属性写在元素内的样式 3.id选择器 4.类选择器 5.标签选择器 6.通配 ...

  2. HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)

    题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...

  3. JAVA_Android APK反编译就这么简单 详解(附图)

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  4. 安装并配置前端自动化工具——grunt

    Grunt和所有Grunt插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs.安装nodeJs非常简单,点击访问nodeJs官网https://nodejs.org,然后nodeJ ...

  5. Hadoop_UDF示例

    UDF:  一进一出 Eclipse端 1. 继承UDF 2. 实现evaluate方法(可重裁实现多个evaluate方法,以实现不同需求) 3. 导出类jar包,注意指定main方法 Hive端 ...

  6. 【清北学堂】 死亡(death)

    M个位置可以打sif,N+1个人等着打sif,已知前N个人的时间,问第N+1个人什么时候才能打sif(不能插队,即必须按顺序来打sif) 输入N,M以及每个人所需要的时间:输出第N+1个人所需的时间 ...

  7. Daily Scrum02 12.07

    最近大家都在赶编译的大作业,没日没夜的码代码,调试,大家都很辛苦,但是,我们团队的工作,大家也不能懈怠啊! 大家要顶住压力,加油努力啊! Member 任务进度 下一步工作 吴文会 就总结点进行汇报 ...

  8. 不能用con作为类名

    A class file was not written. The project may be inconsistent, if so try refreshing this project and ...

  9. phpcms无刷新分页

    控制器添加一个函数: 添加一个静态页面ajax_message.html,在页面中添加如下代码: 在要分页的页面(我的是"show"页面)中添加如上图代码: phpcms无刷新分页 ...

  10. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...