Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189277
  • 博文数量: 39
  • 博客积分: 1007
  • 博客等级: 准尉
  • 技术积分: 513
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-15 09:15
文章分类

全部博文(39)

文章存档

2012年(2)

2011年(37)

分类: LINUX

2011-04-13 12:45:47

设备驱动程序的作用:
  1. 连接硬件和软件,让软件操作硬件。编写驱动时要区分机制和策略。机制:需要提供什么功能。策略:如何使用这些功能。
 
内核功能划分:
  1. 进程管理
  2. 内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道, 或者进程间通讯原语)对整个系统功能来说是基本的, 也由内核处理. 另外, 调度器, 控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个 CPU 之上的抽象.
  3. 内存管理
  4. 计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的. 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间. 内核的不同部分与内存管理子系统通过一套函数调用交互, 从简单的 malloc/free 对到更多更复杂的功能.
  5. 文件系统
  6. Unix 在很大程度上基于文件系统的概念; 几乎 Unix 中的任何东西都可看作一个文件. 内核在非结构化的硬件之上建立了一个结构化的文件系统, 结果是文件的抽象非常多地在整个系统中应用. 另外, Linux 支持多个文件系统类型, 就是说, 物理介质上不同的数据组织方式. 例如, 磁盘可被格式化成标准 Linux 的 ext3 文件系统, 普遍使用的 FAT 文件系统, 或者其他几个文件系统.
  7. 设备控制
  8. 几乎每个系统操作最终都映射到一个物理设备上. 除了处理器, 内存和非常少的别的实体之外, 全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行. 这些代码称为设备驱动. 内核中必须嵌入系统中出现的每个外设的驱动, 从硬盘驱动到键盘和磁带驱动器. 内核功能的这个方面是本书中的我们主要感兴趣的地方.
  9. 网络
  10. 网络必须由操作系统来管理, 因为大部分网络操作不是特定于某一个进程: 进入系统的报文是异步事件. 报文在某一个进程接手之前必须被收集, 识别, 分发. 系统负责在程序和网络接口之间递送数据报文, 它必须根据程序的网络活动来控制程序的执行. 另外, 所有的路由和地址解析问题都在内核中实现.
 
 
可装载模块:
  1. Linux在内核运行时可以向内核添加功能(insmod……rmmod)
 
核心模块与应用程序对比:
  1. 应用程序:从头到尾执行单个任务,退出时可不管资源的释放或其它清除工作,可调用它并未定义的函数,
  2. 核心模块:预先注册自己以便服务于将来某个请求,退出时要仔细撤销初始化函数所做的一切,仅能调用由内核导出的函数
  3. 重要不同点:各环境下处理错误方式不同,应用程序开发过程中的段错误无害,可以用跟踪调试器追踪问题所在,而内核错误即使不影响整个系统,也会杀死当前进程。

 

将模块链接到内核:

 

用户空间和内核空间:

  1. 模块运行在内核空间,应用程序运行在用户空间,这两种模式具有不同的优先权等级

 

内核中的并发:

  1. 同一时刻,可能会有许多事情正在发生。Linux系统中通常正在运行多个并发进程,且可能多个进程同时使用我们的驱动程序。大多数设备能够中断处理,而中断处理程序异步运行,且可能驱动程序试图处理其它任务时被调用。有一些软件抽象(如内核定时器)也在异步运行。Linux还可运行在对称多处理器(Symmetric multiprocessor,SMP)系统上,可能不止一个CPU运行我们的驱动程序。linux内核代码(包括驱动程序代码)必须是可重入的,能同时运行在多个上下文中。如编写代码中不注意并发问题,将导致很难调试的灾难性错误

 

当前进程:

  1. 内核代码可通过访问全局项current来获得当前进程。current在中定义,指向struct task_struct的指针,而task_struct结构在中定义。current指向当前正在运行的进程。打印当前进程ID和命令名:
  1. printk(KERN_INFO "The process is \"%s\"(pid %i)\n",current->comm,current->pid);

 

其它细节:

  1. 应用程序在虚拟内存中布局,并具有一块很大的栈空间,栈是用来保存函数调用历史及当前活动函数中的自动变量的,相反内核具有非常小的栈,我们自己的函数和整个内核空间调用链一同共享这个栈。故,声明大的自动变量不太好,若要大的结构,可调用时动态分配该结构。前缀是"__"的函数名称通常是接口的底层组件,应慎用!内核代码不能实现浮点运算。

版本依赖:

 

阅读(3601) | 评论(0) | 转发(1) |
0

上一篇:Hello World

下一篇:一首歌

给主人留下些什么吧!~~