Linux嵌入式 -- 内核 - 系统调用
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嵌入式 -- 内核 - 系统调用的更多相关文章
- Linux嵌入式 -- 内核 (arm) & 文件系统
1. make distclean 2. 配置内核 ----> 生成 .config文件 make menuconfig ARCH=arm Makefile文件分析: 3. 编译内核 mak ...
- Linux嵌入式 -- 内核简介(x86)
0. 嵌入式系统 以应用为中心,软硬件可裁剪,对功耗.对体积.对成本等都有严格要求的专用计算机系统. 1. linux体系结构 2. 为什么 划分为 用户空间 和 内核控件 ? 分两级,内核和应用 ...
- Linux嵌入式 -- 内核 - 进程控制 和 调度
1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...
- Linux嵌入式 -- 内核 - 内存管理
1. 逻辑地址 线性地址 物理地址 段式管理: 16位CPU,20根地址总线,可寻址1M内存,但是只有16位的寄存器,64K. 逻辑地址 = 段基地址 + 段内偏移地址 物理地址 PA = 段 ...
- Linux嵌入式 -- 内核 - proc文件系统
1. 什么是proc文件系统? 实例:通过 /proc/meminfo,查询当前内存使用情况. 结论:proc文件系统是一种在用户态检查内核状态的机制. 2.Proc文件分类 特点 每个文件都规定了 ...
- Linux嵌入式 -- 内核 - 内核定时器
1. 度量时间差 时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000(每 ...
- Linux嵌入式 -- 内核 - 内核链表
1. linux内核链表 链表数据结构的定义: struct list_head { struct list_head *next, *prev; }; list_head结构包含两个指向li ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- Linux内核-系统调用
Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...
随机推荐
- CodeIgniter框架——CI的执行流程
应用程序流程图 CodeIgniter执行流程 源码分析——CI到底做了些什么 (由welcome的例子出发——讲解index.php——讲解CodeIgniter.php) (load_class的 ...
- Win7系统安装 MySQL 5.7.23
1. 下载 MySQL 5.7版本:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2. 解压到指定文件夹,mysql根目录下创建my ...
- SharePoint server 2016中文版导出list template,在另外一个环境不能显示
SharePoint server 2016中文版导出list template,在另外一个环境不能显示,解决方案: $web = Get-SPWeb <url of web> $web. ...
- BigDecimal使用整理
BigDecimal使用整理 一. BigDecimal简介 计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigD ...
- 我的Android进阶之旅------>Android使用cmd窗口进行adb logcat时出现中文乱码问题的解决办法
今天用CMD命令进行adb logcat时显示一堆的乱码,乱码如下: C:\Users\Administrator>adb logcat -s logcat --------- beginnin ...
- Python实现下载进度
# encoding:utf-8 import urllib import os def Schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 '' ...
- Kafka配置参数说明
配置文件目录:/usr/local/kafka/config配置文件server.propertis参数说明:broker.id=0每一个broker在集群中的唯一标识,要求是正数,当该服务器的IP地 ...
- oracle 函数 截取 连接 替换 判断
一个处理不规范日期的函数,廖记一下吧,以免再忘. --注意全角半角 CREATE OR REPLACE function f_str2form( date_string in varchar2 ) r ...
- 【转】Python爬虫(5)_性能相关
爬虫性能相关 一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,采用串行的方式执行,只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是: ...
- Java进阶学习:将文件上传到七牛云中
Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...