linux kernel struct 之 boot_params

linux-4.9.37/arch/x86/include/uappi/asm/bootparam.h

用于存储从bootloader传递到内核的启动参数和系统配置信息。‌

struct boot_params {
    struct screen_info screen_info;            /* 0x000 */
    struct apm_bios_info apm_bios_info;        /* 0x040 */
    __u8  _pad2[4];                    /* 0x054 */
    __u64  tboot_addr;                /* 0x058 */
    struct ist_info ist_info;            /* 0x060 */
    __u8  _pad3[16];                /* 0x070 */
    __u8  hd0_info[16];    /* obsolete! */        /* 0x080 */
    __u8  hd1_info[16];    /* obsolete! */        /* 0x090 */
    struct sys_desc_table sys_desc_table; /* obsolete! */    /* 0x0a0 */
    struct olpc_ofw_header olpc_ofw_header;        /* 0x0b0 */
    __u32 ext_ramdisk_image;            /* 0x0c0 */
    __u32 ext_ramdisk_size;                /* 0x0c4 */
    __u32 ext_cmd_line_ptr;                /* 0x0c8 */
    __u8  _pad4[116];                /* 0x0cc */
    struct edid_info edid_info;            /* 0x140 */
    struct efi_info efi_info;            /* 0x1c0 */
    __u32 alt_mem_k;                /* 0x1e0 */
    __u32 scratch;        /* Scratch field! */    /* 0x1e4 */
    __u8  e820_entries;                /* 0x1e8 */
    __u8  eddbuf_entries;                /* 0x1e9 */
    __u8  edd_mbr_sig_buf_entries;            /* 0x1ea */
    __u8  kbd_status;                /* 0x1eb */
    __u8  _pad5[3];                    /* 0x1ec */
    /*
     * The sentinel is set to a nonzero value (0xff) in header.S.
     *
     * A bootloader is supposed to only take setup_header and put
     * it into a clean boot_params buffer. If it turns out that
     * it is clumsy or too generous with the buffer, it most
     * probably will pick up the sentinel variable too. The fact
     * that this variable then is still 0xff will let kernel
     * know that some variables in boot_params are invalid and
     * kernel should zero out certain portions of boot_params.
     */
    __u8  sentinel;                    /* 0x1ef */
    __u8  _pad6[1];                    /* 0x1f0 */
    struct setup_header hdr;    /* setup header */    /* 0x1f1 */
    __u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
    __u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];    /* 0x290 */
    struct e820entry e820_map[E820MAX];        /* 0x2d0 */
    __u8  _pad8[48];                /* 0xcd0 */
    struct edd_info eddbuf[EDDMAXNR];        /* 0xd00 */
    __u8  _pad9[276];                /* 0xeec */
} __attribute__((packed));

