分享
 
 
 

这是一篇比较详尽的内核编译说明

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

Linux 内核编译说明

1.Linux内核源码结构:

内核源码中主要包含以下子目录:

arch :包含了与体系结构相关的代码

对应于每一个支持的体系结构,有一个相应的子目录如i386、arm、alpha等。

其每个体系结构子目录下包含几个主要的子目录:

kernel :包含与体系结构相关的内核代码

mm : 包含与体系结构相关的内存管理代码

lib : 包含与体系结构相关的库代码

documentation:包含内核的文档

drivers :包含设备驱动代码。每类设备有相应的子目录,如char 、block、net等

fs : 包含文件系统的代码。每个支持的文件系统有相应的子目录,如 ext2、proc等

include :内核头文件,对每一种体系结构,分别有相应的子目录。

init : 包含内核初始化代码

lib : 包含内核的库代码

mm :包含内存管理代码

kernel :包含内核管理代码

net :包含网络部分的代码

2.系统引导的过程

在pc机上系统启动过程:

系统加电以后bois对系统完成监测设置后将控制权交给硬盘上MBR中的 BootLoader在这里即是lilo或grub等。

BootLoader 将操作系统代码调入内存,然后将控制权交给arch/i386/boot中的Setup.S这段程序。

Setup.S 这段程序在386实模式下对系统进行基本的检测和设置后转入保护模式把控制权交给Head.S

Head.S 建立内存管理和中断管理的框架后调用init/main.c中的start_kernel()函数在start_kernel执行完成后用户就可以登录和使用linux了。Start_kernel()函数在init/main.c 中定义。

Start_kernel的流程中的主要步骤:

setup_arch(&command_line); 用于和处理器、内存等最基本的硬件相关部分的初始化。 在 arch/i386/kernel/setup.c 中定义;

parse_options(command_line); 把启动时得到的参数从命令行的字符串中分离出来并赋给相应的变量。在 init/main.c 中定义;

trap_init(); 对中断向量表进行初始化。在 arch/i386/kernel/trap.c 中定义;

init_IRQ(); 与中断有关的初始化, 在 arch/i386/kernel/i8259.c 中定义;

sched_init(); 进程调度初始化。 在 kernel/sched.c 中定义;

softirq_init(); 在 kernel/softirq.c 中定义;

time_init(); 时间部分初始化。 在 arch/i386/kernel/time.c 中定义;

console_init(); 对终端初始化。 在 drivers/char/tty_io.c 中定义;

buffer_init(mempages); 对用于指示块缓存的buff free list 初始化。 在fs/buffer.c 中定义;

mem_init(); 内存管理初始化。 在 arch/i386/mm/init.c中定义;

rest_init(); 此函数中调用

kernel_thread(init,NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)函数时会调用init/main.c中的init()函数在init()函数中将会建立dbflush、kswapd两个新的内核线程。初始化tty1设备。寻找/etc/init或/sbin/init 或/bin/init来建立一个init进程。

Init进程根据/etc/inittab文件进行文件系统检查、启动系统守护进程为联机终端建立getty进程,执行/etc/rc下的命令文件。

此后getty会在终端上显示login提示符,以等待用户登录。

3.使用make建立内核

1.使用make menuconfig命令:

使用以下编译选项:

Processor type and features --->

(Pentium-Pro/Celeron/Pentium-II) Processor family

(3GB) Maximum Virtual Memory

General setup --->

(ELF) Kernel core (/proc/kcore) format

[*] Kernel support for ELF binaries

File systems --->

[*] /proc file system support

[*] Second extended fs support

ATA/IDE/MFM/RLL support --->

[*] ATA/IDE/MFM/RLL support

[*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

[*] Include IDE/ATA-2 DISK support

Character devices --->

[*] Virtual terminal

Console drivers --->

[*] VGA text console

生成内核bzImage 大小为 309892 byte;

此内核可在pc上成功引导系统

此命令生成一个文件 .config 其中根据你在menuconfig中的选择定义了相应的变量。在Makefile文件中将会包含这个文件。

2.使用make dep命令 建立依赖关系。

3.使用make bzImage 命令建立内核。

如设置正确将在arch/i386/boot/目录下生成内核bzImage文件

4.make bzImage的流程简单说明

当我们使用make命令时,make程序将首先找到当前目录下的Makefile文件。根据Makefile文件的语法进行处理。

在主Makefile文件中包含了arch/i386/Makefile我们make的目标bzImage即在该文件中定:

bzImage: vmlinux

@$(MAKEBOOT) bzImage #此命令将解释为:make -C arch/i386/boot bzImage

现在make需要先去建立目标 vmlinux 然后再执行 arch/i386/boot/ 目录下的 make bzImae。我们现在假设vmlinux目标已生成,则 arch/i386/boot目录下的make程序将执行如下操作:

tools/build -b bbootsect bsetup compressed/bvmlinux.out ./ bzImage

即将vmlinux 用 tools/build工具压缩成目标文件 bzImage(在此过程中,还会构建build 程序,将vmlinux转换成bvmlinux.out等,可参考tools 和 compressed目录下的Makefile文件)。

生成vmlinux目标:

在主目录下Makefile文件中vmlinux生成规则如下:

vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs

$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o --start-group $(CORE_FILES) $(DRIVERS) $(NETWORKS) $(LIBS) --end-group -o vmlinux #生成vmlinux

$(NM) vmlinux |grep –v \(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\) | sort > System.map #此命令根据vmlinux生成System.map文件

在当前设置下此ld连接命令被解释为:

ld -m elf_i386 -T /home/arm/linux/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o --start-group arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/ide/idedriver.o drivers/video/video.o net/network.o /home/arm/linux/arch/i386/lib/lib.a /home/arm/linux/lib/lib.a /home/arm/linux/arch/i386/lib/lib.a --end-group -o vmlinux

即连接程序ld 将各个.o文件连接成目标文件 vmlinux 。

此命令中用到的各个 .o文件make程序会根据Makefile文件的规则去自动生成,下面简单介绍一下由ipc目录生成ipc.o过程:

其ipc目录下Makefile文件内容如下:

O_TARGET := ipc.o

obj-y := util.o

obj-$(CONFIG_SYSVIPC) += msg.o sem.o shm.o

include $(TOPDIR)/Rules.make #包含的Rules.make文件中为通用的规则;

如我们在make menuconfig时选中了SYSVIPC选项,则 .config文件中将定义变量 CONFIG_SYSVIPC=y; 则obj-y 就等于util.o msg.o sem.o shm.o;根据Rules.make将四个.c文件编译为 .o文件。再将四个.o文件连接成 ipc.o文件。在我们的当前设置中没有选择SYSVIPC;将只使用util.o一个文件生成目标 ipc.o ;而util.o由util.c生成。

当所有需要的.o文件生成以后,由ld将其连接生成vmlinux文件,再将其压缩成我们所需要的内核文件 bzImage。Make程序就执行完了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有