Linux-2.6.38.8 移植参考
扫描二维码
随时随地手机看文章
最近学习Linux有点迷茫,刚学会了字符驱动的编写但是却不知道下一步该干些什么,想学习Linux内核裁剪,但是苦于找不到资料,开发板自带的是Linux3.01,虽然我会编译内核却完全不知道如何去裁剪,配置都是开发板自带的,我想自己学习裁剪一个Linux2.6的内核,因为现在的学习资料大部分都是以2.6的内核为例的,因此为了学习方便,我想移植一个Linux2.6的内核,因此从官网下载了一个Linux2.6.38.8版本的Linux源代码。
后面会持续更新...
1.进入Linux2.6的源代码根目录。
Linux源码目录结构详解
Arch
目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
Copying
目录下是GPL版权申明。对具有GPL版权的源代码改动而形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务,如公开源代码。
Credits
目录下是光荣榜。对Linux做出过很大贡献的一些人的信息。
Documentation
目录下是一些文档,没有内核代码,可惜都是English的,是对每个目录作用的具体说明。
Drivers
目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound; block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化,因为安装nfs文件系统的时候需要网络其他: 如, Lib放置核心的库代码; Net,核心与网络相关的代码; Ipc,这个目录包含核心的进程间通讯的代码; Fs,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2。
Fs
目录存放Linux支持的文件系统代码和各种类型的文件操作代码。每一个子目录支持一个文件系统,如ext3文件系统对应的就是ext3子目录。
Include
目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录。
Init
目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
Ipc
目录包含了核心进程间的通信代码。
Kernel
内核管理的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同时与处理器结构相关代码都放在arch/*/kernel目录下。
Lib
目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
Maintainers
目录存放了维护人员列表,对当前版本的内核各部分都有谁负责。
Makefile
目录第一个Makefile文件。用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系,编译时使用;仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助。
Mm
目录包含了所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,例如arch/i386/mm/Fault.c 。
Modules
目录存放了已建好的、可动态加载的模块文件目录,是个空目录,用于存放编译时产生的模块目标文件。
Net
目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
Reporting-bugs
目录里是有关报告Bug 的一些内容
Scripts
目录包含用于配置核心的脚本文件等。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
修改根目录makefile文件
exportKBUILD_BUILDHOST := $(SUBARCH)
ARCH =arm
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
否则后面不能设置ARM处理器。
配置Linux内核,最常用的是执行“makemenuconfig",如果不能执行请安装ncurses.
menucofig是个图图形配置解码,如下
在图中选项前面如果为<*>表示模块被编译进内核;如果为
黄色高亮表示启用该选项。
选项说明
1.General setup ---> //一般设置
[*] Prompt for development and/or incompletecode/drivers
默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动. 你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。
() Cross-compiler toolprefix
交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。我使用的是arm-linux- 前缀。
() Local version -append to kernel release
自定义版本,也就是uname -r可以看到的版本,可以自行修改,这里我没有使用
[ ] Automatically append version information to the versionstring
自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先 的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- –append-to-version 选项来生成自定义版本,所以这里选N。
Kernel compression mode (Gzip) --->
有5个选项,这个选项是说内核镜像要用的压缩模式,回车一下,可以看到gzip,bzip2,lzma,xz,lzo,一般可以按默认的gzip,如果要用bzip2,lzma,lzo,要先安装相关解压缩工具
[*] Support for paging of anonymous memory(swap)
使你的内核支持虚拟内存 , 一定要选。
[*] System V IPC
进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有 在选Y的情况下才能运行,所以不用考虑,这里一定要选。
[*] POSIX Message Queues
这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上
[*] BSD Process Accounting
这是允许用户进程访问内核,将账户信息写入文件中。这通常被认为是个好主意,建议你 最好将它选上。将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息。
[*] BSD Process Accounting version 3 file format
用的话统计信息将会以新的格式(V3)写入,这格式包含进程ID和父进程。注意这个格式和以前的 v0/v1/v2 格式不兼容,所以你需要 升级相关工具来使用它。选不选均可。
[*] Export task/processstatistics through netlink (EXPERIMENTAL)
处于实验阶段的功能。通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N。
通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的
[*] Enable per-task delay accounting (EXPERIMENTAL)
在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间
[*] Enable extended accounting over taskstats (EXPERIMENTAL)
在统计信息中包含扩展进程所花费的时间
[*] Enable per-task storage I/O accounting (EXPERIMENTAL)
在统计信息中包含I/O存储进程所花的时间。
-*- Auditing support
审计支持,用于和内核的某些子模块同时工作,(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计。允许审计的下层能够被其他内核子系统使用,比如SE-Linux,它需要这个来进行登录时的声音和视频输出。
[*] Enable system-call auditing support
支持对系统调用的审计。允许系统独立地或者通过其他内核的子系统,调用审计支持,比 如SE-Linux。要使用这种审计的文件系统来查看特性,请确保 INOTIFY 已经被设置。
RCU Subsystem ---> 一个高性能的锁机制RCU 子系统
RCU(Read-CopyUpdate),顾名思义为读取-复制更新。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。
IRQ subsystem ---> //IRQ中断子系统设置。
[*]Support sparse irq numbering
支持稀有终端编号,不知道怎么用,默认选中
RCU Subsystem ---> //RCU子系统设置,非对称读写锁系统是一种新的kernel锁机制,适用于读多写少环境
RCU (Read-Copy Update),顾名思义为读取-复制更新。对于被RCU保 护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机 制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。
RCU Implementation(Tree-based hierarchical RCU) --->
(X)UP-only small-memory-footprint RCU
小内存的RCU。
[ ] Enable tracingfor RCU
激活跟踪,不选择
< > Kernel.config support
这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中。它提供正在运行中的或者还在硬盘中的内核的相关配置选项。可以通过内核镜像文件 kernel image file 用命令script scripts/extract-ikconfig 来提取出来,作为当前内核重编译或者另一个内核编译的参考。如果你的内核在运行中,可以通过/proc/config.gz文件来读取。下一个选项提供这项支持。看起来好像是一个不错的功能,可以把编译时的 .config文件保存在内核中,以供今后参考调用。用来重编译和编译其他的内核的时候可以用上。你是一个编译内核的狂人的话,这项要选上
(17) Kernel logbuffer size (16 => 64KB, 17 => 128KB)
内核日志缓存的大小,12 => 4 KB,13 => 8KB,14 => 16 KB单处理器, 15 => 32 KB多处理器,16=> 64 KB for x86 NUMAQ or IA-64,17 =>128 KB for S/390 ,保持默认。
-*- Control Groupsupport --->
cgroup支持,如cpusets那样来使用cgroup子系统进程(不确定可以不选)