Linux——操作系统启动——kernel使用的通常函数和宏

一、常用宏/结构体/函数

1.1 结构体

linux kernel代码中一般大写加括号的形式基本都是宏。

  1. IS_ERR
    用于判断指针函数的返回值是否为错误码,如果是,则表示该指针函数执行失败
  2. PTR_ERR
    用于将指针型的错误码转换为长整型的

1.2 宏

1.3 函数

  1. wait_for_completion
    先将x->wait加入到等待队列,在检查done的值,如果为0 ,则死循环卡住。推出循环后,则done
    如果驱动程序要在执行后面操作之前等待某个过程的完成,它可以调用wait_for_completion ,以要完成的事件为参数

  2. device_register
    向系统注册设备,
    详细参考:device_register分析

二、fs相关

2.1 结构体

2.2 宏

2.3 函数

2.3.1 功能函数

  1. ksys_open
    调用do_sys_open(),实现打开文件的功能
    详细参考链接:详解sys_open

2.3.2 底层函数

  1. getname
    将文件名从用户空间拷贝到内核空间

  2. putname
    将文件名从内核空间拷贝到用户空间

  3. get_unused_fd_flags
    用于获取尚未占用的文件描述符,
    在Linux进程中,一个文件描述符唯一地表示一个打开的文件,而打开的文件使用struct file结构体来表示,简单地说,文件描述符就是struct file指针数组的索引。该指针数组保存在进程结构体struct task_struct的(struct files_struct *)files成员中。

  4. put_unused_fd
    用于获取已占用的文件描述符

三、exec相关

3.1 结构体

3.2 宏

  1. linux_binprm
    保存要执行的文件相关的信息, 包括可执行程序的路径, 参数和环境变量的信息
  2. linux_binfmt
    inux支持其他不同格式的可执行程序, 在这种方式下, linux能运行其他操作系统所编译的程序, 如MS-DOS程序, 活BSD Unix的COFF可执行格式, 因此linux内核用struct linux_binfmt来描述各种可执行程序。
    所有的linux_binfmt对象都处于一个链表中, 第一个元素的地址存放在formats变量中, 可以通过调用register_binfmt()和unregister_binfmt()函数在链表中插入和删除元素, 在系统启动期间, 为每个编译进内核的可执行格式都执行registre_fmt()函数. 当实现了一个新的可执行格式的模块正被装载时, 也执行这个函数, 当模块被卸载时, 执行unregister_binfmt()函数.

3.3 函数

3.3.1 功能函数

  1. do_execve
    该函数实现可执行程序的加载和运行。调用do_execveat_common > __do_execve_file() > exec_binprm > search_binary_handler() > load_elf_binary()
    详细参考链接: do_execve

3.3.2 基础函数

  1. __do_execve_file()
  • unshare_files() 调用unshare_files()为进程复制一份文件表
  • do_open_execat() 调用open_exec()查找并打开二进制文件
  • sched_exec() 找到最小负载的CPU,用来执行该二进制文件
  • 填充structlinux_binprm结构体中的file、filename、interp成员
  • bprm_mm_init() 创建进程的内存地址空间,并调用init_new_context()检查当前进程是否使用自定义的局部描述符表
  • 填充structlinux_binprm结构体中的命令行参数argv,环境变量envp
  • prepare_binprm() 检查该二进制文件的可执行权限;最后,kernel_read()读取二进制文件的头128字节(这些字节用于识别二进制文件的格式及其他信息,后续会使用到)
  • copy_strings_kernel() 从内核空间获取二进制文件的路径名称
  • 调用两次copy_strings(),此时二进制文件已经被打开,struct linux_binprm结构体中也记录了重要信息,
  • exec_binprm() 识别该二进制文件的格式并最终运行该文件

四、mutex相关

同步机制,可参考链接:link

4.1 结构体

  1. mutex

4.2 宏

  1. mutex_lock
  2. mutex_unlock
    解锁
  3. mutex_init

4.3 函数

你可能感兴趣的:(Linux,linux)