内存中的BIOS数据也不会被Linux改动,因为grep通过

2019-07-17 作者:小鱼儿玄机30码   |   浏览(161)

  有个门类,需求在Linux下不通过BIOS重启,i386平台。

一. Grep 说明

给厂商做了多少个Linux基础培养和练习,整理命令的时候开掘,就算Linux的bash utils大致有一千个指令,但实际上最常用的唯有35个。掌握了那三16个主导命令/工具/参数,完全能够应付一般的操作使用了。如下图:

Device Mapper(DM)是Linux 2.6健全引进的块设备新构架,通过DM能够灵活地保管种类中保有的望文生义或编造的块设备。

一、可行性深入分析

  grep (global search regular expression(RE) and print out the line)是一种庞大的文件搜索工具,它能利用正则表达式搜索文本,并把相称的行打字与印刷出来。

小鱼儿玄机30码 1

DM以块设备的花样登记到Linux内核中,凡是挂载(大概说“映射”)于DM结构下的块设备,不管他们是何许协会,如何报导,在Linux看来都以三个完整的DM块设备。因而DM让不相同团体情势的块设备或许块设备集群在Linux内核前边有一个全部统一的DM表示。

  有目共睹,BIOS中包括了CPU及其它种种设施的初始化代码,Linux系统运营之后是不是能够将各个应用的设备重返到刚被BIOS开端化后的情况是是还是不是有效的显要。

      Unix的grep家族包括grep、 egrep和fgrep。egrep和fgrep的命令只跟grep有极小不相同。egrep是grep的扩充,帮助越多的re元字符, fgrep就是 fixed grep或fast grep,它们把富有的假名都作为单词,也正是说,正则表达式中的元字符表示回其自身的字面意义,不再新鲜。

小鱼儿玄机30码 2

一、DM与MD

在Linux内核代码中(本文以2.6.33内核代码为参谋),DM指的是整整Device Mapper的宏图框架。MD(Mapped Device)是框架所虚构出来的种种设备。简单的说DM正是区别体系的MD经过特定的关系连接到块设备管理器上的大构架。

DM的基石代码聚集在drivers/md目录中。DM构架相关的代码在dm.c和dm-io.c文件中,各个抽象的MD设想设备代码分散在同目录的其余文件中,除了dm-ioctl.c是dm设置接口设备。

  从品类的尺度来看,外设而不成难题。因为要率先开起来的要命Linux只会用到磁盘系统。而通用的磁盘系统是不设有与开发银行相关的重大状态的。

      linux 使用GNU版本的grep。它效果与利益越来越强,可以经过-G、-E、-F命令行选项来行使egrep和fgrep的成效。

二、使用DMSetup

利用DM的工具是dmsetup。这么些命令帮助我们“组装”、“解散”、“监视”大家团结的设想存款和储蓄结构。具体的用法能够参谋这里 ,本文的目标是结合Linux内核源代码来窥探dm的运维机制。

在dmsetup的子命令中,create、load、reload子命令都满含 --table <table> 的参数,<table>字符串是创办dm设备的严重性,若非在命令行中以参数情势提交,则势必定要写在贰个table文件中传给dmsetup。

table字符串有如下方式:

<start> <length> <type> <arguments>

为了弄掌握那个参数,首先必须领悟,create、load、reload子命令总是将一个或一组一度存在的块设备A的一局地只怕全部虚拟称为块设备B。在基本代码中,块设备B(也是大家直接打交道的设备)称为mapped device,那一组块设备A中指定的那部分抽象(能够作为是大家将它交给dm来治本的那有个别)称为target device(s),对应的驱动为target driver。大家并不须求配备A必须是二个诚实的磁盘,它也足以是dm已经设想出来的别的一个mapped device。[2] 详尽的分解了mapped device、target driver和target device之间的关联。但是那篇小说并不曾根本分析源代码,而这是本文深入分析的首要性。

table字符串中的<start>和<length>是设备A中,交由dm管理的区域,单位是sector。也正是说,因而创建的mapped device刚好映射在源道具中偏移为start、长度为length的那个sectors中;<type>为target driver的门类,每一个type字符串都对应多少个target driver;<arguments>是用来创制target device的参数,那么些参数字传送递给target device的成立函数的款式就犹如命令行参数字传送递给int main(int argc, char *argv[])一样。

Linux内核自带的target driver有linear、stripe、mirror、multi-path、dm-crypt以及一组标准raid的驱动。接下来,大家以stripe的代码为例,来解释target driver是怎么着创制、运营target device的。

小鱼儿玄机30码 3

  其它正是骨干系统(CPU、内部存款和储蓄器初步化数据布满等)。CPU的景观时得以安装的,因此难题一般也比异常的小,将CPU重返实形式就可以。内部存款和储蓄器中的BIOS数据也不会被Linux改换,由此也不会有标题。

  grep在多个或两个文件中找出字符串模板。假若模板包蕴空格,则必须被引述,模板后的全数字符串被用作文件名。寻找的结果被送到荧屏,不影响原来的小说件内容。

