| qishun's profile躺在角落的孤独者PhotosBlogLists | Help |
躺在角落的孤独者我不敢停留在任何街口,不安全的因素充斥着这里的每个角落 |
|||||
|
|
November 09 VistaPE启动原理与数据配置
Windows Vista 启动过程在操作系统的定位和初始化的方式上与 Windows XP 有所不同。启动时首先是由 BIOS 加载可引导磁盘上的主引导记录 (MBR),可引导磁盘由 BIOS 中配置的引导顺序定义。MBR 接下来加载活动分区上的分区引导记录 (PBR)。在此之前的 Windows Vista 的启动过程相对于以前没有变化。 Windows Vista 与 XP 的差别是从 PBR 代码开始的,Windows Vista 的 PBR 代码不再查找 NTLDR。Windows Vista 中新的启动加载器是 BOOTMGR。BOOTMGR 是一个用于加载启动配置数据库 (BCD) 的组件,启动配置数据库接下来将加载操作系统加载器启动应用程序 Winload.exe。最后,Winload.exe 初始化 Windows Vista 内核。 上图说明了启动过程,可以将这一更改视为对如下两个要素的更改: ● 由以前的 Windows 版本中的 NTLDR 执行的两个主要操作现在由两个组件分开执行: ○ \Bootmgr:读取启动配置,包括设备和路径位置。 ○ \Windows\System32\Winload.exe:初始化内核。 ● 由以前的 Windows 版本中的 Boot.ini 存储的启动配置现在存储在一个位于以下位置的、基于注册表的数据库中: ○ \Boot\BCD:启动配置数据库 (BCD) BCD 是一个由 Bootmgr 使用的数据库,该数据库包含 boot.ini 的函数并位于活动分区【被激活引导的系统C盘】的启动目录\Boot中。Windows Vista 提供了 BCDEDIT.exe 命令行工具来管理 BCD 存储中项目,该工具位于 Windows Vista 分区的 \Windows\System32 目录中。BCD 使得在 Windows Vista 中不再需要 BOOT.INI,不过 BOOT.INI 仍将会出现在双启动系统中以便向后兼容。因为 BCD 首先引导到启动环境而非 NTLDR,所以不会验证 NTLDR 和 BOOT.INI 的位置,除非选中了旧版操作系统。BCD 存储是一个注册表配置单元,在 Windows Vista 中,运行 regedit.exe 时将加载此配置单元,但会在视图中隐藏它。该存储将被加载到以下的注册表位置:HKLM\BCD00000000。也可以通过从 \Boot 文件夹中加载该配置单元,从而在 WinRE 中手动查看该存储。C:\Boot 的目录含有BCD、BCD.LOG、BCD.LOG1、fixfat.exe、fixntfs.exe、memtest.exe文件及zh-CN、en-US、Fonts语言字体文件夹。 Bcdedit操作指令,编辑BCD文件Bcdedit 位于X:\Windows\system32\ "X:"为安装Vista的盘符。 储存操作指令 ==================== /createstore 创建一个新的空白启动配置数据文件。 bcdedit /createstore C:\Data\BCD 创建BCD启动配置数据文件储存到“C:\DATA\”文件夹。 /export 备份启动配置数据文件。 bcdedit /export "C:\Data\BCD Backup" 备份BCD启动配置文件到“C:\Data\”文件夹,并以“BCD Backup”命名。 /import 还原启动配置数据文件。 bcdedit /import "C:\Data\BCD Backup" 从“C:\Data\”文件夹恢复BCD启动配置文件。 储存项目操作指令 ==================== /copy 项目拷贝 操作系统启动项目的拷贝: bcdedit /copy {cbd971bf-b7b8-4885-951a-fa03044f5d71} /d "Copy of entry" /create 新建项目 创建操作系统载入程序项目的 NTLDR(Ntldr): bcdedit /create {ntldr} /d "Earlier Windows OS Loader" 创建存储器磁碟另外的选择项项目: bcdedit /create {ramdiskoptions} /d "Ramdisk options" 创建一个新的操作系统启动项目: bcdedit /create /d "Windows Vista" /application osloader 创建一个新的调试器: bcdedit /create {dbgsettings} /d "Debugger Settings" /delete 删除项目 删除指定的操作系统项目: bcdedit /delete {cbd971bf-b7b8-4885-951a-fa03044f5d71} 删除指定的操作系统项目但启动时不显示项目(彻底删除): bcdedit /delete {cbd971bf-b7b8-4885-951a-fa03044f5d71} /cleanup 删除指定的操作系统项目但启动时显示项目: bcdedit /delete {cbd971bf-b7b8-4885-951a-fa03044f5d71} /nocleanup 删除操作系统载入程序项目的 NTLDR: bcdedit /delete {ntldr} /f 项目选择操作指令 ==================== /deletevalue 删除项目选择项。 删除启动管理的bootmgr选择项项目: bcdedit /deletevalue {bootmgr} bootsequence 删除(WinPE)操作系统的数值开机项目: bcdedit /deletevalue winpe 删除来自指定的操作的 Windows PE 数值系统开机项目: bcdedit /deletevalue {cbd971bf-b7b8-4885-951a-fa03044f5d71} winpe /set 设定项目选择项数值。 设定操作系统“cbd971bf-b7b8-4885-951a-fa03044f5d71”引导分区“C”: bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} device partition=C: 指定的操作系统引导文件“ windows\ system 32\ winload.exe”: bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} path \windows\system32\winload.exe 设定“NX”为“OptIn”: bcdedit /set nx optin 更改系统名称 默认XP系统名称在Vista启动管理器中是"earlier version of Windows",更改: bcdedit /set {ntldr} Description "Windows XP Professional SP2" 默认Vista系统名称在Vista启动管理器中是"Microsoft Windows",更改: bcdedit /set {current} Description "Windows Vista 5456" 输出控制指令 ==================== /enum 在储存中的列表项目。 列出所有的操作系统载入程序启动项目: bcdedit /enum OSLOADER 列出所有的启动管理项目: bcdedit /enum BOOTMGR 列出默认的启动项目: bcdedit /enum {default} 列出指定的操作系统启动项目: bcdedit /enum {b38a9fc1-5690-11da-b795-e9ad3c5e0e3a} /v 列出所有活动的项目 bcdedit /enum ACTIVE /v 启动管理控制指令 ==================== /bootsequence 设定启动列表顺序。 设定二个操作系统项目和启动顺序: bcdedit /bootsequence {802d5e32-0784-11da-bd33-000476eba25f} {cbd971bf-b7b8-4885-951a- fa03044f5d71} {ntldr} 加入操作系统项目为启动列表最后项: bcdedit /bootsequence {802d5e32-0784-11da-bd33-000476eba25f} /addlast /default 设定默认启动项目。 设定默认启动项目: bcdedit /default {cbd971bf-b7b8-4885-951a-fa03044f5d71} 设定默认启动操作系统程序为 NTLDR: bcdedit /default {ntldr} /displayorder 设定哪一个系统启动显示多启动画面。 设定二个操作系统项目和在启动管理显示命令中被建立操作系统载入的程序 NTLDR: bcdedit /displayorder {802d5e32-0784-11da-bd33-000476eba25f} {cbd971bf-b7b8-4885-951a-fa03044f5d71} {ntldr} 把指定的操作系统项目加入启动管理显示命令结束: bcdedit /displayorder {802d5e32-0784-11da-bd33-000476eba25f} /addlast /timeout 设定启动暂停数值。 /toolsdisplayorder 设定命令在哪一个启动管理显示工具画面。 设定二个工具项目和内存诊断在那启动管理工具显示命令: bcdedit /toolsdisplayorder {802d5e32-0784-11da-bd33-000476eba25f} {cbd971bf-b7b8-4885-951a-fa03044f5d71} {memdiag} 把指定的工具项目加入启动的结束管理工具显示命令: bcdedit /toolsdisplayorder {802d5e32-0784-11da-bd33-000476eba25f} /addlast 为一个启动应用程序控制紧急处理服务的指令 ==================== /bootems 开启启动管理紧急处理服务: bcdedit /bootems {bootmgr} ON /ems 为目前的操作系统启动项目 EMS 开启: bcdedit /ems ON /emssettings 设定紧急处理服务参数。 设定 EMS 参数使用基本输出入系统设定: bcdedit /emssettings BIOS November 04 winpe操作硬盘分区
1.select disk 0 2.clean 3.create partion primary size=10000 4.select partion 1 5.active 6.format fs=ntfs 7.assign letter=C 8.exit 退出 xcopy /e 目录copy BOOT ,bootMGR 文件到c盘; November 03 石头与iphone间的事__attribute__ 详解From http://hi.baidu.com/cygnusnow/blog/item/8b82000f871fcf2f6159f3de.html GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 __attribute__ format 运行$gcc –Wall –c attribute.c attribute后,输出结果为: attribute.c: In function `test': 如果在attribute.c中的函数声明去掉__attribute__((format(printf,1,2))),再重新编译,既运行$gcc –Wall –c attribute.c attribute后,则并不会输出任何警告信息。 __attribute__ noreturn extern void exit(int) __attribute__((noreturn));extern void abort(void) __attribute__((noreturn)); 为了方便理解,大家可以参考如下的例子: //name: noreturn.c ;测试__attribute__((noreturn)) int test(int n) 编译显示的输出信息为: $gcc –Wall –c noreturn.c 警告信息也很好理解,因为你定义了一个有返回值的函数test却有可能没有返回值,程序当然不知道怎么办了! __attribute__ const extern int square(int n) __attribute__ ((const));... for (i = 0; i < 100; i++ ) { total += square (5) + i; } profiling void __cyg_profile_func_enter(void *this_fn, void *call_site); 其中,第一个参数this_fn是当前函数的起始地址,可在符号表中找到;第二个参数call_site是指调用处地址。 instrumentation constructor/destructor /* 把类似printf的消息传递给stderr 并退出 */extern void die(const char *format, ...) __attribute__((noreturn)) __attribute__((format(printf, 1, 2))); 或者写成 extern void die(const char *format, ...) __attribute__((noreturn, format(printf, 1, 2))); 如果带有该属性的自定义函数追加到库的头文件里,那么所以调用该函数的程序都要做相应的检查。 和非GNU编译器的兼容性 /* 如果使用的是非GNU C, 那么就忽略__attribute__ */#ifndef __GNUC__# define __attribute__(x) /*NOTHING*/#endif /* 函数声明 */void die(const char *format, ...) __attribute__((noreturn)) __attribute__((format(printf,1,2))); void die(const char *format, ...){ /* 函数定义 */} 更多的属性含义参考:http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html 变量属性(Variable Attributes) int x __attribute__ ((aligned (16))) = 0; 编译器将以16字节(注意是字节byte不是位bit)对齐的方式分配一个变量。也可以对结构体成员变量设置该属性,例如,创建一个双字对齐的int对,可以这么写: struct foo { int x[2] __attribute__ ((aligned (8))); }; 如上所述,你可以手动指定对齐的格式,同样,你也可以使用默认的对齐方式。如果aligned后面不紧跟一个指定的数字值,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。例如: short array[3] __attribute__ ((aligned)); 选择针对目标机器最大的对齐方式,可以提高拷贝操作的效率。 struct test { char a; int x[2] __attribute__ ((packed)); }; 其它可选的属性值还可以是:cleanup,common,nocommon,deprecated,mode,section,shared, tls_model,transparent_union,unused,vector_size,weak,dllimport,dlexport等, struct S { short f[3]; } __attribute__ ((aligned (8))); 该声明将强制编译器确保(尽它所能)变量类型为struct S或者more-aligned-int的变量在分配空间时采用8字节对齐方式。 struct S { short f[3]; } __attribute__ ((aligned)); 这里,如果sizeof(short)的大小为2(byte),那么,S的大小就为6。取一个2的次方值,使得该值大于等于6,则该值为8,所以编译器将设置S类型的对齐方式为8字节。 struct my_unpacked_struct 其它属性的含义见: struct p struct q int main() return 0; 输出结果: sizeof(int)=4,sizeof(short)=2.sizeof(char)=1 分析: sizeof(pp): 更详细的介绍见:http://gcc.gnu.org/ |
||||
|
|