linux内核增加系统调用--Beginner's guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态。 一般的,进程是不能访问内核的,它不能访问内核所占用内存空间也不能调用内核函数。这被称为保护模式。为了和用户空间上运行的进程进行交互,内核提供一组接口。通过该接口应用程序可以访问硬件设备和其他操作系统资源。
实际上提供这组接口主要是为了保证系统稳定可靠,避免应用程序肆意妄为。 系统调用在用户空间和硬件设备之间添加一个中间层,也使得用户的应用程序可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统是什么类型。这方便了应用程序的可移植性。 在linux中系统调用是用户空间访问内核的唯一手段,除了异常和中断外。
一般情况下,应用程序通过应用程序接口API而不是直接通过系统调用来编程。因为应用程序使用的这种编程接口实际上并不需要和内核提供的系统调用一一对应。一个API接口可以实现成一个系统调用,也可以通过调用多个系统调用实现,也可以不使用任何系统调用。程序员可以不考虑系统调用而直接和API打交道。
系统调用:内核为用户进程提供的服务 提供用户模式的进程和硬件设备的接口; 保护对内核所管理的资源的访问,提高系统安全; 提高程序的可移植性; Linux系统调用在内核中全部以“sys_”开头,如sys_fork, sys_exit.
本文以内核版本为3.13.10为例演示hello world等级的调用,先看需要编译内核的系统调用
1.在kernel/sys.c中添加头文件#include<linux/linkage.h> 文件末尾添加自定义的系统调用函数:sys_mycall
内核版本为3.13.10
-->

2.在arch/x86/syscalls/syscall_64.tbl (32位系统则改为32)添加自定义系统调用号(在本人的机子上按顺序接下来是314)

