zoukankan      html  css  js  c++  java
  • Linux内核之系统调用

    Linux内核之系统调用

    1. 应用程序通过API而不是直接调用系统调用来编程;

    2. getpid()系统调用示例:

    asmlinkage long sys_getpid(void)

    {

        return current->tgid;

    }

        asmlinkage 编译器仅从栈中提取参数

        系统调用的命名规则:sys_syscallname()

    3. 每个系统调用都对应一个唯一的系统调用号,如果系统调用被删除,但它占用的系统调用号不回收。

    4. 系统调用通过软中断实现(int $0x80),通过引发一个异常陷入懂啊内核态去执行异常处理程序system_call。最近的x86处理器已经支持了sysenter指令。

    5. 参数和返回值通过寄存器来传递。

    6. 指针参数的合法性验证:

    (1)指针指向的内存区属于用户空间;

    (2)指针指向的内存区在进程的地址空间里;

    (3)指针指向的内存区必须被标记为可读(读)/可写(写)。

    系统提供了两个方法来完成内核空间与用户空间的数据拷贝:copy_to_user()和copy_from_user()。

    7. 内核执行系统调用的时候处于内核上下文,此时内核可以休眠并可以被抢占。

    8. 系统调用必须编译进内核映像,不能编译成模块。

    9. 通常通过C库来使用系统调用(包含头文件并链接相应的库),但也可以通过宏来直接访问系统调用,如open()的调用:

    先通过下面的宏将系统调用扩展为内嵌汇编的C函数:

        #define_NR_open 5

        _syscall3(long, open, const char*, filename, int, flags, int, mode)

    这样,应用程序就可以直接使用open()了。

  • 相关阅读:
    DWVA系列-2-csrf Medium等级 绕过refer的csrf 有点小曲折
    DWVA系列-2-csrf low等级
    DWVA系列-1-brute Impossible等级 预防SQL注入 一次性token+预编译
    DWVA系列-1-brute medium等级
    DWVA系列-1-brute low等级
    获取SD卡剩余容器
    MD5Encoder
    本地缓存
    内存缓存
    网络缓存
  • 原文地址:https://www.cnblogs.com/feisky/p/2284060.html
Copyright © 2011-2022 走看看