首页 > 编程知识 正文

vllokup函数各个参数含义,呼吸机各个参数的含义

时间:2023-05-05 02:29:21 阅读:234832 作者:3487

通过/proc虚拟文件系统读取MTD分区表:cat /proc/mtd

mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
Creating 6 MTD partitions on "raspi":
0x00000000-0x00400000 : "ALL"
0x00000000-0x00030000 : "Bootloader"
0x00030000-0x00040000 : "Config"
0x00040000-0x00050000 : "Factory"
0x00050000-0x00360000 : "Kernel"
0x00360000-0x003b0000 : "DATA"

通过这个结构体可知size是本mtd分区的最大字节数空间 ,erasesize是本分区的最小擦除字节数空间(块大小,linux的flash是以块为擦除单位的) 。

下面是别人的文章:

具体由linux/drivers/mtd下的mtdcore.c文件中的mtd_read_proc函数来实现:

static inline int mtd_proc_info (char 俭朴的鸡翅buf, int i)
{
struct mtd_info 俭朴的鸡翅this = mtd_table[i];

if (!this)
return 0;

return sprintf(buf, "mtd%d: %8.8x %8.8x "%s"n", i, this->size,
this->erasesize, this->name);
}


static int mtd_read_proc (char 俭朴的鸡翅page, char 闪闪的帅哥start, off_t off, int count,
int 俭朴的鸡翅eof, void 俭朴的鸡翅data_unused)
{
int len, l, i;
off_t begin = 0;

mutex_lock(&mtd_table_mutex);

len = sprintf(page, "dev: size erasesize namen");
for (i=0; i< MAX_MTD_DEVICES; i++) {

l = mtd_proc_info(page + len, i);
len += l;
if (len+begin > off+count)
goto done;
if (len+begin < off) {
begin += len;
len = 0;
}
}

俭朴的鸡翅eof = 1;

done:
mutex_unlock(&mtd_table_mutex);
if (off >= len+begin)
return 0; return ((count < begin+len-off) ? count : begin+len-off);
}

读出来的结果如下:
dev: size erasesize name
mtd0: 01000000 00020000 "boot"
mtd1: 01000000 00020000 "setting"
mtd2: 02000000 00020000 "rootfs"
mtd3: 0be00000 00020000 "home"
mtd4: 00200000 00020000 "storage"
mtd5: 00040000 00010000 "u-boot"
mtd6: 00040000 00010000 "others"

其中size和erasesize的定义在linux/include/linux/mtd下mtd.h文件中的struct mtd_info结构体定义:
struct mtd_info {
u_char type;
u_int32_t flags;
u_int32_t size; // Total size of the MTD

/俭朴的鸡翅 "Major" erase size for the device. users may take this u_int32_t erasesize;
/俭朴的鸡翅 Minimal writable flash unit size. In case of NOR flash it is 1 (even u_int32_t writesize;

u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
u_int32_t oobavail; // Available OOB bytes per block

// Kernel-only stuff starts here.
char 俭朴的鸡翅name;
int index;

/俭朴的鸡翅 ecc layout structure pointer - read only ! 俭朴的鸡翅/
struct nand_ecclayout 俭朴的鸡翅ecclayout;

/俭朴的鸡翅 Data for variable erase regions. If numeraseregions is zero, int numeraseregions;
struct mtd_erase_region_info 俭朴的鸡翅eraseregions;

/俭朴的鸡翅 This stuff for eXecute-In-Place 俭朴的鸡翅/
int (俭朴的鸡翅point) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len, size_t 俭朴的鸡翅retlen, u_char 闪闪的帅哥mtdbuf);

/俭朴的鸡翅 We probably shouldn't allow XIP if the unpoint isn't a NULL 俭朴的鸡翅/
void (俭朴的鸡翅unpoint) (struct mtd_info 俭朴的鸡翅mtd, u_char 俭朴的鸡翅 addr, loff_t from, size_t len);


int (俭朴的鸡翅read) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len, size_t 俭朴的鸡翅retlen, u_char 俭朴的鸡翅buf);
int (俭朴的鸡翅write) (struct mtd_info 俭朴的鸡翅mtd, loff_t to, size_t len, size_t 俭朴的鸡翅retlen, const u_char 俭朴的鸡翅buf);

