
学号: 姓名: 班级: 成绩:
| 实验名称:Linux内核编译实验 | 实验地点: |
| 实验仪器:装有Linux操作系统的PC机一台;XSBase270实验开发平台一套 | |
| 一、实验目的: 1、了解Linux内核源代码的目录结构以及各目录的相关内容 2、了解Linux内核各配置选项内容和作用 3、掌握Linux内核配置文件config.in的作用 4、掌握Linux内核的编译过程 5、掌握将新增内核代码加入到Linux内核结构中的方法 | |
| 二、实验内容: 1、利用所提供的Linux源代码,具体分析递归性makefile的结构,划出一个从最顶层makefile到最底层所经过的文件路径和所需要的变量。 2、利用所提供的Linux源代码,写出编译Linux内核的具体过程 2.1 找到内核位置: [root@local]$ cd /home/Liod270 [root@local]$ ls [root@local]$ cd Kernel 2.2 找到内核的压缩包“linux-2.4.21-51Board_EDR.tar.gz”后,便对其解压 [root@local]$ tar zxvf linux-2.4.21-51Board_EDR.tar.gz 2.3 进入解压后的内核源代码目录 [root@local]$ cd linux-2.4.21-51Board_EDR 3、利用所提供的Linux源代码,然后用make menuconfig命令对内核的配置进行修改,记下具体修改的配置选项并进行比较。 [root@local]$ make mrproper [root@local]$ make menuconfig [root@local]$ make dep [root@local]$ make zImage 3.2 将编译好的内核copy到/tftpboot目录中 [root@local]$ cp arch/arm/boot/zImage /tftpboot/ 4、将所编译的内核下载并烧写到目标板(利用实验3的内容) 4.1 完成实验3中的1-4步骤(如果没有配置好,则重新做该步骤) 4.2通过超级终端进入PC机的bootloader(对应实验3中的6步骤) 4.3在Bootloader中配置宿主机及目标机bootloader的IP地址 (对应实验3中的7步骤) 在 Bootloader命令行分别设置宿主机及目标机bootloader的 ip地址。具体操作步骤如下: a) 开发板上电后,敲主机键盘任何键停止 bootloader运行; b) 出现菜单项,等待用户输入; c) 输入数字“1”,查看当前的配置信息; d) 输入数字“0”,让 bootloader进入命令行模式。 e) 输入以下命令设置当前目标机的IP地址,使之与宿主机在一个网段内 set myipaddr 192.168.1.50 f) 输入以下命令,将宿主机的IP地址配置到目标机的bootloader中 set destipaddr 192.168.1.38 [注:此时应该使得destipaddr与宿主机的IP地址一致] g) 通过bootloader下载并烧写内核镜像 tftp zImage_EDR_tinyx kernel flash kernel h) 退出命令行模式 quit i) 输入数字“7”,启动系统。 | |
| 三、思考: 1、简述Linux源代码各目录中的内容 2、分析make config、make menuconfig、make xconfig三个linux内核配置界面的区别 3、指出linux内核编译命令make, make zImage, make bzImage的区别 1. Documentation/:这个目录中包含很多关于配置内核、运行 ramdisk 等任务的实用信息(但通常是过时的)。不过,与不同配置选项相应的帮助条目并不在这里 —— 它们在每个源代码目录的 Kconfig 文件中。 arch/:所有与体系结构相关的代码都在这个目录以及 include/asm- 目录中。在此目录中,每种体系结构都有自己的目录。例如,用于基于 PowerPC 的计算机的代码位于 arch/ppc 目录中。在这些目录里,可以找到底层内存管理、中断处理、早期初始化、汇编例程,等等。 drivers/:按照惯例,在此目录的子目录中可以找到运行外围设备的代码。包括视频驱动程序、网卡驱动程序、底层 SCSI 驱动程序,以及其他类似的驱动程序。例如,在 drivers/net 中可以找到大部分网卡驱动程序。将一类驱动程序组合在一起的某些更高层代码,可能会(也可能不会)像底层驱动程序本身那些包含在同一目录中。 fs/:通用文件系统的代码(称做 VFS,即 Virtual File System)和各个不同文件系统的代码都可以在这个目录中找到。ext2 文件系统是在 Linux 中最常广泛使用的文件系统之一;在 fs/ext2 中可以找到读取 ext2 格式的代码。并不是所有文件系统都会编译或运行;对某些寻找内核项目的人而言,更生僻的文件系统永远都是理想的候选者。 include/:在 .c 文件的开头所包含的大部分头文件都可以在这个目录中找到。 asm- 目录下是与体系结构相关的包含(include )文件。部分内核构建过程创建从 asm 指定 asm- 的符号链接。这样,无需将其固定编码到 .c 文件 #include 就可以获得用于那个体系结构的正确文件。其他目录中包含的是 非-体系结构-相关 的头文件。如果在不只一个 .c 文件中使用了某个结构体、常量或者变量,那么它可能应该放入其中一个头文件中。 init/:这个目录中的文件包括 main.c、创建 早期用户空间(early userspace) 的代码,以及其他初始化代码。可以认为 main.c 是内核“粘合剂(glue)”。在下一部分将深入讨论 main.c。早期用户空间提供了 Linux 内核引导起来时所需要的功能,而这些功能并不需要在内核本身运行。 ipc/:IPC 的意思是 进程间通信(interprocess communication)。它包含了共享内存、信号量以及其他形式 IPC 的代码。 kernel/:不适合放在任何其他位置的通用内核级代码位于此处。这里有高层系统调用代码,以及 printk() 代码、调度程序、信号处理代码,等等。文件名包含很多信息,所以可以使用 ls kernel/,并非能常准确地猜到每个文件的功能。 lib/:这里是对所有内核代码都通用的实用例程。常见的字符串操作、调试例程,以及命令行解析代码都位于此处。 mm/:这个目录中是高层次内核管理代码。联合使用这些例程以及底层的与体系结构相关的例程(通常位于 arch//mm/ 目录中)来实现虚拟内存(Virtual memory,VM)。在这里会完成早期内存管理(在内存子系统完全建立起来之前需要它),以及文件的内存映射、页高速缓存管理、内存分配、RAM 中页的清除(还有很多其他事情)。 net/:这里是高层网络代码。底层网络驱动程序与此层次代码交换数据包,这个层次的代码可以根据数据包将数据传递给用户层应用程序,或者丢弃数据,或者在内核中使用它。net/core 包含大部分不同的网络协议都可以使用的代码,和某些位于 net/ 目录本身中的文件一样。特定的网络协议在 net/ 的子目录下实现。例如,在 net/ipv4 目录中可以找到 IP(版本 4)代码。 scripts/:这个目录中包含的脚本可用于内核的构建,但并不将任何代码加入到内核本身之中。例如,各种配置工具可以将它们的文件放在这里。 2. #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用) #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用) 3. 三者都实现内核的完全编译;其中命令make zImage和命令make bzImage生成的内核都是使用gzip压缩的,只要使用一个就够了,它们的区别在于使用make bzImage可以生成大一点的内核,比如在编译2.4.0版本的内核时如果使用make zImage命令,那么就会出现system too big的错误提示。 | |
