Linux内核驱动学习(一)----内核简介 | 配置 | 编译| 安装(PC平台下)

Linux体系结构:



由上图知:Linux架构分为用户空间和内核空间

划分成用户空间与内核空间的原因?
保护操作系统,使应用程序和内核拥有不同的权限。为不同的代码制造不同的等级。。。

内核空间与用户空间是 程序执行的两种不同的状态,通过 系统调用硬件中断能够完成从用户空间到内核空间的转换

内核的构成:


a-->系统调用接口(SCI)、
b-->进程管理(PM)、
c-->内存管理(MM) 、
d-->关于处理器代码(arch) 、
e-->虚拟文件系统(VFS)、
f-->网络协议栈、  
g-->设备驱动(DD)


关于Linux内核源代码

1、下载源代码
2、目录结构

3、工程中主要使用sourceinsight对内核源码进行管理

—————————————————————————————————————————————————————————————

1、配置内核


1.1 配置内核的原因:
--->1.1.1、硬件的需求
--->1.1.2、软件的需求;选择需要的,去掉不要的

1.2配置内核的方法(两种命令)
--->1.2.1、基于文本模式的交互式设置  make config  (需逐项选择,较为麻烦)

--->1.2.2、基于菜单模式的交互式设置  make menuconfig(更为直观,此命令默认为X86平台,配置ARM平台时需指定ARCH = arm)



菜单模式下的内核配置更直观,所以选择菜单模式下配置
关于菜单选项说明:
<*>;把选中的C文件编译生成对应的中间文件(*.o),由这些(*.o)文件编译组成内核映像(zImage),启动时是将内核映像放到内存中 的
<M>:代表模块,对应的各个模块都有对应的C文件,编译时生成对应的中间文件(*.o)。并将这些中间文件放在硬盘中,等到需要用到时,就将其放置到内存中使用
<>:表示编译时不选择该功能

配置完成之后保存设置。可以看到内核根目录下多出.config文件,该文件中的每一行对应着配置的一个选项
如下图所示

注:同样可以通过修改.config文件来修改内核选项。如下
CONFIG_X86_32 is not set
 
由于从零开始配置内核选项较多,比较复杂。
主要配置内核的方法通常有以下两种:
第一种方法: 一般选择已有的一个内核配置文件为基础进行配置。。
譬如选择虚拟机中Linux下的配置文件进行配置。

进入内核选项配置菜单,,选择load.....如下(注:此时需将Linux的配置文件(config-2.6.32-279.el6.i686)放置内核文件夹顶层目录)
之后就可进行修改。。


第二种方法:参考内核文件目录中  /arch/arm/configs/里的不同平台的配置文件


2、 编译内核

2.1编译内核映像(同样涉及两种命令)----对应<*>选项的文件最终生成的映像文件
--->2.1.1命令 make zImage---在x86平台,zImage只能用于小于512K的内核

--->2.1.2命令 make bzImage:

若想获取详细编译信息,可使用
make zImage V=1
make bzImage V=1  ---可以列出较为完整的编译选项

根据提示;编译好的文件放在本目录下,路径:arch/x86/boot/bzImage


2.2.编译内核模块文件(以下两个命令)----对应<M>选项生成 的(.ko)文件

--->2.2.1命令 make modules---编译内核模块,时间较长

--->2.2.2命令 make modules_install---把散落在linux文件夹中的模块集中在一起--- /lib/modules目录下

2.3打包内核模块;制作init ramdisk
命令:mkinitrd initrd-$version(可任意命名) $version(此为刚编译生成的文件目录,打包此目录)
例:mkinitrd initrd-2.3-32    linux-2.3-32


3、安装内核(x86平台下才有的操作)

3.1拷贝内核:复制编译出的bzImage到启动目录下。
    cp arch/$cpu/boot/bzImage /boot/vmlinuz-$version
3.2复制第二部分制作的initrd-$version到/boot/的目录下
    执行cp initrd-$version /boot/
3.3修改启动配置文件,即/etc/grub.conf文件

4、清理内核

4.1命令 make clean---清除编译生成的.o文件
4.2命令 make distclean---清除编译生成的.o文件和配置文件.config



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
买书时赠送的电子稿,代码示例丰富,非常不错!全书分三个文件打包。 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |--

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值