【无标题】

一、内核空间和用户空间

为了彻底解决一个应用程序出错不影响系统和其它app的运行,操作系统给每个app一个独立的假想的地址空间,这个假想的地址空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中固定的一部分,32位Linux的虚拟地址空间大小为4G,并将其划分两部分:

  1. 0~3G 用户空间 :每个应用程序只能使用自己的这份虚拟地址空间

  2. 3G~4G 内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中的某些空间进行数据通信

实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才进行实际的内存读写

二、执行流

执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文

计算机系统中的执行流的分类:

执行流:

  1. 任务流--任务上下文(都参与CPU时间片轮转,都有任务五状态:就绪态 运行态 睡眠态 僵死态 暂停态)

    1. 进程

    2. 线程

      1. 内核线程:内核创建的线程

      2. 应用线程:应用进程创建的线程

  2. 异常流--异常上下文

    1. 中断

    2. 其它异常

应用编程可能涉及到的执行流:

  1. 进程

  2. 线程

内核编程可能涉及到的执行流:

  1. 应用程序自身代码运行在用户空间,处于用户态 ----------------- 用户态app

  2. 应用程序正在调用系统调用函数,运行在内核空间,处于内核态,即代码是内核代码但处于应用执行流(即属于一个应用进程或应用线程) ---- 内核态app

  3. 一直运行于内核空间,处于内核态,属于内核内的任务上下文 --------- 内核线程

  4. 一直运行于内核空间,处于内核态,专门用来处理各种异常 --------- 异常上下文

三、模块编程与应用编程的比较

不同点 内核模块 应用程序
API来源 不能使用任何库函数 各种库函数均可以使用
运行空间 内核空间 用户空间
运行权限 特权模式运行 非特权模式运行
编译方式 静态编译进内核镜像或编译特殊的ko文件 elf格式的应用程序可执行文件
运行方式 模块中的函数在需要时被动调用 从main开始顺序执行
入口函数 init_module main
退出方式 cleanup_module main函数返回或调用exit
浮点支持 一般不涉及浮点运算,因此printk不支持浮点数据 支持浮点运算,printf可以打印浮点数据
并发考虑 需要考虑多种执行流并发的竞态情况 只需考虑多任务并行的竞态
程序出错 可能会导致整个系统崩溃 只会让自己崩溃

四、内核接口头文件查询

大部分API函数包含的头文件在include/linux目录下,因此:

  1. 首先在include/linux 查询指定函数:grep 名称 ./ -r -n

  2. 找不到则更大范围的include目录下查询,命令同上

相关推荐

  1. 标题

    2023-12-07 04:48:03       43 阅读
  2. 标题

    2023-12-07 04:48:03       44 阅读
  3. 标题

    2023-12-07 04:48:03       40 阅读
  4. 标题

    2023-12-07 04:48:03       48 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 04:48:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 04:48:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 04:48:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 04:48:03       18 阅读

热门阅读

  1. a href自定义下载文件名

    2023-12-07 04:48:03       42 阅读
  2. 设计模式&委派模式(Delegate Pattern)

    2023-12-07 04:48:03       33 阅读
  3. 【LeetCode】258. 各位相加

    2023-12-07 04:48:03       36 阅读
  4. Vue中的组件通信:从子到父的数据传递

    2023-12-07 04:48:03       40 阅读
  5. C++设计模式——建造者模式(Builder)

    2023-12-07 04:48:03       44 阅读
  6. ES6拓展API

    2023-12-07 04:48:03       32 阅读
  7. Socket.D 网络应用协议,首版发布!

    2023-12-07 04:48:03       38 阅读
  8. 字符指针变量

    2023-12-07 04:48:03       38 阅读
  9. 数据结构-基数排序

    2023-12-07 04:48:03       42 阅读
  10. 利用 Python 进行数据分析实验(二)

    2023-12-07 04:48:03       40 阅读
  11. linux系统调用介绍

    2023-12-07 04:48:03       40 阅读
  12. Vue的methods中定时器的变量报错问题

    2023-12-07 04:48:03       42 阅读
  13. C++ day50 买卖股票最佳时机

    2023-12-07 04:48:03       38 阅读
  14. linux优化-平均负载率

    2023-12-07 04:48:03       37 阅读