编译内核(kernel)

本文详细介绍了如何在Ubuntu 10.04环境下,从准备阶段到完成Linux内核编译的全过程,包括安装所需软件包、下载内核源码、配置内核、编译内核、生成内核镜像文件等步骤,并最终设置启动项以在系统中成功运行自定义内核。

http://blog.youkuaiyun.com/lb015331/archive/2011/05/24/6442098.aspx

学习linux就从内核编译开始,现在就让我们迈出第一步,下面记录编译过程(以下操作均在root下完成)。


1、准备工作

我安装的是ubuntu10.04,为完成内核编译,还需要安装一下包:

# apt-get install gcc
# apt-get install make

# apt-get install bzip2
# apt-get install libc6-dev
# apt-get install ncurse-dev
# apt-get install initrd-tools ####为了使用mkinitrd命令生成initrd.img-XXX



2、下载源码

可以在官网www.kernel.org下载响应的源码(下载完整版F),也可以wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.bz2命令获取。

   
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.bz2

#tar xjf linux-2.6.39.tar.bz2 -C /usr/src


3、配置文件

根据自己机器的硬件情况,选择内核编译配置选项,在这里我使用的是默认配置(make menuconfig后直接保存退出,生成.config文件);具体配置可以参考金步国先生翻译的资料:Linux 2.6.19.x 内核编译配置选项,参考网址:http://lamp.linux.gov.cn/Linux/kernel_options.html

#cd /usr/src/linux-2.6.39

#make menuconfig



4、编译内核

   #make clean          ####第一次编译可以省略

   #make mrproper    ####第一次编译可以省略

   #make



5、编译和安装模块

#make modules

 # make modules_install



6、生成内核镜像文件


 #makinitramfs -o /boot/initrd-2.6.39.img /lib/modules/2.6.39   ##启动、加载模块
  # cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.39   ##
可引导的、压缩的内核
  # cp System.map /boot/System.map-2.6.39            ##kernel 索引
  # cp .config /boot/config-2.6.39                             #内核配置文件


7、设置启动项
启动项是/boot/grub/grub.cfg文件,我们需要修改该文件,具体如下:

首先,复制下面内容。
menuentry 'Ubuntu, with Linux 2.6.32-32-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,4)'
search --no-floppy --fs-uuid --set 8450af8f-090b-4eae-a123-6f1e3604fa9e
linux /boot/vmlinuz-2.6.32-32-generic root=UUID=8450af8f-090b-4eae-a123-6f1e3604fa9e ro quiet splash
initrd /boot/initrd.img-2.6.32-32-generic
}

  然后,对上面内容进行响应的修改,红色部分。
menuentry 'Ubuntu_Test, with Linux 2.6.39' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,4)'
search --no-floppy --fs-uuid --set 8450af8f-090b-4eae-a123-6f1e3604fa9e
linux /boot/vmlinuz-2.6.39 root=UUID=8450af8f-090b-4eae-a123-6f1e3604fa9e ro quiet splash
initrd /boot/initrd.img-2.6.39
}


8、测试
重启,选择Ubuntu_Test, with Linux 2.6.39进入ubuntu系统,最后通过命令uname -a查看系统的内核信息。

 

