Embed
Email

??Debian Linux ????

Document Sample
??Debian Linux ????
Shared by: HC111213094150
Categories
Tags
Stats
views:
1
posted:
12/13/2011
language:
pages:
58
浅谈Debian Linux 内核开发







武钢



2007.12.8

 Debian简介

 编译内核

 Linux的内核结构

 内核模块

 内核的调试

 内核相关的资源和书籍

 1. Debian简介

 Debian 是一个致力于自由软件开发并宣扬

自由软件基金会之理念的自愿者组织。

Debian 计划创建于 1993 年。

 经过多年的成长,那群由 自由软件基金会

资助并受 GNU 哲理影响的爱好者已经演

变为一个拥有大约 1000多 位 Debian 开发

人员的组织。

 Debian 开发人员参与制定的重要计划

· Linux Standard Base (LSB) 是一个针对

GNU/Linux 系统标准化的项目,它将使第三方软

件和硬件开发者能更容易的为“普通”的 Linux

设计程序和设备驱动,而不仅仅是为某个特定的

GNU/Linux 发行版进行开发。

 · Filesystem Hierarchy Standard (FHS) 则

是朝 Linux 文件系统布局标准化方向的一种努力。

FHS 将使软件开发者能集中精力设计程序,而不

需要担心软件包在不同的 GNU/Linux 发行版的

安装。

 Debian GNU/Linux

 将 Debian 哲学与方法论,GNU 工具集、

Linux 内核,以及其他重要的自由软件 结

合在一起所构成的独特的软件发行版称为

Debian GNU/Linux。

 Debian 具有优秀的技术,为 Linux 引入的

许多特性现在已经成为了非常通用的标准。

 Debian 与其他 Linux 发行版最大的不同

之处在于包管理系统的特性。这些工具给

予 Debian 系统管理员对安装到系统上的

软件包的完全控制.

 Module-init-tools更新

编译内核前的准备



 获取module-init-tools工具程序,并解压缩

tar -zxvf module-init-tools-3.0.tar.gz

 进入module-init-tools目录,输入

./configure –prefix=/

 将旧版模块工具程序/sbin/insmod与

/sbin/rmmod改名

make moveold

 编译,安装与设定

make

make install

./generate-modprobe.conf

/etc/modprobe.conf

 编译内核



 获取内核源码,并解压缩

tar –zxvf linux-2.6.18.tar.gz

 输入make menuconfig调出编译内核的参

数设定, 选择相应的配置时,有三种选择:

 [*] 将该功能编译进内核

[ ] 不将该功能编译进内核

[M] 将该功能编译成可以在需要时动态插

入到内核中的模块

 在/usr/src/linux-2.6.18目录下输入make指

令编译内核

 编译出bzImage文件后,输入make modules

指令,编译可加载模块

 输入make modules_install安装模块

 Make install

 reboot

龙芯平台上的内核编译

注意的问题

 Linux/MIPS toolchain 的制作

 binutils 版本最好是2.8.1 以上版本的

 制作系统本身和制作mips64位系统基本类



 具体请参考孙海勇的文章

“手把手教你源代码制作龙芯64位系统 “

Linux的内核结构

 GNU/Linux 操作系统的基本体系结构

 用户空间之下是内核空间,Linux 内核正是位于

这里,它可以进一步划分成 3 层。最上面是系统调

用接口,它实现了一些基本的功能,系统调用接

口之下是内核代码,可以更精确地定义为独立于

体系结构的内核代码。在这些代码之下是依赖于

体系结构的代码,构成了通常称为 BSP(Board

Support Package)的部分。



 它提供了连接内核的系统调用接口,还提供了在

用户空间应用程序和内核之间进行转换的机制。

Linux 内核的主要子系统



 Linux 内核的一个体系结构透视图

系统调用接口



 SCI 层提供了某些机制执行从用户空间到

内核的函数调用。这个接口依赖于体系结

构。SCI 实际上是一个非常有用的函数调

用多路复用和多路分解服务。

进程管理

 进程管理的重点是进程的执行。在内核中,

这些进程称为线程,代表了单独的处理器

虚拟化(线程代码、数据、堆栈和 CPU 寄

存器)。在用户空间,通常使用进程 这个

术语,不过 Linux 实现并没有区分这两个

概念(进程和线程)。

2.6 调度系统从设计之初就把开发重点放在

更好满足实时性和多处理机并行性上,并

且基本实现了它的设计目标。

 继承和发扬 2.4 版调度器的特点:

 交互式作业优先

 轻载条件下调度/唤醒的高性能

 公平共享

 基于优先级调度

 高 CPU 使用率

 SMP 高效亲和

 实时调度和 cpu 绑定等调度手段

 在此基础之上的新特性:

 O(1)调度算法,调度器开销恒定(与当前系统

负载无关),实时性能更好

 高可扩展性,锁粒度大幅度减小

 新设计的 SMP 亲和方法

 优化计算密集型的批处理作业的调度

 重载条件下调度器工作更平滑

 子进程先于父进程运行等其他改进

