e820简介

本文系转载,原文地址:http://wangcong.org/blog/?p=320,其中附录部分为本人所加...


    e820是和BIOS的一个中断相关的,具体说是int 0x15。之所以叫e820是因为在用这个中断时ax必须是0xe820。这个中断的作用是得到系统的内存布局。因为系统内存会有很多段,每段的类型属性也不一样,所以这个查询是“迭代式”的,每次求得一个段。

    我们看内核源代码。主要涉及两个文件:arch/x86/boot/memory.c和arch/x86/kernel/e820_32.c。我们 已经很幸运了,这部分代码已经用C重写过了。你可能会奇怪,启动调用e820时我们还在实模式,怎么能用C呢?答案是,这里用的是16位的C。gcc早已 经支持.code16 gcc模式了。

    看detect_memory_e820()函数,里面就是e820的本质。它把int 0x15放到一个do-while循环里,每次得到的一个内存段放到struct e820entry里,而struct e820entry的结构正是e820返回结果的结构!而像其它启动时获得的结果一样,最终都会被放到boot_params里,e820被放到了 boot_params.e820_map。

如果你对struct e820entry还有疑问,你可以看一下arch/x86/kernel/e820_32.c::print_memory_map(),看看里面是怎么使用它的。

    当然了,在arch/x86/boot/memory.c里,你还会看到另外两个利用int 0x15查询内存的函数,不过用途不一样了。


附:

boot_params结构体定义,其中E820MAX定义为128:

  1. struct e820entry {
        __u64 addr;    /* start of memory segment */
        __u64 size;    /* size of memory segment */
        __u32 type;    /* type of memory segment */
    } __attribute__((packed));

  2. struct boot_params {
  3.     struct screen_info screen_info;         /* 0x000 */
  4.     struct apm_bios_info apm_bios_info;     /* 0x040 */
  5.     __u8  _pad2[12];                /* 0x054 */
  6.     struct ist_info ist_info;           /* 0x060 */
  7.     __u8  _pad3[16];                /* 0x070 */
  8.     __u8  hd0_info[16]; /* obsolete! */     /* 0x080 */
  9.     __u8  hd1_info[16]; /* obsolete! */     /* 0x090 */
  10.     struct sys_desc_table sys_desc_table;       /* 0x0a0 */
  11.     __u8  _pad4[144];               /* 0x0b0 */
  12.     struct edid_info edid_info;         /* 0x140 */
  13.     struct efi_info efi_info;           /* 0x1c0 */
  14.     __u32 alt_mem_k;                /* 0x1e0 */
  15.     __u32 scratch;      /* Scratch field! */    /* 0x1e4 */
  16.     __u8  e820_entries;             /* 0x1e8 */
  17.     __u8  eddbuf_entries;               /* 0x1e9 */
  18.     __u8  edd_mbr_sig_buf_entries;          /* 0x1ea */
  19.     __u8  _pad6[6];                 /* 0x1eb */
  20.     struct setup_header hdr;    /* setup header */  /* 0x1f1 */
  21.     __u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
  22.     __u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];  /* 0x290 */
  23.     struct e820entry e820_map[E820MAX];     /* 0x2d0 */
  24.     __u8  _pad8[48];                /* 0xcd0 */
  25.     struct edd_info eddbuf[EDDMAXNR];       /* 0xd00 */
  26.     __u8  _pad9[276];               /* 0xeec */
  27. } __attribute__((packed));


通过bios获取系统内存布局代码如下:

  1. static int detect_memory_e820(void)
  2. {
  3.     int count = 0;
  4.     u32 next = 0;
  5.     u32 size, id;
  6.     u8 err;
  7.     struct e820entry *desc = boot_params.e820_map;
  8.     do {
  9.         size = sizeof(struct e820entry);
  10.         /* Important: %edx is clobbered by some BIOSes,
  11.            so it must be either used for the error output
  12.            or explicitly marked clobbered. */
  13.         asm("int $0x15; setc %0"
  14.             : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
  15.               "=m" (*desc)
  16.             : "D" (desc), "d" (SMAP), "a" (0xe820));
  17.         /* BIOSes which terminate the chain with CF = 1 as opposed
  18.            to %ebx = 0 don't always report the SMAP signature on
  19.            the final, failing, probe. */
  20.         if (err)
  21.             break;
  22.         /* Some BIOSes stop returning SMAP in the middle of
  23.            the search loop.  We don't know exactly how the BIOS
  24.            screwed up the map at that point, we might have a
  25.            partial map, the full map, or complete garbage, so
  26.            just return failure. */
  27.         if (id != SMAP) {
  28.             count = 0;
  29.             break;
  30.         }
  31.         count++;
  32.         desc++;
  33.     } while (next && count < E820MAX);
  34.     return boot_params.e820_entries = count;
  35. }
