实验平台内核版本为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. SQL删除重复数据,保留一条

    例如: id           name         value 1               a                 pp 2               a           ...

  2. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...

  3. ehcache.xml配置参数

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLoc ...

  4. 【Zookeeper】源码分析之持久化--FileSnap

    一.前言 前篇博文已经分析了FileTxnLog的源码,现在接着分析持久化中的FileSnap,其主要提供了快照相应的接口. 二.SnapShot源码分析 SnapShot是FileTxnLog的父类 ...

  5. C语言之scarf函数

    一 基本用法 scanf函数:接收用户的输入 语法: scanf("格式化控制符",地址列表); 例: int num; scanf("%d",&num ...

  6. Docker集群实验环境布署--swarm【2 搭建本地镜像仓库】

      在10.40.100.148上   # docker run -d -p 5000:5000 --restart=always --name docker-registry.venic.com - ...

  7. mac 切换php版本

    通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55

  8. CodeForces 632D Longest Subsequence

    暴力. 虽然$a[i]$最大有${10^9}$,但是$m$最大只有${10^6}$,因此可以考虑暴力. 记$cnt[i]$表示数字$i$有$cnt[i]$个,记$p[i]$表示以$i$为倍数的情况下, ...

  9. Nexpose

    下载: https://www.rapid7.com/products/nexpose/nexpose-enterprise-trial-thank-you.jsp注册: https://www.ra ...

  10. CentOS Gnome 识别 NTFS-3G

    安装完NTFS-3G后,使用命令行已经可以正常挂载NTFS分区了 但如果是源码编译安装(epel yum 库也有),还需要添加一个软链接,才能点击Gnome的左边栏进行挂载,因为Gnome挂载NTFS ...