内存管理



 内核所管理的另外一个重要资源是内存。

为了提高效率,如果由硬件管理虚拟内存,

内存是按照所谓的内存页 方式进行管理的

(对于大部分体系结构来说都是 4KB)。

Linux 包括了管理可用内存的方式,以及物

理和虚拟映射所使用的硬件机制

 Linux 提供了对 4KB 缓冲区的抽象,例如

slab 分配器。这种内存管理模式使用 4KB

缓冲区为基数,然后从中分配结构,并跟

踪内存页使用情况,比如哪些内存页是满

的,哪些页面没有完全使用,哪些页面为

空。这样就允许该模式根据系统需要来动

态调整内存使用。

虚拟文件系统

 虚拟文件系统(VFS)为文件系统提供了

一个通用的接口抽象。VFS 在 SCI 和内核

所支持的文件系统之间提供了一个交换层.

 在 VFS 上面,是对诸如 open、close、

read 和 write 之类的函数的一个通用 API

抽象。在 VFS 下面是文件系统抽象,它定

义了上层函数的实现方式。

 文件系统层之下是缓冲区缓存,它为文件

系统层提供了一个通用函数集。这个缓存

层通过将数据保留一段时间从而优化了对

物理设备的访问。

网络协议栈

 Linux 操作系统的最大特性之一就是它的网

络栈。它最初源于 BSD 的网络栈,具有一

套非常干净的接口,组织得非常好。其接

口范围从协议无关层(例如通用 socket 层

接口或设备层)到各种网络协议的具体层。

 最上面是用户空间层,或称为应用层,其

中定义了网络栈的用户。

 底部是物理设备,提供了对网络的连接能

力。

 中间是内核空间,即网络子系统。流经网

络栈内部的是 socket 缓冲区sk_buffs),

它负责在源和汇点之间传递报文数据。

内核模块

 内核模块是内核的扩展,它提供了在内核运

行过程中动态加载的特性.内核模块通常用

来实现设备驱动程序.

 模块被加载进系统后,就在内核态下运行了,

成了内核的一部分,可以读写内核数据结构.

工具文件





 lsmod, insmod, rmmod

列出加载模块,插入,删除模块

 Modinfo

列出指定模块的信息,比如path/filename,

licence, versionmagic

 modprobe

智能的加载或删除模块

模块的初始化和关闭

 模块的初始化函数负责注册模块所提供的

任何设施. 通常定义如下:

 Static int __init initialization_func(void)

{

/*初始化代码*/

}

module_init(initialization_func);

 Module_init作用

在模块的目标代码中增加一个特殊的段,用

于说明内核初始化函数所在的位置

 模块可以注册许多不同类型的设施,包括不

同类型的设备,文件系统等

 清除函数

每个重要的模块都需要一个清除函数,该函数在模

块被移除前注销接口并向系统返回所有资源

static void __exit cleanup_func(void)

{

/*这里是清除代码*/

}

module_exit(cleanup_func)

 Module_exit作用

帮助内核找到模块的清除函数

如果一个模块未定义清除函数,内核就不允

许卸载该模块

 宏 __init 和 __exit作用

可以使函数在运行完成后自动回收内存

模块参数

 内核允许对模块指定参数,可以在装载模块

时改变,这些参数的值可以在运行insmod或

modprobe命令时赋值

 参数使用module_param来声明,它需要三

个参数:变量名称,类型和访问许可掩码

 要声明数组参数用



module_param_array(name,type,num,per

m)

内核符号表

 公共内核符号表中包含了所有的全局内核

项的地址.当模块装入内核后,它所导出的任

何符号都变成内核符号表的一部分.

 一个模块向其他模块导出符号使用下面2个



EXPORT_SYMBOL(name)

EXPORT_SYMBOL_GPL(name)

模块说明的相关宏

 MODULE_LICENSE() 说明代码许可类型

 MODULE_DESCRIPTION() 模块描述

 MODULE_AUTHOR() 作者

 MODULE_SUPPORTED_DEVICE() 模块

支持的设备

Makefile



 obj-m += myModule.o



 KDIR:=/lib/modules/$(shell uname -r)/build

 # PWD=$(shell pwd)

 all:

 make -C $(KDIR) M=$(PWD) modules

 clean:

 make -C $(KDIR) M=$(PWD) clean

 obj-m := myModule.o表示编译后生成

myModule.ko模块。

 $(KDIR) 指定了内核源码的路径,“M=”表

示这是个外部模块,M=$(PWD) 指定了该

模块文件所在的路径。

 如果是多个源文件编译出一个模块,假设模块名是test.ko,

那么源文件名不能有test.c

 obj-m := test.o

 test-objs := file1.o file2.o file3.o

 KDIR := /lib/modules/$(shell uname -r)/build

 #PWD := $(shell pwd)



 all:

 make -C $(KDIR) M=$(PWD) modules

 clean:

 make -C $(KDIR) M=$(PWD) clean

关键数据结构

 内核使用file_operations结构来访问模块程

序中的函数.

 管理模块的方法都是file_operations结构提

