Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1380269
  • 博文数量: 860
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-20 19:57
个人简介

对技术执着

文章分类

全部博文(860)

文章存档

2019年(16)

2018年(12)

2015年(732)

2013年(85)

2012年(15)

我的朋友

分类: LINUX

2015-03-14 15:21:35

今天学习了《linux设备驱动开发详解》第一、二、三章。主要讲了一些概述性的知识:包括开发环境的构建,硬件知识及内核编程。

 

1,linux驱动一般分为3大类: 字符设备     块设备   网络设备

 

2,开发环境构建: 交叉工具链构建  NFStftp服务器安装

 

3,驱动开发中设计到的硬件:

数字电路知识

ARM硬件知识

熟练使用万用表和示波器

看懂芯片手册和原理图

 

4,linux内核源代码目录结构:

arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。

block/: 部分块设备驱动程序;

crypto: 常用加密和散列算法(如AESSHA等),还有一些压缩和CRC校验算法;

documentation/: 文档目录,没有内核代码,只是一套有用的文档;

drivers/: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ideide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看 drivers/block/genhd.c中的device_setup()

fs/: 所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统, 例如fatext2

include/: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,include/scsi目录则是有关scsi设备的头文件目录;

init/: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.cVersion.c,这是研究核心如何工作的好的起点之一;

ipc/: 这个目录包含核心的进程间通讯的代码;

kernel/: 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/i386/kernel下;

lib/: 放置核心的库代码;

mm/:这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/i386/mm/下;

net/: 核心与网络相关的代码;

scripts/: 描述文件,脚本,用于对核心的配置;

security: 主要是一个SELinux的模块;

sound: 常用音频设备的驱动程序等;

usr: 实现了用于打包和压缩的cpio

 

5,内核的五个子系统:

进程调试(SCHED

内存管理(MM)

虚拟文件系统(VFS)

网络接口(NET)

进程间通信(IPC)

 

6,linux内核的编译:

配置内核:make menuconfig,使用后会生成一个.confiig配置文件,记录哪些部分被编译入内核,哪些部分被编译成内核模块。

编译内核和模块的方法:make zImage

Make modules

执行完上述命令后,在arch/arm/boot/目录下得到压缩的内核映像zImage,在内核各对应目录得到选中的内核模块。

 

7,linux内核中增加程序(直接编译进内核)要完成以下3项工作:

将编写的源代码拷入linux内核源代码相应目录

在目录的Kconifg文件中增加关于新源代码对应项目的编译配置选项

在目录的Makefile文件中增加对新源代码的编译条目

 

8,linuxC编程的特点:

内核下的Documentation/CodingStyle描述了linux内核对编码风格的要求。具体要求不一一列举,以下是要注意的:

代码中空格的应用

当前函数名:

GNU C预定义了两个标志符保存当前函数的名字,__FUNCTION__保存函数在源码中的名字,__PRETTY_FUNCTION__保存带语言特色的名字。

由于C99已经支持__func__宏,在linux编程中应该不要使用__FUNCTION__,应该使用__func__

内建函数:

不属于库函数的其他内建函数的命名通常以__builtin开始。

阅读(433) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~