<think>嗯,用户现在问的是关于在Linux内核中修改mini2440的Nand Flash扇区。首先,我需要确定用户的具体需求是什么。他们可能是在开发或维护基于mini2440开发板的系统,遇到了Nand Flash分区的问题,或者需要调整分区结构以适应新的应用需求。 首先,回忆一下mini2440的硬件配置。mini2440通常使用S3C2440 SoC,搭配的Nand Flash可能是K9F2G08U0C之类的型号,容量为256MB。Linux内核中,Nand Flash的分区信息通常定义在MTD(Memory Technology Device)子系统中,可能在平台设备代码或设备树中指定。 用户提到“修改扇区”,但“扇区”这个词在Nand Flash中通常称为“块”或“分区”。可能用户是指修改分区表,调整各个分区的大小或布局。例如,可能需要增加根文件系统分区的大小,或者添加新的分区用于存储数据。 接下来,我需要考虑如何在内核中修改这些分区信息。如果是较老的内核版本,可能使用平台代码中的静态分区表,比如在arch/arm/mach-s3c24xx/mach-mini2440.c中定义。而较新的内核可能使用设备树(Device Tree)来定义分区。 用户可能需要指导如何找到相关的代码位置,如何修改分区的大小或偏移量,以及重新编译内核后如何验证分区是否正确应用。此外,还需要考虑Bootloader(如U-Boot)中的分区是否与内核一致,避免不匹配导致启动问题。 另外,用户可能遇到的问题是修改分区后系统无法启动,或者数据丢失。需要提醒他们在修改前备份重要数据,并确保分区表与文件系统格式匹配,比如使用正确的mtd工具更新文件系统。 还有,需要注意Nand Flash的擦除块大小和页大小,这些参数是否正确配置会影响分区的对齐和性能。例如,分区的大小应该擦除块大小的整数倍,否则可能导致擦除操作失败。 最后,可能需要指导用户如何通过/proc/mtd或dmesg日志来确认新的分区是否被正确识别,以及如何使用mtd-utils工具来操作新的分区,比如擦除、读写等操作。 总结来说,用户的需求可能是调整mini2440的Nand Flash分区,需要从内核代码或设备树中找到分区定义,修改后重新编译内核,并确保与Bootloader配置一致,同时注意硬件特性和数据备份。</think>--- 在Linux内核中修改mini2440开发板的NAND Flash分区配置,需要调整MTD(Memory Technology Device)子系统的分区定义。以下是详细步骤和关键注意事项: --- ### **1. 确认硬件参数** mini2440开发板通常配备**256MB NAND Flash**(例如K9F2G08U0C),其物理参数: - **页大小**:2KB(数据区)+ 64B(OOB区) - **块大小**:128页 = 256KB - **总块数**:2048块 --- ### **2. 定位内核中的分区定义** #### **(1)旧内核(平台代码方式)** 在`arch/arm/mach-s3c24xx/mach-mini2440.c`中定义静态分区表: ```c static struct mtd_partition mini2440_nand_part[] = { [0] = { .name = "u-boot", .size = SZ_256K, .offset = 0, }, [1] = { .name = "params", .offset = MTDPART_OFS_APPEND, .size = SZ_128K, }, [2] = { .name = "kernel", .offset = MTDPART_OFS_APPEND, .size = SZ_4M, }, [3] = { .name = "rootfs", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, // 剩余空间 } }; ``` #### **(2)新内核(设备树方式)** 在设备树文件(如`mini2440.dts`)中定义: ```dts nand@4E000000 { compatible = "samsung,s3c2440-nand"; reg = <0x4E000000 0x40>; partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; partition@0 { label = "u-boot"; reg = <0x0 0x40000>; }; partition@40000 { label = "params"; reg = <0x40000 0x20000>; }; partition@60000 { label = "kernel"; reg = <0x60000 0x400000>; }; partition@460000 { label = "rootfs"; reg = <0x460000 0x7BA0000>; }; }; }; ``` --- ### **3. 修改分区步骤** #### **(1)调整分区大小** 假设需要扩大根文件系统分区: ```diff - .size = SZ_4M, // 原内核分区 + .size = SZ_8M, // 修改后内核大小 // 或设备树版本 - reg = <0x60000 0x400000>; // 原4MB + reg = <0x60000 0x800000>; // 修改为8MB ``` #### **(2)添加新分区** 在分区表中插入数据存储区: ```c [4] = { .name = "userdata", .offset = MTDPART_OFS_APPEND, .size = SZ_16M, } ``` --- ### **4. 关键验证步骤** #### **(1)编译并烧写内核** ```bash make zImage -j4 sudo dd if=arch/arm/boot/zImage of=/dev/mtdblock2 ``` #### **(2)系统启动后验证** ```bash cat /proc/mtd # 预期输出: dev: size erasesize name mtd0: 00040000 00020000 "u-boot" mtd1: 00020000 00020000 "params" mtd2: 00800000 00020000 "kernel" # 修改后的8MB mtd3: 7BA0000 00020000 "rootfs" ``` --- ### **5. 注意事项** | 风险点 | 应对措施 | |------------------------|---------------------------------| | **分区覆盖Bootloader** | 确保`u-boot`分区的起始地址为0,大小足够 | | **擦除块对齐** | 所有分区大小必须是`erasesize`的整数倍 | | **文件系统适配** | 修改分区后需重新格式化对应区域 | | **U-Boot参数匹配** | 检查`bootcmd`中的内核加载地址是否匹配 | --- ### **6. 高级调试技巧** - **强制擦除NAND块**: ```bash flash_erase /dev/mtd3 0 0 ``` - **查看坏块信息**: ```bash nanddump -q -o /dev/mtd3 | grep "bad block" ``` - **手动写入测试**: ```bash nandwrite -p /dev/mtd3 test.img ``` --- ### **7. 常见问题解决** - **启动卡在`Loading Kernel...`**: - 检查内核分区大小是否足够容纳实际内核镜像 - 使用`mtd_debug`验证读写操作: ```bash mtd_debug read /dev/mtd2 0 0x800000 kernel.bin ``` - **文件系统挂载失败**: - 确认分区类型与文件系统匹配: ```bash ubiformat /dev/mtd3 -f rootfs.ubifs ``` --- 通过以上修改,可以灵活调整mini2440的NAND Flash存储布局。实际修改前建议备份原始数据,并验证每个分区的读写功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值