LKD: Chapter 5 System Call

  在Linux中,处理器所作的事可以归纳为3种情况:

1、In user-space, executing user code in a process;

2、In kernel-space, in process context, executing on behalf of a specific process;

3、In kernel-space, in interrupt context, not associated with a process, handling an interrupt.

  而在user-space中想要和内核交互的唯一办法就是通过system call,简称syscall。

System Call Implementation:

  A meme related to interfaces in Unix is "Provide mechanism, not policy."

  参数检测:内核代码不应随意接受指向user-space的指针,此时必须使用一下两种方法中的一种来检测。

    1、写入user-space时,使用copy_to_user();

    2、从user-space读入时,使用copy_from_user()。

下面来尝试实现一个system call:

  1、首先在arch/x86/ia32/ia32entry.S最后添加上自己的syscall:

  可见我们这里sys_foo的编号是337。

  2、在arch/x86/include/asm/unistd_32.h中定义syscall number:

  这里出了点意外,不知下面怎么多了两行#ifdef .... #define ...,还把我的337给用了在前面添加我的#define __NR_foo   337后,将后面NR_syscalls的337改成338.  

  3、最后,我们在kernel/sys.c中定义实际的foo()这个syscall:

  这就算完成了。

  接着编译安装内核:

# cd linux-2.6.32.68
# make menuconfig(按默认配置就行)# make all(要等超级久的啊。。)# make modules_install# make install# update-grub# reboot

  结果编译不通过,才明白在第3步kernel/sys.c中添加的代码不应该在开头添加。将其移动到最后后,继续编译!

  可是昨晚已经弄到了23点多了,干脆睡觉去了。一早醒来提示说磁盘空间不够了。对于virtualbox的vdi映像,可以用如下命令扩容:

VBoxManage modifyhd "cloned.vdi" --resize 16000  //这里的单位是M

  但是我一直觉得centos不太满足我的要求,所以索性重装了个ubuntu 14.04,虚拟机就是方便!

  接下来我们要从user-space中调用这个syscall。我们通过linux提供的macros来包装这个syscall。

  这些macros命名为_syscalln(),其中最后一个n是指参数个数,在0到6间。

  新建文件test.c:

#define __NR_foo 337
__syscall0(long, foo)

int main()
{
    long stack_size;

    stack_size = foo();
    printf("The kernel stack size is %ld\n", stack_size);

    return 0;
}

  编译显示__syscall0那里出错了:unknown type name ‘foo‘

  网上查是说syscall0这个macro已经过时了,使用syscall()代替。

  成功调用了syscall:

  但是我虚拟机中的ubuntu不知怎么不能和宿主机共享剪贴板,干脆再装个32位的fedora23算了。

时间: 2024-11-08 18:24:51

LKD: Chapter 5 System Call的相关文章

LKD: Chapter 9 An Introduction to Kernel Synchronization

This chapter introduces some conception about kernel synchronization generally. Critical Regions: Code paths that access and manipulate shared data. Race Condition: Two threads of execution to be simultaneously executing within the same critical regi

LKD: Chapter 8 Bottom Halves and Deferring Work

In 2.6.x, there are 3 mechanisms for implementing a bottom half: softirqs, tasklets and work queues. Here's the comparison: Softirqs: Softirqs are statically allocated at compile time. It is represented by the softirq_action structure, which is defin

LKD: Chapter 6 Kernel Data Structures

这一章我们研究四种主要的数据结构: linked lists, queues, maps, binary trees. Linked Lists:(<linux/list.h>) 在linux中,并不是直接将某个结构体作为链表的节点,而是在该结构中插入一个链表的节点.借助container_of()这个宏,我们可以轻松的找到包含给定成员变量的父结构. Linux kernel中一般使用的是循环双链表. 正常遍历使用的是list_for_each()宏,但是当遍历过程中删除某个表项时就有可能出错

jfinal微信支付

private static final String appid = PropKit.get("appid"); //应用ID private static final String mch_id = PropKit.get("mch_id"); //商户号 private static final String paternerKey = PropKit.get("paternerkey"); //支付密钥 private static fi

Django Templates

二分春色到穷阎,儿女祈翁出滞淹.幽蛰夜惊雷奋地,小窗朝爽日筛帘. 惠风全解墨池冻,清昼胜翻云笈签.亲友莫嗔情话少,向来屏息似龟蟾. 料峭寒犹薄,阴云带晚烟. 雨催惊蛰候,风作勒花开. 日永消香篆,愁浓逼酒船. 为君借余景,收拾赋新篇. 作者:小亲姐姐来源链接:http://www.qbaobei.com/jiaoyu/407464.html来源:亲亲宝贝著作权归作者所有. 料峭寒犹薄,阴云带晚烟. 雨催惊蛰候,风作勒花开. 日永消香篆,愁浓逼酒船. 为君借余景,收拾赋新篇. 作者:小亲姐姐来源链

Cracking the coding interview汇总目录

很久之前刷的CTCI的题目,都快忘记了,做个分类汇总,再重新好好复习一遍. Chapter 1 | Arrays and Strings 1.1 Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures? 1.2 Write code to reverse a C-Style String. (C-Str

【设计模式】建造模式

引子 前几天陪朋友去装机店攒了一台电脑,看着装机工在那里熟练的装配着机器. 作为装机工,他们不用管你用的 CPU 是 Intel 还是 AMD,也不管你的显卡是 2000 千大元还是白送的,都能三下五除二的装配在一起. 一台 PC 就诞生了! 当然对于客户来说,你也不知道太多关于 PC 组装的细节. 这和建造模式是多么的相像啊! 定义与结构 GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话说得很抽象,不好理解,其实它的意思可以理解为:

xml 深入学习

参考:http://blog.csdn.net/erlian1992/article/details/51569678 专业术语 DTD document type defination 文档类型定义 PCDATA parsed character data 已解析字符数据 XSD xml shcema Defination XML模型定义 1.简介 xml 可扩展标记语言 Extensible Markup Language XML的设计宗旨是传输数据,而非显示数据 和html 的差异 1.x

设计模式之生成器模式

GOF对生成器模式的描述为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.感觉这是创建型模式中最难理解的一个,参考了<Java与模式>一书,在这本书中,作者侧重描述一个产品不同内部表象(也就是零件)的创建,他在"众神造人"一例中,将"人"划分为"灵魂"."臂手"."耳目"等部件,当这些部件均被创建好后,一个"人"才算是被创建好,总觉的他的示例与GO