这个函数执行完毕后,boot_params.e820_map就含有了系统内存布局图。
函数关键部分解释如下:
07 获取启动参数 boot_params里的 e820_map数组首地址。
15-18 通过中断0x15调用bios例程获得一个内存段的信息,这条语句是按照AT&T的汇编语法格式写的,具体语法可以查看相关资料。

pos机驱动,医保,刷卡,landi E820驱动安装,windows xp,7,10系统驱动32位、64位, 联迪系列产品驱动软件 2019/08/30 landi_win_drivers_v3.0.1 1.解决WIN10数据签名的问题 2.加入M56 2G OPEN的驱动 3.加入Q5 PRO RK平台的设备 4.加入安装出错时启用修复功能 5.加入多种安装与卸载等功能(功能未公开) 2019/06/19 landi_win_drivers_v2.8.24 修改VID为56F0(涉及到的设备有:U3)的串口驱动会蓝屏的问题 2019/04/30 landi_win_drivers_v2.8.23.exe 加入A8BASE的驱动 2019/03/26 landi_win_drivers_v2.8.22.exe 修改英文提示文字 2019/03/19 landi_win_drivers_v2.8.21.exe CDC驱动重新生成CAT文件 2019/03/15 landi_win_drivers_v2.8.20.exe 重签名 2019/02/20 landi_win_drivers_v2.8.19.exe 1.加入S180 2.修改M37的CDC驱动(DIAG->CDC) 2018/12/25 landi_win_drivers_v2.8.18_Build20181225 1.加入去MTP的C9,C10,C7 LITE,C8 LITE,C150,C151驱动 2.更新BOO5(QM90)的CDC驱动(DIAG->CDC) 2018/12/20 landi_win_drivers_v2.8.18_Build20181220 1.修改BOO5(QM90) BULK驱动打!号的问题 2018/12/12 landi_win_drivers_v2.8.18_Build20181212 1.加入B005(QM90)的支持 2018/11/27 landi_win_drivers_v2.8.18_Build20181127 1.加入M37的支持 2018/11/19 landi_win_drivers_v2.8.17_Build20181119.exe 1.加入QM30的驱动DIAG驱动ID(5661&MI_01) 2018/11/05 landi_win_drivers_v2.8.17_Build20181105.exe 1.中英文版本合并 2.加入C7 LITE USB驱动 3.修改搜索硬件ID找不到的问题 2018/10/15 landi_win_drivers_v2.8.16_CN_Build20181015.exe 修改BULK没有签名的问题 2018/10/10 landi_win_drivers_v2.8.16_CN_Build20181010.exe 修改C7硬件ID的调整 2018/09/25 landi_win_drivers_v2.8.16_CN_Build20180925.exe 1.加入C7,C150,M7N3(RT1050)设备驱动支持 2.在配置文件中写定中英文版本信息 2018/08/10 landi_win_drivers_v2.8.15_Build20180810.exe 1.修改M7N2(RT1050)安装打!号的问题 2018/08/07 landi_win_drivers_v2.8.15_Build20180807.exe 1.修改APOS烧片和正常驱动的整合 2.加入M7N2(RT1050)设备Vid : 0x26f1 Pid: 0x5672 2018/07/17 landi_win_drivers_v2.8.14_Build20180717.exe 1.解决BULK无法通信的问题 2018/07/02 landi_win_drivers_v2.8.14_Build20180702.exe 1.修改英文版繁体显示个别乱码的问题 2.不对驱动加入标识码 3.对5650的设备对MI00接口支持不好的问题 4.修改BULK驱动在QM30、50下会打!号的问题(第二次枚举时由于电源策略失败导致), 上次提交文件错误 5.取消自动更新的功能 2018/05/11 Setup_Landi_Win_Drivers.exe(此版本是在线安装包版本,如果没有网络,请先用landi_win_drivers_v2.8.14_Build20180516.exe的版本) landi_win_drivers_v2.8.14_Build20180516.exe 1.修改BULK驱动在第二次枚举时出现打!号的问题 2.驱动支持自动更新 3.修改驱动重复安装的问题 4.提交安装包 2018/04/23 landi_win_drivers_v2.8.13_ENG_Build20180327 更新英文版本与现有的中文版本一致 2018/03/27 landi_win_drivers_v2.8.13_Build20180327.exe 1.去掉MI_00接口的问题(在很多电脑会出现问题,建议在INF文件中两个都加进去) 2.加入C059(2G-OPEN)的驱动 3.修改安装程序支持中间SLEEP的设置,在安装过程中多次(其实2次就够了)安装,因为有的驱动安装要必须有先后顺序(比如:C059) 2018/03/14 landi_win_drivers_v2.8.12_Build2018031402.exe 1.更新波普的驱动 2.解决驱动签名过期的问题 3.修改提示文字 2018/02/09 landi_win_drivers_v2.8.12_Build20180209 1.增加波普驱动 2018/02/05 landi_win_drivers_v2.8.11_Build20180205 1.增加C5的硬件ID 2018/02/02 landi_win_drivers_v2.8.10_Build20180202 1.增加R1050设备的硬件ID 2.修改安装程序在个别WIN732位电脑上崩溃的问题 2018/01/05 landi_win_drivers_v2.8.9_Build20180105.exe 1.修改epaydl的硬件ID配置错误的问题 2017/12/12 landi_win_drivers_v2.8.9_Build20180102.exe 1.修改TIS调用规则 2.加入拉卡拉的驱动支持 3.加入C9的驱动支持 2017/12/04 landi_win_drivers_v2.8.8_Build20171204.exe 1.烧片驱动与联迪正常使用的驱动合并成一个安装程序 2017/11/17 landi_win_drivers_v2.8.7_Build20171117.exe 1.修改安装程序的结构 2.修改M模式安装选择有问题的BUG 2017/11/15 landi_win_drivers_v2.7.7_Build20171115.exe 1.加入QM50,QM30设备ID 2017/11/09 landi_win_drivers_v2.7.6_Build20171109.exe 1.修改在WIN7下人别PC会识别不了USB硬件ID接定简写的问题(添加&M_00) 2017/11/06 landi_win_drivers_v2.7.5_Build20171106.exe 1.加入搜索未安装的联迪驱动,如果存在未安装的驱动,程序会自动进行安装 2.中英文版本合并 2017/10/13 Landi_win_drivers_v2.7.4_ENG_Build20171013.exe 升级最新的英文版驱动安装包(与最新版2.7.4中文版同步) 2017/08/22 landi_win_drivers_v2.7.4_Build20170822.exe 1.分离出烧片驱动 2017/08/14 landi_win_drivers_v2.7.3_Build20170814.exe 1.修改界面上没有Q30、Q20选项 2017/08/10 landi_win_drivers_v2.7.2_Build20170810.exe 1.加入Q30USB的PIDVID 2.加入M35S蓝牙适配器PIDVID 2017/08/07 更新英文版与中文版为同一版本 2017/07/31 landi_win_drivers_v2.7.1_Build20170731 1.修改签名的问题 2.加入E5的复合设备PIDVID 2017/06/09 landi_win_drivers_v2.7_Build20170609 1.加入遗漏的APOS A8的PIDVID 2.修改会误卸载程序的问题 2017/06/01 landi_win_drivers_v2.7_Build20170601 1.安装程序INSTALL.EXE显示中英文字符跟随系统版本 2.修改驱动文件 的布局 3.加入VID_26F1&PID_565E的设备ID 2017/04/11 landi_win_drivers_v2.6_Build20170411 增加文档“APOS接电脑设备管理器只枚举出便携设备(MTP)的解决方法.docx” 2017/04/01 landi_win_drivers_v2.6_Build20170401 1、driverinf.ini里MTP部分序号错误,改正;2、MTP的inf里有一个id重复了,改正; 2017/03/17 landi_win_drivers_v2.5_Build20170317 1、合并8953新增的id;2、apos去除usbser驱动,改成diag驱动; 2017/03/02 landi_win_drivers_v2.4_Build20170302 在exe自动安装界面增加E350S 2017/02/23 landi_win_drivers_v2.3_Build20170223 usb2uart增加E350S、联迪自研一维扫描枪BR100-B01(CDC+U盘)、联迪自研二维扫描枪BR200-B01(CDC+U盘)、U3座机(单CDC)、工装特殊设备(单CDC); bulk增加E350S;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值