-
16 岁高中生成功将 Linux 移植到 iPhone,并贴出详细指南
2021-01-20 15:29:33近日,国外一名 16 岁的小开发者在 YouTube 上发布了一则视频,展示了自己是如何将 Linux 移植到一部无法使用的 iPhone 7。 2020 年 3 月,Corellium 提出了 Project Sandcastle,通过使用 checkra1n 越狱程序在 ...本文转载自 InfoQ,作者 李俊辰
如果你的旧 iPhone 已经无法支持你日常使用了,你会怎么处理这部 iPhone 呢?卖掉还是留起来收藏呢?近日,国外一名 16 岁的小开发者在 YouTube 上发布了一则视频,展示了自己是如何将 Linux 移植到一部无法使用的 iPhone 7。
2020 年 3 月,Corellium 提出了 Project Sandcastle,通过使用 checkra1n 越狱程序在 iPhone 上成功运行 Android,激发了开发者对那些旧型号的 iPhone 进行“改造”的热情。此后,很多开发者尝试对自己的旧设备进行“改造”,试图将 Linux 发行版移植到那些旧型号的 iPhone 上,为这些本该“吃灰”的设备延长寿命。
近日,国外一名 16 岁的小开发者 Daniel Rodriguez 成功地将 Linux Ubuntu 20.04 移植到了 iPhone 上。
图片来源于 xda-developers
据 Daniel 介绍,他使用的 iPhone 7 是他外婆的,这部设备已经完全无法访问 NVMe NAND,这意味着这部设备已经无法再运行 iOS 系统,就是大家常说的“变砖”,不过这部 iPhone 7 的硬件设备没有任何故障和损坏,于是 Daniel 拿来了这部手机,准备将它改造一番。
Daniel 参考并使用了 checkra1n,linux-sandcastle,projectsandcastle 等开源项目,同时自己编写了网桥设置 script/udev 规则来实现这一复杂的工作。最终成功地在这部 iPhone7 上运行了 Ubuntu 20.04。
Daniel 还在 Reddit 上分享了一份十分详细的指南,说明自己是如何成功制造出这部「iPhone 7 Ubuntu Edition」,有经验的开发者甚至可以直接按照该教程进行操作。而对于没有经验的用户,过程就会相对繁琐了不少,因为需要开发者事先手动编译内核并使用 checkra1n 访问 pongoOS 引导前执行环境。有兴趣的小伙伴可以移步 Reddit:
https://www.reddit.com/r/linux/comments/kux9xx/success_iphone_7_with_dead_nand_netbooting/
Daniel 表示,他自己在家里搭建了一组服务器,用于运行自己的俱乐部网站和游戏服务器。现在,他把改造后的 iPhone 7 当作一台服务器用来分担他的服务器的负载。而 iPhone 7 的 A10 芯片也发挥出了超乎 Daniel 想象的性能。
尝试将 Ubuntu 移植到 iPhone 7 上并不奇怪,因为该 Ubuntu 系统对于 Linux 内核并不陌生。此前的 postmarketOS 项目就是将 Linux 引入 iPhone 7 和 iPhone 7 Plus。虽然在 iPhone 上安装像 Ubuntu 这样的 GNU / Linux 发行版不会给用户带来与 iOS 相同的使用体验,但将旧设备改造并成功运行 Linux 无疑是一件很酷的事情。
他将改造成功的经历和指南发布到 Reddit 上后,迅速引发了广大开发者和用户的关注,很多用户称他为「天才」,不过 Daniel 却很谦虚,他表示,“这些都应该归功于 Corellium、checkra1n 项目的开发人员、Linus Torvalds 以及 Linux 内核的所有贡献者、Ubuntu 和 Debian 维护者等等。他们是为这个项目制作所有作品的真正英雄,而我只是恰好在 iPhone 上组装了这些前辈们留下的拼图。”
-
Win知识 - 程序是怎样跑起来的——系统调用和高级编程语言的移植性
2019-01-07 10:33:32操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。...操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的函数名,并不是time()和printf()。系统调用是在time()和printf()函数的内部执行的。大家可能会认为这个方法有些绕,不过这是有原因的。
C语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是Windows还是Linux,都能使用几乎相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码(图9-6)。
图9-6 高级编程语言的函数调用在编译后变成了系统调用
在高级编程语言中,也存在可以直接调用系统调用的编程语言。不过,利用这种方式做成的应用,移植性①并不友好(也俗称为有恶意行为的应用)。例如,直接调用Windows系统调用的应用,在Linux上显然是无法运行的。
Ps:①移植性指的是同样的程序在不同操作系统下运行时需要花费的时间等,费时越少说明移植性越好。
-
Android移植基础
2015-05-21 23:53:34Android视频课程,该课程可以让学员了解Android系统架构、学习如何下载Android源码、编译及开发Android、学习如何追踪Android源码、了解Linux内核启动流程、了解Android启动流程、学习如何移植外部函式库至Android... -
FreeRTOS STM32移植笔记
2013-10-26 22:11:08【1】其实说不上移植笔记,FreeRTOS已经移植至众多平台(MCU),包括MSP430,STM32等,这份笔记完全建立在官方代码的基础之上,简单的说就是修改一些设置从而完成一个呼吸灯实验。 【2】虽然有官方移植代码,但是...1.前言
【1】其实说不上移植笔记,FreeRTOS已经移植至众多平台(MCU),包括MSP430,STM32等,这份笔记完全建立在官方代码的基础之上,简单的说就是修改一些设置从而完成一个呼吸灯实验。
【2】虽然有官方移植代码,但是官方移植版本为STM32的V2.X库,与现在流行的V3.5有比较大的区别。本笔记也是总结网上几篇学习笔记,主要说明如果使用V3.5库,需要做哪些修改。
【3】编译软件为IAR EWARM 6.5。
【相关博文】
【FreeRTOS学习笔记——任务间使用队列同步数据】——如何使用FreeRTOS队列。
【如何在FreeRTOS下实现低功耗——MSP430F5438平台】——如何通过空任务实现系统低功耗。
2.FreeRTOS需要哪些文件
FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。
1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c
该文件位于FreeRTOS\Source
2)与内存分配有关的文件共有4个,分别是heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。
该文件位于FreeRTOS\Source\portable\MemMang
3)与移植相关的代码包括port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。
该文件位于FreeRTOS\Source\portable\IAR\ARM_CM3
4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。
该文件FreeRTOS\Source\include
3.必要的工程设置
开始之前需要引入V3.5库相关头文件,启动代码和CMSIS库。
在IAR中设置相关头文件的路径(应根据实际情况修改)
$PROJ_DIR$\CMSIS
$PROJ_DIR$\StdPeriph_Driver\inc
$PROJ_DIR$\User
$PROJ_DIR$\FreeRTOS\Source\include
$PROJ_DIR$\FreeRTOS\Source\portable\IAR\ARM_CM3
当然头文件的路径并不是绝对的,只要明确头文件在哪,设置正确路径即可。
除了设置C代码的相关头文件之外,还需要设置汇编代码的头文件路径,由于很少设置汇编代码头文件路径,往往初次移植FreeRTOS会在此处遇到一些“困难”。(当然也包括我)
由于portasm.s需要FreeRTOSConfig.h中的相关宏定义,所以要根据FreeRTOSConfig.h的位置来设置汇编代码的头文件路径,本例中FreeRTOSConfig.h位于User文件夹,所以设置如下图所示。
图1 设置ASM头文件搜索路径
4.修改启动代码
由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。具体修改如下所示。
图2 启动代码修改
请注意,在汇编代码中";"代表注释。EXTERN和C语言的extern含义相同——意为外部函数(变量)。
EXTERN __iar_program_start
EXTERN SystemInit
EXTERN vPortSVCHandler ;@
EXTERN xPortPendSVHandler ;@
EXTERN xPortSysTickHandler ;@
PUBLIC __vector_table
声明vPortSVCHandler,xPortPendSVHandler和xPortSysTickHandler为外部函数。
vPortSVCHandler对应SVC_Handler
xPortPendSVHandler对应PendSV_Handle
xPortSysTickHandle对应SysTick_Handle
5.代码实现
经过了以上修改之后,就可以轻松实现基于FreeRTOS的呼吸灯了。代码如下:
/* Standard includes. */ #include <stdio.h> /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" /* Library includes. */ #include "stm32f10x.h" #define LED0_ON() GPIO_SetBits(GPIOB,GPIO_Pin_0); #define LED0_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_0); static void prvSetupHardware( void ); static void vLEDTask( void *pvParameters ); void vLedInit(void); int main( void ) { /* 初始化硬件平台 */ prvSetupHardware(); /* 建立任务 */ xTaskCreate( vLEDTask, ( signed portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL ); /* 启动OS */ vTaskStartScheduler(); return 0; } /*-----------------------------------------------------------*/ void vLEDTask( void *pvParameters ) { for( ;; ) { LED0_ON(); vTaskDelay( 100/portTICK_RATE_MS ); LED0_OFF(); vTaskDelay( 100/portTICK_RATE_MS ); } } /*-----------------------------------------------------------*/ static void prvSetupHardware( void ) { vLedInit(); } /*-----------------------------------------------------------*/ void vLedInit( void ) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); /*LED0 @ GPIOB.0*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOB, &GPIO_InitStructure ); }
6.总结
本人觉得FreeRTOS使用比uCOS简单,虽然FreeRTOS资料远没有uCOS多,但是毕竟uCOS是一个收费产品,而FreeRTOS是一个开源的产品。后面还将会整理一些FreeRTOS的范例代码,希望和大家一起推动FreeRTOS的使用。
【代码链接】
【版本信息】IAR 6.5
7.参考资料
-
2.12.uboot的移植2-从uboot官方标准uboot开始移植
2016-02-25 22:30:40本课程为uboot学习的第12部分,从uboot官网下载的uboot开始进行移植,基本涉及到uboot移植的方方面面。本课程的目标不只是让大家理解uboot的代码结构和移植方法,更重要的在于实战演练和对大家移植时功力的提升和... -
从三星官方内核开始移植-uboot与系统移植第17部分
2016-02-25 23:01:50本课程为linux kernel移植的第4部分,从三星smdkv210开发板的官方移植内核出发针对X210开发板进行移植。因为内核的移植大多和驱动有关,因此这里的移植部分重点在于流程的引入和调试技巧的介绍,更多的内容要到驱动... -
2.11.uboot的移植1-从三星官方uboot开始移植
2016-02-25 22:24:53本课程为uboot学习的第11部分,以三星官方版本uboot为原材料来进行移植,适配我们的X210开发板。本课程的目标是对前面uboot分析的课程进行综合从而完成uboot的移植。 -
glib 移植依赖 libmount 移植
2018-06-11 17:58:29glib库的编译需要多种依赖,其中libmount依赖比较难找,在编译glib需要依赖,所以要先移植libmountglib库的编译需要多种依赖,其中libmount依赖比较难找,在编译glib需要依赖,所以要先移植libmount
-
MicroPython移植
2019-08-13 11:56:34MicroPython移植 1.目标板 stm32f407zgt6 2.下载移植准备 micropython源码 arm交叉编译工具 sudo apt-get install git sudo apt-get install gcc-arm-none-eabi mkdir MicroPython cd MicroPython git clone ... -
Contiki移植
2015-03-26 21:40:03Contiki移植 一.系统层次结构 一个基于Contiki嵌入式系统的层次结构如图1所示,很明显,移植Contiki主要的工作是开发对应硬件的“板级层”软件包,同时解决Make工程的各种错误。 图1 Contiki系统层次结构 二.... -
uboot移植与OS移植
2015-10-20 18:54:34Uboot移植: gec2440-2009.11移植实验(较旧的移植步骤) uboot SPL 加载uboot启动过程 及SPL移植介绍 uboot 访问jffs2文件系统 uboot移植添加目标板(很旧,新目录变化,复制最相近文件,修改不同... -
STM32移植 MQTT
2018-03-26 09:59:13stm32移植mqtt 下载MQTT的库:Paho https://github.com/eclipse/paho.mqtt.embedded-c 将MQTTPacket\src目录下的文件添加到工程 MQTTPacket\samples下的transport.c、transport.h添加到工程。 //接收数据,... -
ffmpeg移植
2018-10-17 19:51:09编译环境:ubuntu12.04 交叉编译器:arm-none-linux-gnueabi-gcc 4.4.1 ... 1.yasm移植(可选,yasm是汇编编译器,ffmpeg加入它是为了提高编译速度,可在x264配置时使用--disable-asm选择不使用) 2.x264移植 ... -
Python3版本移植到ARM的通用方法(一键移植)
2018-07-19 09:53:28看了很多资料介绍如何将python移植到嵌入式设备当中,但总感觉杂乱五章,还移植不成功,但是经过我的多方摸索,成功的探索出了一条阳光大道,供各位网友借鉴参考。 我采用的方法可以成功移植python2.7以后的所有... -
系统移植之bootloader移植
2017-06-30 17:52:25做boot移植工作之前,首先要确定整个boot的启动流程,根据启动流程确定移植步骤。 首先看一下boot的启动流程: Bootloader执行最基本的硬件初始化操作。如关闭中断,关闭看门狗以避免处理器被复位,以及关闭... -
MQTT 移植
2018-11-15 10:05:11https://blog.csdn.net/mzwhhwj/article/details/77939165?utm_source=copy MQTT移植 -
STM32移植LWIP官方demo
2018-04-06 11:50:27STM32移植LWIP官方demo本文使用的IDE是IAR7.2,考虑到很多很使用Keil,本文也有keil版本的说明欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转1、硬件说明主控:STM32F207VCT6,100管脚的封装网络PHY芯片... -
移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)
2016-09-28 08:54:40目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtopia ,但是目前 Qt 已经发展到最新的 5.7 版本了,我个人也已经使用了很长一段时间的 qt5.6 for windows ,本文就来介绍一下QT在嵌入式环境的... -
zip 移植
2018-04-20 14:53:18一、环境介绍 1.1 宿主机 1.2 嵌入式平台 1.3 交叉工具链 二、交叉编译 三、使用测试 一、环境介绍 1.1 宿主机 Ubuntu 1404 32 位 ...zip30移植所需源码包下载地址 二、交叉编译 ... -
RTL8211移植
2020-02-26 16:09:11对于网口驱动的移植,只要u-boot和kernel有支持的驱动,移植方法还是比较简单的。 u-boot中的RTL8211移植 对于PHY的移植,大多数情况下只需要修改config文件即可,但是也有例外,这时候我们就要仔细阅读芯片手册和... -
TouchGFX4.13移植及编程指南 - 源码分享 - cubemx5.5下的常规移植 及 RT-Thread的移植
2020-02-10 16:19:461、详细介绍了touchgfx4.13在cubemx5.5版本下的常规移植; 2、分享了一些touchgfx的开发思路; 3、介绍了如何移植别人的touchgfx工程到自己的工程中; 4、介绍了如何把工程迁移到RT-Thread; 5、给刚接触touchgfx的... -
PYNQ移植实记 三、框架移植
2019-04-10 15:16:01ZYNQ 7015系列板卡 pynq框架移植 By Dnknow.恒 三、框架移植 1、板级描述文件准备 在最小Soc创建完成之后,从Vivado工程目录中得到 \demo.runs\impl_1\demo_wrapper.bit \demo.sdk\demo_wrapper.hdf 两个文件... -
STM32F103移植mpu9250
2019-12-04 09:26:18STM32F103移植mpu9250的一些问题解决方法 -
Android驱动开发与移植实战详解,完整扫描版
2014-03-13 21:39:22李骏、陈小玉编著的《Android驱动开发与移植实战详解》分为18章,依次讲解了Android系统的基本知识, Linux内核的基本知识,分析了Android系统的源码,深入分析HAL层的基本知识,GoldFish下的驱动、MSM内核和驱动、... -
ucos移植
2013-09-09 18:41:54ucos移植前的准备——自己写一个调度的系统(一) ucos移植前的准备——自己写一个调度的系统(二) ucos在AVR ATmega32上的移植(一) ucos在AVR ATmega32上的移植(二) -
嵌入式Linux系统移植入门
2016-01-20 10:21:19本课程介绍嵌入式Linux系统移植的相关的,bootloader,内核分析与配置,文件系统知识。 -
LINUX移植——LED驱动移植
2013-09-01 21:57:52通过前两篇文章的介绍,我们已经把linux内核移植到了tiny210上,但是看到的现象都是通过超级终端来观察的,下面了,我们介绍一下led灯的移植,给大家一个更直观的感受。这篇文章主要的内容如下: 1.对平台总线的简介... -
移植opencv到嵌入式arm详细过程
2017-11-29 16:47:46所以,2017年末,记录了此次移植过程,移植版本比较新的可以看过来,可以让你少走弯路。 为了这东西,逃了两次云计算的课,都被抓到了。伤,,,,,,废话不多说,开搞: opencv,计算机视觉库。 openCV 2.2以后... -
初识Linux Kernel 移植 之 dm9621网卡驱动移植
2018-09-24 13:03:03初识Linux 驱动移植 -- dm921概述配置内核dm9621 网卡驱动编译配置选项问题探索读 dm9621 MAC 地址失败网卡反复断开重连 概述 将kernel移植到开发板并能正常加载和启动内核后,发现网卡并没有工作,因此将网卡作为...
-
【Django Rest framework】Serializers fields 篇翻译及应用举例
-
宾得Kx使用手册.pdf
-
《零起点TF与量化交易》源码.rar
-
windows下和unix linux下按enter回车的区别 记事本打开文件显示黑方块的原因.zip
-
2019网络空间安全国赛8080缓冲区溢出漏洞.rar
-
Spring Boot2.X仿朋友圈PC版系统实战_架构1.0
-
Redhat6.5安装Oracle11g.docx
-
python数据分析基础
-
Python入门到项目直通车
-
算法导论二(排序和顺序统计量)——编程大牛的必经之路
-
模型训练总结
-
MFC开发简单聊天程序
-
三维地图GIS大数据可视化
-
Matplotlib bar 柱状图
-
add.zip vue 三级联动
-
安装Office2010
-
SQL Server 2016 高可用灾备技术合集
-
Python程序设计大学教程第三版源代码练习课件PPT
-
2021-01-24
-
android笔试面试和实战课程