struct mtd_oob_ops 俭朴的鸡翅ops);
int (俭朴的鸡翅write_oob) (struct mtd_info 俭朴的鸡翅mtd, loff_t to,
struct mtd_oob_ops 俭朴的鸡翅ops);

/俭朴的鸡翅 int (俭朴的鸡翅get_fact_prot_info) (struct mtd_info 俭朴的鸡翅mtd, struct otp_info 俭朴的鸡翅buf, size_t len);
int (俭朴的鸡翅read_fact_prot_reg) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len, size_t 俭朴的鸡翅retlen, u_char 俭朴的鸡翅buf);
int (俭朴的鸡翅get_user_prot_info) (struct mtd_info 俭朴的鸡翅mtd, struct otp_info 俭朴的鸡翅buf, size_t len);
int (俭朴的鸡翅read_user_prot_reg) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len, size_t 俭朴的鸡翅retlen, u_char 俭朴的鸡翅buf);
int (俭朴的鸡翅write_user_prot_reg) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len, size_t 俭朴的鸡翅retlen, u_char 俭朴的鸡翅buf);
int (俭朴的鸡翅lock_user_prot_reg) (struct mtd_info 俭朴的鸡翅mtd, loff_t from, size_t len);

/俭朴的鸡翅 kvec-based read/write methods.
NB: The 'count' parameter is the number of _vectors_, each of
which contains an (ofs, len) tuple. int (俭朴的鸡翅writev) (struct mtd_info 俭朴的鸡翅mtd, const struct kvec 俭朴的鸡翅vecs, unsigned long count, loff_t to, size_t 俭朴的鸡翅retlen);

/俭朴的鸡翅 Sync 俭朴的鸡翅/
void (俭朴的鸡翅sync) (struct mtd_info 俭朴的鸡翅mtd);

/俭朴的鸡翅 Chip-supported device locking 俭朴的鸡翅/
int (俭朴的鸡翅lock) (struct mtd_info 俭朴的鸡翅mtd, loff_t ofs, size_t len);
int (俭朴的鸡翅unlock) (struct mtd_info 俭朴的鸡翅mtd, loff_t ofs, size_t len);

/俭朴的鸡翅 Power Management functions 俭朴的鸡翅/
int (俭朴的鸡翅suspend) (struct mtd_info 俭朴的鸡翅mtd);
void (俭朴的鸡翅resume) (struct mtd_info 俭朴的鸡翅mtd);

/俭朴的鸡翅 Bad block management functions 俭朴的鸡翅/
int (俭朴的鸡翅block_isbad) (struct mtd_info 俭朴的鸡翅mtd, loff_t ofs);
int (俭朴的鸡翅block_markbad) (struct mtd_info 俭朴的鸡翅mtd, loff_t ofs);

struct notifier_block reboot_notifier; /俭朴的鸡翅 default mode before reboot 俭朴的鸡翅/

/俭朴的鸡翅 ECC status information 俭朴的鸡翅/
struct mtd_ecc_stats ecc_stats;
/俭朴的鸡翅 Subpage shift (NAND) 俭朴的鸡翅/
int subpage_sft;

void 俭朴的鸡翅priv;

struct module 俭朴的鸡翅owner;
int usecount;

/俭朴的鸡翅 If the driver is something smart, like UBI, it may need to maintain int (俭朴的鸡翅get_device) (struct mtd_info 俭朴的鸡翅mtd);
void (俭朴的鸡翅put_device) (struct mtd_info 俭朴的鸡翅mtd);
}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。