实验平台内核版本为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. thrift之默认传输类TTransportDefaults和虚拟传输类TVirtualTransport

    默认传输类TTransportDefaults提供了抽象类TTransport的默认实现,实现了非虚拟的方法(*_virt) read(), readAll(), write(),borrow() a ...

  2. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  3. 转载:JavaScript多线程编程简介

    虽然有越来越多的网站在应用AJAX技术进行开发,但是构建一个复杂的AJAX应用仍然是一个难题.造成这些困难的主要原因是什么呢?是与服务器的异步通信问题?还是GUI程序设计问题呢?通常这两项工作都是由桌 ...

  4. cocos2d-x 3.0 cocos run Couldn't find the gcc toolchain.

    出现这个错误是NDK_ROOT环境变量没有设置好,要么设置错了,要么没有重启终端(也就是环境变量还没有生效).我就是因为没有重启终端坑了一个晚上,我只能帮你到这了,玩cocos2d-x 3.0的朋友, ...

  5. MongoDb注意事项

    1.保证足够大的内存. 2.Mongodb跟mysql一样,对于常用的查询条件,该建索引的建索引.不要认为内存够用,数据就会在内存,有时,内存够用,数据也不一定在内存. 3.使用副本集,一个主库,进行 ...

  6. 工作流--JBPM简介及开发环境搭建

    一. 工作流简介 项目中不断的接触工作流,点点滴滴积累了一些,下面把一些学习到的东西整理记录下来. 工作流一般的适用场景:公文流转.行政审批.订单处理.产品研发.制造过程等.用专业一点的语言来描述工作 ...

  7. 64位linux报错Could not initialize class java.awt.image.BufferedImage

    最近碰到一个问题: 64位linux报错Could not initialize class java.awt.image.BufferedImage 在WIN平台下运行正常BufferedImage ...

  8. DNS解析详细过程

    英文:domain name system. 中文:域名系统. 解析过程: 第一次请求站点(例:http://www.baidu.com),先在当前浏览器路径下寻找有没有缓存对应的解析结果,如果有的话 ...

  9. ajax获取后台传递的json数据

      最近在使用JQuery的ajax方法时,需要返回的数据为json数据,在success返回中数据处理会根据返回方式不同会采用不同的方式来生成json数据.在$.ajax方法中应该是如何来处理的,简 ...

  10. lua读书笔记

    接下来把我所看的<Lua程序设计>中介绍lua的内容,时时的记录下来.当做一个读书笔记吧. 先说一下怎样直接运行lua文件吧,windows cmd进入相应的文件夹,然后输入lua,出现版 ...