[linux内核]ARM-Linux系统调用

1,系统调用的概念:

是用户空间访问内核的唯一手段,系统调用依靠软件中断实现,每个系统调用被赋予一个系统调用号,用来指明要执行哪个系统调用。

2,系统调用的实现:
系统调用是通过软中端(SWI)实现的,
SWI指令
SWI指令的格式为:
SWI{条件} 24位的立即数
SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同 时,参数通过其他通用寄存器传递。
指令示例:
SWI   0x02                ;该指令调用操作系统编号位02的系统例程
linux 2.6.16以后使用的方式:
指令中的24位立即数被忽略,用户请求的服务类型由寄存器R7的值决定,参数通过其他的通用寄存器传递。例如:
MOV R7, #12
SWI 0

每个系统调用都具有唯一的一个系统调用功能号  alps\kernel\arch\arm\include\asm\Unistd.h
系统调用列表,执行系统调用时,内核根据系统调用号来索引系统调用列表,找到入口函数并运行之。对应的文件是alps\kernel\arch\arm\kernel \entry-common.S
和alps\kernel\arch\arm\kernel\calls.S
接口设计相关宏  alps\kernel\include\linux\Syscalls.h
在arm linux系统中搜索某个函数在内核中系统调用的具体实现~一般搜索sys_name 或者SYSCALL_DEFINEn(name_.....

3,android上Bionic C库系统调用的实现
过程:\bionic\libc\SYSCALLS.TXT----》\bionic\libc\tools\gensyscalls.py-----》\bionic\libc\tools\arch-arm\syscall\*.s----》SWI软中端

4,如何添加系统调用
(1)\bionic\libc\SYSCALLS.TXT 中添加个接口syscall_for_test ARM_syscall_for_test
(2)运行bionic\libc\tools\gensyscalls.py:
(3)添加kernel\arch\arm\kernel\sys_syscall_for_test.c文件,加入syscall_for_test的处理:
(4)kernel\arch\arm\kernel\calls.S中添加syscall_for_test
(5)修改kernel\arch\arm\kernel\Makefile
(6)在kernel\arch\arm\kernel\ Traps.c的arm_syscall中添加ARM_syscall_for_test的处理:
(7)添加bionic\libc\include\syscall_for_test.h文件

时间: 2024-10-04 16:21:30

[linux内核]ARM-Linux系统调用的相关文章

Linux内核中添加系统调用接口简单示例

1. Linux体系结构 Linux系统的地址空间分为用户空间和内核空间,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移. 2. 系统调用接口 ① 一般情况下,用户进程不能访问内核空间.Linux内核中提供了一组用于实现各种系统功能的子程序,用户可以调用它们访问Linux内核的数据和函数,这些子程序称为系统调用接口(SCI). ② 系统调用和普通函数的区别:系统调用由操作系统内核实现,运行于内核态:普通函数调用由函数库或用户自己提供,运行于用户态. 3. 系统调用分类:主要分3大类 ①

Linux内核分析——扒开系统调用的三层皮(上)

马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 1.用户通过库函数与系统调用联系起来. 2.在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态.而在相应的低级别执行状态下代码的掌控范围受到限制.只能在对应级别允许的范围内活动. 3.intel x86 CPU有四种不同的执行级别0-3.Linux只取两种,0级

linux内核学习之四 系统调用

一  概念区分 提到linux系统调用,不得不区分几个比较容易混淆的概念: 系统调用:系统调用就是一种特殊的接口.通过这个接口,用户可以访问内核空间.系统调用规定了用户进程进入内核的具体位置. 应用程序接口(API,Application Programming Interface):是一些预定义的函数.API提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节. c库:c库实现了linux的主要API,包括标准的C库函数和系统调用.同时lin

linux内核分析——扒开系统调用的三层皮(下)

20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验目的: 通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 实验原理: 系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中.(软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的.)IN

编译 linux 内核及添加系统调用

后面编译的是 4.2.2 在 gcc4.8 上编译4.14.14 时报不支持堆栈保护 反正都差不多就先编译了 4.2.21.下载 linux 内核源码2.解压放到 /usr/src3.创建软连接 (不一定非得打文件放到 /usr/src 看个人我直接放桌面) [email protected]:~# cd /usr/src [email protected]:/usr/src# ls linux-4.14.14 linux-headers-4.2.0-27-generic linux-heade

2019-举例跟踪分析Linux内核5.0系统调用处理过程

简介 学号520 实验环境基于ubuntu18.04 选择系统调用号20 getpid()分析 实验目的 学会使用gdb工具跟踪linux内核函数调用 学会使用C代码和嵌入式汇编使用系统中断 分析system_call中断处理过程 实验步骤 1.下载linux5.0.1内核并编译 wget https://mirrors.aliyun.com/linux-kernel/v5.x/linux-5.0.1.tar.xz xz -d linux-5.0.1.tar.xz tar -xvf linux-

分析Linux内核5.0系统调用处理过程

学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.02.qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img3.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析https://github.com/mengning/menu4.给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中

linux内核编程入门--系统调用监控文件访问

参考的资料: hello world   https://www.cnblogs.com/bitor/p/9608725.html linux内核监控模块——系统调用的截获  https://www.cnblogs.com/lxw315/p/4773566.html 实现: 实验目的: 内核模块的编写:完成一个Linux/Windows内核/驱动模块的编写, 能够实现对文件访问的监控.或者对键盘设备.USB设备.网络设备. 蓝牙设备等的监控. 实验内容: 通过linux内核模块编程,写一个模块使

Linux 内核概述 - Linux Kernel

Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 C 语言重写了 Unix 系统后,大量的Unix衍生版本开始出现,许多公司把 unix 移植到新的机型上,开发者们都按照自己的方式不断增强系统的功能.Unix 系统设计简洁并在发布时提供源代码,所以许多团体都对其进行了进一步的开发.加州大学伯克利分校便是其中影响最大的一个.在BSD基础上,很多厂商也

《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁

20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB  task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件.进程优先级信息 操作系统管理的三个功能: 1.进程管理 2.内存管理 3.文件系统 Linux进程的状态: 进程状态分析: long state是进程的运行状态,-1是未执行,0是执行中,大于0则是暂停: *stack 是建立一个内核堆栈: flags 是定义了每个进程的标识符: list_head