zoukankan      html  css  js  c++  java
  • Linux嵌入式 -- 内核

    1. 系统调用 定义

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

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


    2. 系统调用原理

    #include<time.h>
    main()
    {
    time_t the_time;
    the_time=time((time_t *)0);/*调用time系统调用*/
    printf("The time is %ld ",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);
    }


  • 相关阅读:
    操作~拷贝clone()
    属性/css~储存
    属性/css~位置.offset()&offsetParent()&position()&scrollTop()&scrollLeft()
    属性/css~尺寸.height()
    设置,获取,删除cookie方法
    Cookie
    属性/css~css.css()
    Python井字游戏
    Asp.net vNext 学习之路(三)
    使用C#发送Http 请求实现模拟登陆(以博客园为例)
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648230.html
Copyright © 2011-2022 走看看