1. 系统调用 定义

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。

系统调用和普通的函数调用非常相似,区别仅仅在于,系统调用由操作系统内核实现,运行于内核态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

2. 系统调用原理

#include<time.h>

main()

{

time_t the_time;

the_time=time((time_t *)0);/*调用time系统调用*/

printf("The time is %ld\n",the_time);

} /* 从格林尼治时间1970年1月1日0:00开始到现在的秒数。 */

工作原理 :一般情况下,用户进程是不能访问内核的。它既不能访问内核所在的内存空间,也不能调用内核中的函数。系统调用是一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置:v在Intel
CPU中,这个指令由中断0x80实现。在ARM中,这个指令SWI。

3. 实现系统调用

向内核中添加新的系统调用,需要执行 3 个步骤:

1. 内核代码 kernel/sys.c 中 添加新的内核函数

2. 更新头文件 unistd.h, 在arch/arm/include/asm/unistd.h 中添加编号, #define __NR_add (__NR_SYSCALL_BASE+361)

3. 针对这个新函数更新系统调用表 ,arch/arm/kernel/calls.S 指向新的系统调用函数:CALL(sys_add);

重新编译内核 使用!!

示例程序:

1. 在kernel/sys.c中添加函数:

asmlinkage int sysMul(int a, int b)

{

intc;

c =a*b;

returnc;

} /* asmlinkage:使用栈传递参数 */

2. 在arch/arm/include/asm/unistd.h中添加如下代码:
#define __NR_sysMul 361

3.在arch/arm/kernel/calls.S中添加代码,指向新实现的系统调用函数:CALL(sysMul)

4. 使用系统调用

#include <stdio.h>

#include <linux/unistd.h>

main()

{

int result;

result = syscall(361,1, 2);

printf("result = ", result);

}

Linux嵌入式 -- 内核 - 系统调用的更多相关文章

  1. Linux嵌入式 -- 内核 (arm) & 文件系统

    1. make distclean 2. 配置内核  ----> 生成 .config文件 make menuconfig ARCH=arm Makefile文件分析: 3.  编译内核 mak ...

  2. Linux嵌入式 -- 内核简介(x86)

    0. 嵌入式系统 以应用为中心,软硬件可裁剪,对功耗.对体积.对成本等都有严格要求的专用计算机系统. 1.  linux体系结构 2. 为什么 划分为 用户空间 和 内核控件 ?  分两级,内核和应用 ...

  3. Linux嵌入式 -- 内核 - 进程控制 和 调度

    1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...

  4. Linux嵌入式 -- 内核 - 内存管理

    1.  逻辑地址 线性地址 物理地址 段式管理: 16位CPU,20根地址总线,可寻址1M内存,但是只有16位的寄存器,64K. 逻辑地址  =  段基地址 + 段内偏移地址 物理地址 PA  = 段 ...

  5. Linux嵌入式 -- 内核 - proc文件系统

    1. 什么是proc文件系统? 实例:通过 /proc/meminfo,查询当前内存使用情况. 结论:proc文件系统是一种在用户态检查内核状态的机制. 2.Proc文件分类 特点  每个文件都规定了 ...

  6. Linux嵌入式 -- 内核 - 内核定时器

    1.  度量时间差 时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000(每 ...

  7. Linux嵌入式 -- 内核 - 内核链表

    1. linux内核链表 链表数据结构的定义: struct list_head  {  struct list_head *next, *prev;  };  list_head结构包含两个指向li ...

  8. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  9. Linux内核-系统调用

    Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...

随机推荐

  1. BUFSIZ解析

    BUFSIZ解析: 包含在#include<stdio.h>中,BUFSIZ[=8192]. stdio.h:#ifndef BUFSIZ stdio.h:#define BUFSIZ _ ...

  2. 《从零开始学Swift》学习笔记(Day 46)——下标重写

    原创文章,欢迎转载.转载请注明:关东升的博客 下标是一种特殊属性.子类属性重写是重写属性的getter和setter访问器,对下标的重写也是重写下标的getter和setter访问器. 下面看一个示例 ...

  3. 2018.10.24-day3 python总结

    昨日回顾:1.while2.运算符3.初始编码4.补充p2和p3的区别 Python2 (1) 今日学习目录1.整型 int() 2.布尔值 bool() 3.字符串详解 4. for循环

  4. 学习 NGINX

    At a high level, configuring NGINX Plus as a web server is a matter of defining which URLs it handle ...

  5. javascript数组遍历for与for in区别详解

    js中遍历数组的有两种方式 复制代码代码如下: var array=['a']//标准的for循环for(var i=1;i<array.length;i++){    alert(array[ ...

  6. mock数据(模拟后台数据)

    mock数据(模拟后台数据) - Emily恩 - 博客园 https://www.cnblogs.com/enboke/p/vue.html Mock.js http://mockjs.com/ 前 ...

  7. Markov Process

    w Markov Process -- from Wolfram MathWorld  http://mathworld.wolfram.com/MarkovProcess.html 谷歌背后的数学_ ...

  8. standard pbr(三)-BRDF

    // Default BRDF to use: #if !defined (UNITY_BRDF_PBS) // allow to explicitly override BRDF in custom ...

  9. UML初览(转)

    原文:UML初览 本章使用一个简单的例子对UML中所使用的概念和视图进行初览.本章的目的是要将高层UML概念组织成一系列较小的视图和图表来可视化说明这些概念,说明如何用各种不同的概念来描述一个系统以及 ...

  10. python模块学习(二)

    configparser模块 软件常见文档格式如下: [DEFAULT]ServerAliveInterval = 45Compression = yesCompressionLevel = 9For ...