实验平台内核版本为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. C#中的文件操作2

    1. 读取文件的方法: 1.  声明一个文件流: 目的是为了内存与文件之间的桥梁,可以进行数据的往来. FileStream fs = new FileStream(filename,FileMode ...

  2. .NET基础——基本概念

    1.   .NET.C#(sharp)和JAVA .net是一种多语言的平台,开发.net可以用多达几十种语言进行开发. C#(sharp)是一种编程语言,可开发基于.net平台的应用. Java既是 ...

  3. 浅谈 JavaScript new 执行过程及function原理

    前言 最近在学习JavaScript语言精粹,感觉写得相当不错.所以这里也算是总结一下.一个方法使用new的方式创建到底是怎样的过程,一个function的声明内部又是怎样执行的呢 另外学的过程中,不 ...

  4. 结构-行为-样式-angularJs笔记

    0.关于Ng-app   通过ngApp指令来引导Angularjs应用是一种简洁的方式 ,适合大多数情况.在高级开发中,例如使用脚本装载应用,您也可以使用Bootstrap手动引导AngularJs ...

  5. [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】

    多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...

  6. C#通过外部别名,解决DLL冲突问题

    今天遇到一个有两个DLL文件,命名空间,部分类名与部分方法名一样,但是方法的功能实现不一样.调用方法时,无法调用指定DLL的指定方法.在网上找了好多,简单总结一下. 1.首先添加引用,不细说. 2.右 ...

  7. Android- assent和raw的区别

    Android- assent和raw的区别 相同点: 里面的文件在编译的时候都不会被编译成二进制文件,都会原封不动的打包. 不同点: 1.存放的路径不一样,一般assets存放在项目的根目录下,而r ...

  8. Highcharts中如何外部修改pointStart

    相信很多童鞋都在用Highcharts做图表,使用时当然就会产生各种各样的需求,今天遇到一个问题,搞了一上午才搞定:在服务端拼装好options的json串传到前段,但是有个问题,JSONObject ...

  9. 认识div在排版中的作用

    在网页制作过程过中,可以把一些独立的逻辑部分划分出来,放在一个<div>标签中,这个<div>标签的作用就相当于一个容器. 语法: <div>-</div&g ...

  10. Xcode 注释工具的使用

    1:Xcode 8之后 Goodbye World In Xcode 8, Apple integrated a comment documentation generator plugin, whi ...