供的函数指针

 Ssize_t(*read)(struct file*,char*,size_t,loff_t *)



 Ssize_t(*write)(struct file*,const char*,size_t,

loff_t *)



 Int(*open)(struct inode*,struct file)



 Int(*release)(struct inode*,struct file*)



 Int(*ioctl)(struct inode*,struct file*,

unsigned int,unsigned long)

内核和用户空间的数据传输

 copy_to_user

 copy_from_user

 put_user

 get_user

模块实例

 #include

 #include



 MODULE_LICENSE("GPL")

 MODULE_AUTHOR(“WUGANG”)



 static int hello_init(void)

 {

 printk(KERN_ALERT "Hello, World!\n");

 return 0;

 }

 static void hello_exit(void)

{

 printk(KERN_ALERT "Goodbye!\n");

}



 module_init(hello_init);

 module_exit(hello_exit);

核心模块 Vs 应用程序



 大多数小规模及中规模应用程序是从头到

尾执行单个任务,而模块只是预先注册自

己以便服务于将来的某个请求,然后它的

初始化函数就立即结束。

 应用程序在退出时,可以不管资源的释放

或者其他的清除工作,但模块的退出却必

须仔细撤销初始化函数所做的一切,否则,

在系统重新引导之前某些东西就会残留在

系统中。

 模块运行在所谓的内核空间里,而应用程

序运行在所谓的用户空间中.

内核的调试

 使用printk打印调试

系统定义了8种可用的日志级别字符串

KERN_EMERG KERN_ALERT

KERN_CRIT KERN_ERR

KERN_WARNING KERN_NOTICE

KERN_INFO KERN_DEBUG

 使用KGDB构建Linux内核调试环境

kgdb 提供了一种使用 gdb调试 Linux 内核

的机制。使用KGDB调试时需要两台机器,

一台作为开发机,另一台作为目标机,两台

机器之间通过串口或者以太网口相连。串

口连接线是一根RS-232接口的电缆.

kgdb发布支持i386、x86_64、32-bit PPC、

SPARC等几种体系结构的调试器

 安 装kgdb调试环境需要为Linux内核应用

kgdb补丁,补丁实现的gdb远程调试所需

要的功能包括命令处理、陷阱处理及串口

通讯3个主要的部分。 kgdb补丁的主要作

用是在Linux内核中添加了一个调试Stub。

调试Stub是Linux内核中的一小段代码,提

供了运行gdb的开发机和所调试内 核之间

的一个媒介。gdb和调试stub之间通过gdb

串行协议进行通讯。

 stty命令可以对串口参数进行设置:

在development机上执行:

stty ispeed 115200 ospeed 115200 -F

/dev/ttyS0



在target机上执行:

stty ispeed 115200 ospeed 115200 -F

/dev/ttyS0

 安装与配置

 内核的配置与编译

 [root@lisl tmp]# tar -jxvf linux-2.6.7.tar.bz2

 [root@lisl tmp]#tar -jxvf linux-2.6.7-kgdb-

2.2.tar.tar

 [root@lisl tmp]#cd inux-2.6.7

 应用补丁的命令如下所示:

 [root@lisl tmp]#patch -p1 <../linux-2.6.7-

kgdb-2.2/core-lite.patch

 [root@lisl tmp]#make menuconfig

 在内核配置菜单的Kernel hacking选项中选择

kgdb调试项

 kgdb的启动

 在将编译出的内核拷贝的到target机器之后,需

要配置系统引导程序,加入内核的启动选项。

 下面给出使用lilo作为引导器时的配置示例。

image=/boot/vmlinuz-2.6.7-kgdblabel=kgdb

read-only root=/dev/hda3append="gdb

gdbttyS=1 gdbbaud=115200"

 保存好以上配置后重新启动计算机,选择启动带

调试信息的内核,内核将在短暂的运行后在创建

init内核线程之前停下来,打印出以下信息,并等

待开发机的连接。

 Waiting for connection from remote gdb...

 在开发机上执行:

 Gdb

 file vmlinux

 set remotebaud 115200

 target remote /dev/ttyS0

内核相关的网络资源

 http://www.kernel.org

 http://www.linux.it/kerneldocs

 http://www.kernelnewbies.org

 http://janitor.kernelnewbies.org/

内核相关的书籍

 Understanding.the.Linux.Kernel.3rd.Editio

n

 Linux.Kernel.Primer.A.Top.Down.Approac

h.for.x86.and.PowerPC.Architectures

 linux.device.drivers.3rd.edition

 Linux Kernel Development - 2nd Edition

 Thank you


Other docs by HC111213094150
Open Source OPAC
Views: 4  |  Downloads: 0
THE AMERICAN WEIL SOCIETY
Views: 0  |  Downloads: 0
Brian K Justice Resume
Views: 2  |  Downloads: 0
Data Analysis � Workshop
Views: 0  |  Downloads: 0
EmpltpsS1
Views: 3  |  Downloads: 0
?? Shell Script ? X Window System
Views: 3  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!