实验平台内核版本为4.0-rc1,增加一仅仅打印Hello World的syscall,最后我们在用户空间swi验证

实验平台内核版本为4.0-rc1,增加的系统调用仅仅是简单打印一个Hello World,最后我们在用户空间用swi指令验证。涉及到的改动如下:

1. 在内核中增加文件arch/arm/kernel/mysyscall.c,这个文件实现新的打印Hello World的系统调用。

  1. #include <linux/printk.h>
  2. void sys_helloworld(void)
  3. {
  4. printk("hello world\n");
  5. }

修改arch/arm/kernel下的Makefile编入该文件:

  1. --- a/arch/arm/kernel/Makefile
  2. +++ b/arch/arm/kernel/Makefile
  3. @@ -18,7 +18,7 @@ CFLAGS_REMOVE_return_address.o = -pg
  4. obj-y          := elf.o entry-common.o irq.o opcodes.o \
  5. process.o ptrace.o return_address.o \
  6. setup.o signal.o sigreturn_codes.o \
  7. -                  stacktrace.o sys_arm.o time.o traps.o
  8. +                  stacktrace.o sys_arm.o time.o traps.o mysyscall.o
  9. obj-$(CONFIG_ATAGS)            += atags_parse.o
  10. obj-$(CONFIG_ATAGS_PROC)       += atags_proc.o

2. 将sys_helloworld加入syscall的表,并修正syscall的数量:

数量修正,注意不是加1,而是加4,这个主要是因为padding对齐的原因。

  1. --- a/arch/arm/include/asm/unistd.h
  2. +++ b/arch/arm/include/asm/unistd.h
  3. @@ -19,7 +19,7 @@
  4. * This may need to be greater than __NR_last_syscall+1 in order to
  5. * account for the padding in the syscall table
  6. */
  7. -#define __NR_syscalls  (388)
  8. +#define __NR_syscalls  (392)
  9. /*
  10. * *NOTE*: This is a ghost syscall private to the kernel.  Only the

把sys_helloworld函数指针填入arch/arm/kernel/calls.S

  1. --- a/arch/arm/kernel/calls.S
  2. +++ b/arch/arm/kernel/calls.S
  3. @@ -397,6 +397,7 @@
  4. /* 385 */      CALL(sys_memfd_create)
  5. CALL(sys_bpf)
  6. CALL(sys_execveat)
  7. +               CALL(sys_helloworld)
  8. #ifndef syscalls_counted
  9. .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
  10. #define syscalls_counted

编译内核时候,使能OABI的兼容:

从menuconfig的kernel features进入选择

使能OABI兼容

重新编译内核后,写应用程序来验证这个系统调用。

3. 应用程序验证,OABI和EABI两种方式:

程序如下:

  1. #include <stdio.h>
  2. #define sys_oabi_hello() __asm__ __volatile__ ("swi 0x900000+388\n\t")
  3. #define sys_eabi_hello() __asm__ __volatile__ ("mov r7,#388\n\t" "swi 0\n\t" )
  4. void main(void)
  5. {
  6. printf("start hello\n");
  7. sys_oabi_hello();
  8. sys_eabi_hello();
  9. printf("end hello\n");
  10. }

OABI方式下,系统调用方式是“swi 0x900000+388”,EABI则是把388填入r7,之后发“swi 0"。

关于OABI和EABI的区别,可以在PC上运行man syscall,得到答案如下:

arch/ABI   instruction          syscall #   retval Notes

─────────────────────────────────────────────────────────────
       arm/OABI   swi NR               -           a1     NR is syscall #

arm/EABI   swi 0x0              r7          r0

(repost)在ARM Linux内核中增加一个新的系统调用的更多相关文章

  1. 35、在编译Linux内核中增加程序需要完成以下3项工作

    在编译Linux内核中增加程序需要完成以下3项工作: 将编写的源代码拷入Linux内核源代码的相应目录. 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项 在目录的Makefile文 ...

  2. (十)Linux内核中的常用宏container_of

    Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...

  3. Linux内核中的常用宏container_of

    Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...

  4. Linux内核中的常用宏container_of其实很简单【转】

    转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...

  5. 在Discuz X 中增加一个单独的页面

    如果在DZ中增加一个新的页面,并且取得DZ中相关的用户等乱七八糟的属性,在旧的版本中只要引用一个 -. comm.php 文件就可以,但是在 X 版本以后好像就没.还好,X版本中还是有办法解决的,使用 ...

  6. Add an Item to the New Action 在新建按钮中增加一个条目

    In this lesson, you will learn how to add an item to the New Action (NewObjectViewController.NewObje ...

  7. 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加 ...

  8. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  9. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

随机推荐

  1. 通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页

    通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页 YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.N ...

  2. javascript数组、对象和Null的typeof同为object,区分解决办法

    在JS里typeof 大家用的很多,可以使对于数组.对象和Null无法区分的问题,看了看犀牛书还是有解决办法的. document.writeln(typeof "abc"); / ...

  3. POJ 3900 The Robbery

    大意:和背包的问题相似,第 i 个箱子有 i 颗钻石.钻石的重量,价值给出.然后再M的重量下背尽量多价值的钻石. 思路:直接暴搜然后剪枝.因为数据范围的原因无法用DP. #include <cs ...

  4. HTTPCLIENT抓取网页内容

    通过httpclient抓取网页信息. public class SnippetHtml{ /** * 通过url获取网站html * @param url 网站url */ public Strin ...

  5. mysql关联删除

    <delete id="deleteBatchUserOfSp" parameterType="java.lang.String" > delete ...

  6. Ubuntu下JDK+Tomcat+MySql环境的搭建

    主机在阿里云上,所以网络的配置都省了,只剩下软件的安装和配置 1.安装mysql 1.1 apt-get install mysql-server-5.5 安装过程中,有两次提示输入 mysql 的  ...

  7. C++11多线程std::thread的简单使用

    在cocos2dx 2.0时代,我们使用的是pthread库,是一套用户级线程库,被广泛地使用在跨平台应用上.但在cocos2dx 3.0中并未发现有pthread的支持文件,原来c++11中已经拥有 ...

  8. Python高手之路【九】python基础之迭代器与生成器

    迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  9. Spark Graphx编程指南

    问题导读1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图?2.PageRank算法在图中发挥什么作用?3.三角形计数算法的作用是什么?Spark中文手册-编程指南Spark之一个快 ...

  10. Texture的渲染及截屏功能

    我们今天就简单说下 cocos2d的Texture的简单用法,并将一张大图裁剪成小图并保存起来 我们先准备一张大图,如下: 只看图,表太在意内容啊. 我们的目的就是将这张大图裁剪成一张张的小图并保存下 ...