<think>嗯,用户的问题是关于MTK7688在编译内核时,能否将Flash中的某一段0x100空间(长度10字节)设为不可读取地址,从而让内核启动时跳过该区域,不影响正常启动。首先,我需要理解用户的需求。他们可能想在Flash中保留一个特定的区域,不让内核读取或执行,可能是为了安全或者保留某些数据。 接下来,我要考虑MTK7688的硬件特性。MTK7688基于MIPS架构,通常使用SPI Flash存储内核和文件系统。Flash的分区通常在编译时由Bootloader(如U-Boot)和内核的DTS(设备树)文件定义。用户提到的0x100空间可能是指起始地址为0x100的10字节区域,但需要确认地址是否正确,因为通常内核不会从这么低的地址启动,可能分区布局需要仔细检查。 然后,用户的需求是否可行。通常,内核启动时由Bootloader加载到内存中执行,所以如果Bootloader已经正确加载了内核内核可能不会再次从Flash中读取代码,除非有某些模块需要访问Flash的其他部分。但如果有部分代码或数据在Flash中被保留,可能需要通过分区设置来排除该区域。 可能的解决方案包括修改DTS文件中的分区表,将保留区域排除在kernel分区之外。例如,调整kernel分区的起始地址和大小,绕过保留的0x100到0x10A的区域。另外,检查是否需要在Bootloader中做相应调整,确保它不会加载保留区域。 还需要考虑是否有硬件保护机制,比如某些Flash支持写保护或读保护区域,但具体支持情况取决于MTK7688使用的Flash型号。如果没有硬件支持,可能需要通过软件方式避免访问该区域,但这依赖于内核代码不主动访问该区域,可能存在风险。 用户可能存在的误区是认为内核在启动时会读取整个Flash,但实际上内核通常被加载到内存运行,之后可能不会直接读取Flash中的代码部分。因此,正确设置分区表可能就足够了。另外,需要确认保留区域是否与现有分区冲突,避免覆盖重要的数据。 最后,总结可能的步骤:修改DTS分区表,调整kernel分区;检查Bootloader配置;考虑Flash硬件保护;以及通过内核配置避免访问保留区域。同时提醒用户注意地址是否正确,保留区域是否影响其他分区,并进行实际测试。</think>针对 MTK7688 平台在编译内核时**屏蔽特定 Flash 地址区域**的需求,以下是技术分析和实现思路: --- ### 1. **可行性分析** MTK7688 基于 MIPS 架构,通常使用 SPI NOR Flash 存储固件(如 U-Boot、Kernel、RootFS)。要实现**内核启动时跳过某段 Flash 地址**,需结合硬件特性和软件协同设计: - **硬件层面**:某些 Flash 芯片(如 Winbond、MXIC)支持通过写状态寄存器设置**只读/保护区域**(如 Block Protect Bits)。若 Flash 支持此功能,可直接配置保护区域。 - **软件层面**:通过修改 **Bootloader(如 U-Boot)** 和 **Linux Kernel 的分区表**,在逻辑上隔离目标地址,避免内核访问。 --- ### 2. **推荐实现方案** #### 2.1 修改 Flash 分区表(DTS) 在设备树(`.dts`)中定义 Flash 分区时,**预留目标地址区域**,确保内核不会将其映射到内存或尝试访问: ```dts partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; /* 预留 0x100~0x10A(10字节) */ reserved@100 { reg = <0x100 0x0a>; read-only; }; /* 调整内核分区起始地址和大小 */ kernel@10a { reg = <0x10a 0x200000>; label = "kernel"; }; /* 其他分区... */ }; ``` #### 2.2 配置 Flash 硬件保护(可选) 若 Flash 芯片支持**硬件保护**(如 Winbond W25Q 系列的 Block Protect): - **通过 U-Boot 或内核驱动**设置状态寄存器,将目标地址段设为只读/不可读。 - 示例命令(U-Boot): ```bash sf protect lock 0x100 0x0a # 锁定 0x100~0x10A ``` #### 2.3 内核启动参数调整 确保内核启动时不会尝试解析保留区域: - 在 `bootargs` 中明确指定有效内存范围和分区布局: ```bash setenv bootargs "mem=128M console=ttyS0,57600n8 rootfstype=squashfs root=/dev/mtdblock3" ``` --- ### 3. **注意事项** - **地址对齐**:Flash 操作通常以 **扇区(4KB)** 为单位,保留区域可能需要按扇区对齐。 - **Bootloader 兼容性**:U-Boot 需与分区表一致,避免加载错误地址。 - **内核访问逻辑**:确保内核驱动(如 MTD 子系统)不会主动扫描保留区域。 --- ### 4. **验证方法** - **Flash 内容读取**:通过 `flash_erase` 或 `dd` 命令检查保留区域是否被覆盖。 - **内核日志分析**:查看 `dmesg` 输出,确认无访问错误日志。 - **硬件调试器**:通过 JTAG 或逻辑分析仪直接监控 Flash 访问信号。 --- ### 5. **替代方案** 若无法修改分区表或硬件保护: - **内核启动后屏蔽访问**:通过自定义内核模块拦截 MTD 访问请求,过滤目标地址。 - **Secure Boot 扩展**:结合签名验证机制,跳过非法区域检查。 --- 通过上述方法,可实现内核启动时绕过指定 Flash 区域的需求,同时需根据具体硬件型号和内核版本调整实现细节。建议在实际操作前备份原始固件,并通过仿真环境验证。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值