二、Linux怎么注重启x86种类

  grep可用以shell脚本,因为grep通过重返八个动静值来注脚搜索的事态,假若模板搜索成功,则再次来到0,即便搜索不成事,则赶回1,若是找寻的文本空中楼阁,则赶回2。 利用那么些重回值就可进行部分自动化的文本管理专门的学业。

  查阅Linux内核(2.6.33)中i386的关机代码(arch/x86/kernel/reboot.c),该文件与重启相关的关键点有七个(按代码的先后顺序):第贰个是static int __init reboot_setup(char *str)函数和__setup("reboot=", reboot_setup);宏,这是在Linux运营时通过基础参数reboot=设置运营格局,记录到reboot_type变量中,默认为BOOT_KBD,即键盘运维。首个是从static const unsigned long long real_mode_gdt_entries [3] = ... 一直到 void machine_real_restart(const unsigned char *code, int length)函数,那是特意为x86系统规划的不经过电源系统急忙重启(直接跳到BIOS中重启)。第多个是static void native_machine_emergency_restart(void)函数,那是关机重启的后期,且与眼下的reboot_type呼应。要细心的是系统实施到此时已经倒闭了比方中断调控器、重新载入参数了机械钟、关闭了具备AP并确定保证接下去的代码都在独一的BSP上进行。

 

  首先将首先和第三点。第一点是运维时的reboot_type设置,它影响到了第三点中实际restart操作的作为。native_machine_emergency_restart函数是重启进程中最后的手续,i386种类重启最终都会走到这里来。这些函数的结构是二个死循环中带有三个switch(reboot_type)分支协会,假诺reboot_type选定的这种重启情势举行倒闭了(不荒谬景况下,这里调用的函数要是成功就不会回去了,直接导致系统重启。要是失败就能够回到),那么就把reboot_type设置为私下认可的BOOT_KBD,再来重启一回。

二.  grep正则表达式元字符集(基本集)

  键盘方式看来是最妥当最原始的重启格局,它的步子是如此的:

(1)^: 锚定行的启幕 如:'^grep'相配所有以grep初始的行。

  1. for (i = 0; i < 10; i ) {   
  2.     kb_wait();   
  3.     udelay(50);   
  4.     outb(0xfe, 0x64); /* pulse reset low */  
  5.     udelay(50);   
  6. }  

(2)$:锚定行的终止 如:'grep$'相配全体以grep结尾的行。

0x64端口是i8042键盘调控器的决定端口,0xfe命令字的意思是将P32-P21多少个针脚拉为低电平,持续6usec。这段代码的实效就也正是你按下机箱上的 RESET 键。

(3). :相称四个非换行符的字符 如:'gr.p'相称gr后接一个Infiniti制字符,然后是p。

小鱼儿玄机30码,  在那么些重启格局中,还可能有一种办法是BOOT_BIOS,调用的正是第三个关键点中的machine_real_restart函数,它将CPU再次来到到实情势,然后跳到CPU上电后的充裕地点(FFFF:0000),BIOS会在这么些地方处放一个jump,跳到BIOS真正的启幕处。

(4)*:相称零个或三个先前字符 如:'*grep'相配全部贰个或多个空格后紧跟grep的行。 .*共同用代表专断字符。

  显然笔者就足以一贯拿这一个函数开刀,把它改换成项目所须要的样板,如此一来,省去了再去写代码进行实格局切换的费力,间接用现存的。

(5)[]:匹配贰个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

三、解析和改建machine_real_restart函数

(6)[^]:相称二个不在钦定范围内的字符,如:'[^A-FH-Z]rep'相配不带有A-途锐和T-Z的二个字母初叶,紧跟rep的行。

  为了尽量少更换原有的代码,另开了贰个文本,将machine_real_restart函数和有关的结构体拷贝过来,然后稳步改。当然,那一个reboot文件也是要改的,正是再充实一种运维方式,笔者将它取名叫BOOT_MB宝马X5,在第一点和第三点有关的地点增添一种运维形式就能够。

(7)(..) :标志匹配字符,如'(love)',love被标识为1。

  接下去便是先导深入分析改换了。首先看那有些效果包涵哪些东西:

(8)< :锚定单词的先导,如:'\>

  1. static const unsigned long long  
  2. real_mode_gdt_entries [3] =   
  3. {   
  4.     0x0000000000000000ULL,  /* Null descriptor */  
  5.     0x00009b000000ffffULL,  /* 16-bit real-mode 64k code at 0x00000000 */  
  6.     0x000093000100ffffULL   /* 16-bit real-mode 64k data at 0x00000100 */  
  7. };   
  8. static const struct desc_ptr   
  9. real_mode_gdt = { sizeof (real_mode_gdt_entries) - 1, (long)real_mode_gdt_entries },   
  10. real_mode_idt = { 0x3ff, 0 };   
  11. static const unsigned char real_mode_switch [] =   
  12. {   
  13.     0x66, 0x0f, 0x20, 0xc0,         /*    movl  %cr0,

    本文由小鱼儿玄机30码发布于小鱼儿玄机30码,转载请注明出处:内存中的BIOS数据也不会被Linux改动,因为grep通过

    关键词: 小鱼儿玄机30码