Answers:
请说明预期目标是什么,为什么?
Android手机具有自己的引导加载程序,无法通过其他方式覆盖。
它与PC的BIOS不同,您可以在其中将引导的顺序切换为从某些设备(例如Network PXE,USB,主/辅助HDD)引导。
在下面的评论之后,以及关于OP的问题
是否可以通过总线供电的USB驱动器来启动Android手机(例如具有USB OTG功能的手机)。
通用引导加载程序(*驻留在芯片组上)不具备USB等知识,因为lk(小内核)更关注陷阱击键,以便将其链式加载到恢复中或直接引导到Android环境中(在这种情况下,当按住Vol + Down键时)-用伪代码(这是从lk的上下文/方面来的,而且,关于如何读取分区的内存地址被硬编码到该lk中,因此它将知道如何处理逻辑!)
lk内核是高通公司针对MSM芯片组(Snapdragon)的事实上的标准,并被Sony,Motorola,LG,Samsung等制造商采用,可以在AOSP来源下找到bootable/bootloader
。
如果(是音量键按下?)然后
/recovery
分区链式加载到内存中的特定地址,然后跳转到该地址并开始执行,以恢复环境其他
/system
分区链式加载到内存中的特定地址,然后跳转到该地址并在执行Android环境时开始执行。万一。
由于lk中的内核非常有限,请考虑将内核的二进制映像刻录到芯片中,因此无法对其进行修改。而且还应该提到的是LK包含fastboot
了闪烁的准备方案/boot
,/recovery
,/system
和/data
分区。有两个引导顺序,即主要引导和辅助引导:
/boot
或/recovery
旁注:在改装时,Samsung很喜欢PBL / SBL(分别是Primary Boot Loader和Secondary Boot Loader)。关于三星的事情是,在某些手机中,PBL和SBL可能是加密的(三星Wave GT-S8500就是这样的一个例子,由于引导加载程序中的DRM简直是一场噩梦,将Android移植到它几乎是不可能的。进行处理并使其变得极为困难,但这是通过FOTA代码中的漏洞进行的工作!)
这就是为什么没有多余的功能(如OTG功能)或其他任何功能(如串行通信,从SDCard读取,图形等)的原因,因为这会使lk内核超出预期。换句话说,指定发生上述伪代码的是最小可能的内核大小。
另外,看它的另一种方式是这样的,这是依赖于Android的版本- USB OTG功能完全带到熟悉的主屏幕出现,当Android的环境中时,即再 OTG的功能被启用。不幸的是,从lk的角度来看并非如此。
如果您很好奇,这是上面lk上的Qualcomm条目,它是小型C源代码的一部分,该源代码包含并在JellyBean的AOSP源代码中找到了ARM程序集。bootable/bootloader/legacy/usbloader/main.c
int boot_linux_from_flash(void)
{
boot_img_hdr *hdr = (void*) raw_header;
unsigned n;
ptentry *p;
unsigned offset = 0;
const char *cmdline;
if((p = flash_find_ptn("boot")) == 0) {
cprintf("NO BOOT PARTITION\n");
return -1;
}
if(flash_read(p, offset, raw_header, 2048)) {
cprintf("CANNOT READ BOOT IMAGE HEADER\n");
return -1;
}
offset += 2048;
if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
cprintf("INVALID BOOT IMAGE HEADER\n");
return -1;
}
n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) {
cprintf("CANNOT READ KERNEL IMAGE\n");
return -1;
}
offset += n;
n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) {
cprintf("CANNOT READ RAMDISK IMAGE\n");
return -1;
}
offset += n;
dprintf("\nkernel @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
dprintf("ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size);
if(hdr->cmdline[0]) {
cmdline = (char*) hdr->cmdline;
} else {
cmdline = board_cmdline();
if(cmdline == 0) {
cmdline = "mem=50M console=null";
}
}
cprintf("cmdline = '%s'\n", cmdline);
cprintf("\nBooting Linux\n");
create_atags(ADDR_TAGS, cmdline,
hdr->ramdisk_addr, hdr->ramdisk_size);
boot_linux(hdr->kernel_addr);
return 0;
}
从某种意义上说,这是可能的。考虑到@ t0mm13b的答案中提到的限制,有理由认为所提到的引导加载程序(lk)无法执行此操作。因此,我们从启动fastboot
(用于测试)启动自定义内核,该内核将启动,启用OTG功能,并且一旦在已连接的OTG设备上找到有效内核,就将其链式加载到内存中并进行控制。甚至可以将其集成到TWRP等现代自定义恢复中,该恢复同时具有OTG和(在某些情况下)MultiROM支持。
实际上,已使用以下方法在Nexus 9平板电脑上引导Ubuntu:
fastboot boot <otg_chainloader_kernel>
<otg_chainloader_kernel>
引导并启用OTG,并等待OTG设备连接。<otg_chainloader_kernel>
在OTG设备上检测到有效的Linux内核,并将其链式加载到内存后将控制权交给该内核。现在,如果您愿意,可以以类似的方式启动兼容的Android ROM映像,但是请记住,在决定返回本机OS之前,必须保持OTG驱动器与设备的连接(因为将加载所有应用程序)除非所有Android ROM都可以配置为ramdisk(听说过Puppy Linux吗?),否则,所有数据都将被写入USB闪存驱动器,这要考虑到常见Android设备的当前内存容量和ROM本身目前不切实际)。在大多数具有统一数据/充电器端口的设备上,这也排除了在引导至OTG OS时进行充电的情况。
fastboot
s。该kexec-hardboot
由TWRP MultiROM使用的内核补丁基本上是OTG-Chainloader-Kernel
我谈。
它的可能性,我在我的宏cer iconia平板电脑上做到了!
将闪存驱动器连接到PC并格式化为fat32,使用rufus将iso / dd移植到闪存驱动器
将其连接到otg并插入手机/平板电脑。.按住电源键并调低音量(如果无法启动,请尝试按住电源键并调高音量)
然后使用音量键移至UDisk(您的闪存驱动器品牌)或SATA;UDISK(不一定是您的USB品牌,它可以说是USB存储设备),然后单击电源键进行确认
好吧,我在启动菜单时遇到了麻烦,所以我设法避免了内核启动,并因此停止了android的启动
我认为是这样的:我已连接到PC,然后从平板电脑上删除了所有组件,但复制了Android文件夹
内核被删除,启动后使用USB集线器连接回PC
希望我能帮到我:)