发表于:2011-01-22 15:25:21
楼主
4、linux内核的定制与裁减
所谓系统内核实际上是系统设计人员编写的控制系统的各个组件,在不同程序之间分配系统资源,同时协调系统与硬件和外设之间数据传递的系统核心程序代码。与Windows系统的内核不同,Linux系统的内核是可配置的,用户可以根据自己的实际需要,在对系统内核进行定制。例如,用户可以针对自己机器CPU的具体型号对系统内核进行优化。
尽管不同厂商在推出其各自的Linux产品之前,都已经针对某些具体的硬件设备或网络协议对系统内核进行了设置,但是用户还是可以针对自己所实际使用的机器对Linux系统内核进行进一步的修改,从而将Linux系统的性能提升到新的高度。
尽管重新编译Linux系统内核的操作大多数可以自动完成而且也并不复杂,但是一旦出现错误,将可能导致Linux系统无法正常启动。因此,为了预先防范可能出现的任何问题,用户一定要在对Linux系统内核进行任何的改动之前,制作一张Linux系统启动盘(注:用户在安装Linux系统的过程中可能已经被要求制作了系统启动盘,如果用户没有现成的系统启动盘,可以按照本文随后的介绍重新制作一张),同时还应当将一些重要的数据进行及时的备份。
用户需要以管理员root帐号登录Linux系统。因为本文的所有命令都是通过命令方式实现,所以用户最好选择以命令方式登录。
一般在Linux系统的安装过程中,安装程序都会要求用户制作一张Linux系统启动盘,这样当Linux系统出现严重错误而无法正常启动时,用户就可以使用启动盘重新启动Linux系统。
现在,我们开始对Linux系统内核进行定制。首先,用户输入命令“cd /usr/src/linux”,将当前的工作目录转换到/usr/src/linux。Linux系统为用户提供了两种系统内核的设置接口,分别为menuconfig和xconfig。其中,用户可以在任何命令方式下通过输入命令“make menuconfig”启动menuconfig,然后使用方向键和Tab键进行选择和修改。对于xconfig,用户只能在X Windows下通过命令“make xconfig”启动。xconfig提供了更加友好的用户界面,用户可以通过鼠标点击选择选择各项菜单和按钮。本文将主要介绍xconfig使用方法,用户可以通过使用menuconfig实现同样的功能。
用户输入命令“make xconfig”按回车,在一连串文字飞快显示之后,将会弹出xconfig的主窗口。该窗口包含许多按钮选项,点击其中任意一项会弹出对Linux系统内核进行具体设置的设置窗口。在每一个设置窗口中,用户可以通过选择“Y”或“N”选项启动或关闭任意功能。此外,用户还可以选择“M”选项,把某些功能作为模块进行编辑。所谓模块并不是系统内核的组成部件,但是在需要时系统内核会连接指定的模块从而共同提供特定的功能。在默认情况下,设置窗口中的许多功能都是作为不同的模块被编辑的。
用户在完成了所有需要改动的设置之后,可以点击xconfig主窗口的“Save and Exit“,保存用户设置并退出xconfig。用户在按照个人的实际需要完成对系统内核的设置之后,需要对新的系统内核进行编译。
用户在关闭所有打开的程序之后,在命令方式下输入“make bzImage”命令。该命令会自动完成对新系统内核的编辑,大约需要10到30分钟,具体时间取决于用户机器的性能。编译完系统内核之后,返回到命令方式。这时如果出现报错信息,则表示用户对系统内核进行了错误的设置,例如没有启动某一个功能所必须的其它附加功能等。这时用户所能做的只能是从头开始,从新设置系统内核。 在顺利编译完新的系统内核之后,用户还需要对配置系统内核过程中设定的各种功能模块进行编译和安装。具体为:输入“make modules”命令,然后按回车。该命令将会完成对内核模块的编译。完成编译之后,输入“make modules_install”命令,该命令会自动安装已编译模块。
在完成了对新系统内核以及模块的编译之后,我们需要把新的系统内核复制到Linux的启动目录中。用户可以输入以下命令“cp arch/i386/boot/bzImage /boot/vmlinuz-mykernel”。此外,我们还需要对LILO进行相应的修改,以便使LILO在系统启动时能够找到新的系统内核。我们可以使用任何一种Linux系统下的文本编辑工具对LILO配置文件进行修改。这里我们使用pico文本编辑器。输入“pico /etc/lilo.conf”命令,启动pico编辑器,并载入LILO配置文件。找到“image=“项,用“/boot/vmlinuz-mykernel”替代该项的现有值。建议用户记下“image=“项的当前值,这样如果出现任何问题,就可以方便的恢复到安全设置。完成修改之后,按Ctrl-X,选择“Y”然后回车,保存设置并退出pico编辑器。这样,我们已经完成了定制Linux系统内核的所有工作。重新启动机器再次进入Linux系统之后,用户将会感受到新的系统内核所带来的新的体验。
三、Uboot的初始化及引导原理
1. 指定初始函数表:
init_fnc_t *init_sequence【】 = {
cpu_init, /* cpu 的基本设置 */
board_init, /* 开发板的基本初始化 */
interrupt_init, /* 初始化中断 */
env_init, /* 初始化环境变量 */
init_baudrate, /* 初始化波特率 */
serial_init, /* 串口通讯初始化 */
console_init_f, /* 控制台初始化第一阶段 */
display_banner, /* 通知代码已经运行到该处 */
dram_init, /* 配制可用的内存区 */
display_dram_config,
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
checkboard,
#endif
NULL,
};
执行初始化函数的代码如下:
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
2. 配置可用的 Flash 区
flash_init ()
3. 初始化内存分配函数
mem_malloc_init()
4. nand flash 初始化
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND:");
nand_init(); /* 初始化 NAND */
见第七部分 3.2.3 节中的第 3 点 nand_init()函数.
5. 初始化环境变量
env_relocate ();
6. 外围设备初始化
devices_init()
7. I2C 总线初始化
i2c_init();
8. LCD 初始化
drv_lcd_init();
9. VIDEO 初始化
drv_video_init();
10. 键盘初始化
drv_keyboard_init();
11. 系统初始化
drv_system_init();
2.3.2 初始化网络设备
初始化相关网络设备,填写 IP、MAC 地址等。
1. 设置 IP 地址
/* IP Address */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
/* MAC Address */
{
int i;
ulong reg;
ch ar *s,