3.在arch/x86/include/asm/syscalls.h中添加自己的系统调用函数声明
asmlinkage long sys_mycall(int num);
4.内核编译
记得加上-j4等来加快速度(即使是在第二次编译没有清理原目标文件的情况下也很耗时间(磁盘IO很耗时,固态硬盘应该很快吧)
5.编写用户态测试程序
int main(){ printf("The return value is:%d.\n",syscall(314,1234567)); return 0;}
编译为test_hello
6.测试
你可以更新内核,修改系统的启动项等。还可以使用虚拟机来测试,下面使用QEMU来测试(简便而且强大,可指定内核和文件系统来启动)
ubuntu下可从源下载QEMU,可顺便下一个linux-0.2 (wget wiki.qemu.org/download/linux-0.2.img)
然后将test_hello放到测试系统中,也许你想直接在测试系统中直接编译出test_hello,如果你没有现成的装有编译器的可测试系统,可用busybox来编译一个根文件系统
下面列出粗略步骤(但未包含编译工具及链接库):
make menuconfig时在Build Options选Build BusyBox as a static binary (no shared libs)确保不会对共享库产生依赖。
执行make CONFIG_PREFIX=your/dir install 将安装到制定目录,如rootfs/
dd if=/dev/zero of=rootfs.img bs=10240k count=1
mkfs -t ext3 rootfs.img
sudo mount -t ext3 -o loop rootfs.img rootfs
拷贝busybox到rootfs.img,将你的测试程序编译为静态的(gcc -static)拷贝至rootfs.img
$ cd rootfs
$ sudo mkdir dev
创建常用device(mknod 用于制作字符或块相关文件):
$ sudo cd dev
$ sudo mknod tty0 c
$ sudo mknod tty1 c
$ sudo mknod tty2 c
$ sudo mknod tty3 c
$ sudo mknod console c
$ sudo mknod null c
创建init启动脚本
/etc/inittab文件
$ sudo mkdir etc
$ cd etc/
$ sudo vim inittab
#This is the first script to run when startup
::sysinit:/etc/rc.d/rc.sysinit
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
$ sudo mkdir rc.d
$ cd rc.d/
$ sudo vim rc.sysinit
加入以下内容:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/bin/sh
$ sudo chmod a+x rc.sysinit
$ cd ../../../
根文件系统制作完成,umount rootfs
$ sudo umount rootfs.img
准备就绪,现在可以开始带根文件系统跑内核
qemu-system-x86_64 -hda rootfs.img -kernel /boot/vmlinuz-3.13.10 --append root=/dev/sda m=256 (看你的情况使用不同的命令)
可以看到linux在quem上跑起来了(刚启动可能需要回车才显示命令提示符,文件系统若是只读的可用mount -o rw,remount /重挂载,若启动时提示init等文件不可执行是你没有赋予它可执行权限。执行测试程序,下图中的call_static(执行时需要写全路径)。

linux内核增加系统调用--Beginner's guide的更多相关文章
- linux内核增加系统调用--Beginner‘s guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...
- 给Linux内核增加一个系统调用的方法(转)
作者:chenjieb520 给Linux内核增加一个系统调用的方法 为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...
- Linux之增加系统调用[内核编译]
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 由于操作系统实验的缘故,有一个实验需要 ...
- 向linux内核增加一个系统调用-2(利用proc打印信息)
添加系统调用,打印/proc中的系统信息 前面关于proc和内核态函数的东西可以对比代码来看. 参考 http://blog.csdn.net/kylin_fire_zeng/article/deta ...
- 深入理解Linux内核-系统调用
系统调用:用户态进程向内核发出的,实现用户态进程调用硬件设备的函数或者中断:优点:使编程更容易,将用户从学习硬件设备的低级编程特性中解放:提高系统到安全性,内核在满足请求之前可以做正确性检查:提高可移 ...
- 向linux内核增加一个系统调用-1
验证编辑编译内核的流程,并增加新的系统调用 注意:需要/目录至少10GB空间,/boot目录500MB空间 下载内核并解压 kernel下载 百度云搬运 密码: qc8b 进入 /usr/src目录 ...
- 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程
一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...
- 向linux内核加入系统调用新老内核比較
2.6内核 1>改动linux-source-2.6.31/kernel/sys.c文件,在文件末尾加入系统响应函数.函数实现例如以下: asmlinkage int sys_mycall(in ...
- linux内核之系统调用nanosleep与pause()
nanosleep()使得进程进入睡眠状态,指定时候后唤醒进程,sleep()基于其实现 asmlinkage long sys_nanosleep(struct timespec *rqtp, st ...
随机推荐
- [朴孝敏][Sketch]
歌词来源:http://music.163.com/#/song?id=406907303 作曲 : Ryan S. Jhun/August Rigo/Denzil Remedios [作曲 : Ry ...
- 在 Linux 下执行安装 bin 文件
原文: http://www.linuxidc.com/Linux/2014-03/98541.htm
- Daily Scrum 1 --团队项目所需时间估计以及任务分配
考虑到所有的任务不可能逐一细化分配给成员,我们将需要完成的任务进行了大致的分配.任务所需要的具体实现可以参看<学霸网站NABC> 所需要的总时间一共为44h. 我们会在以后的每日任务中进行 ...
- stateful openflow------整理openstate原理以及具体应用
openstate基本思想就是控制器下放一部分功能,交换机不再是简单的dumb,而是保留一些简单的wise. 论文中以端口锁定为例,提出了米粒型状态机在交换机内部的应用从而可以大大减少交换机和控制器之 ...
- MAVEN教程--01安装|创建|解释
Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xm ...
- UVA - 11021 Tribles 概率dp
题目链接: http://vjudge.net/problem/UVA-11021 Tribles Time Limit: 3000MS 题意 有k只麻球,每只活一天就会死亡,临死之前可能会出生一些新 ...
- 我是IT小小鸟读后感
<我是一只IT小小鸟>一只是我想读list中一个本,但是上次去当当买的时候,竟然缺货了...昨天监考,实在无聊,就上网看电子书了,一天就看完了,看得有点仓促,所以理解估计不深. 1.刘帅: ...
- 安装mysql后遇到的一些问题
我们安装好了mysql(cnetos7上是安装mariadb)后,出现如下图所示的问题,我们可以用netstat -lntup查看以下服务器的端口,mysql的端口一般默认为 3306,查看服务是否启 ...
- Android bp语法介绍
参考网址: http://note.qidong.name/demo/soong_build/ 谷歌官网文档: https://android.googlesource.com/platform/bu ...
- MFC各种属性设置
在使用MFC的时候经常需要对例如对话框的外观进行一些设置.MFC哪些属性的含义和设置可以参照博客: http://www.cnblogs.com/lzmfywz/archive/2012/04/20/ ...