如何将C程序编译为有效的ELF格式(或RAW格式),以便可以在没有任何操作系统的情况下直接从RAM执行?假设存在一个能够将代码加载到RAM中的任何位置并开始在该地址执行的引导加载程序.确切地说,编译器(GCC)标志应该是什么?是否需要地图文件?
欢迎使用示例helloworld应用程序:)
为了详细说明我的观点,
让main()方法成为一个空的无限while循环,以确保不使用OS特定的或标准的库调用.期望的o/p是一个悬念.使用通常的GCC选项,引导加载程序肯定无法加载可执行文件,因为它是无效的ELF格式.但是,通过将-dN选项传递给链接器将使其成为有效的ELF.需要更多编译器/链接器选项才能使其挂起而不会崩溃!这些编译器选项究竟是什么?
file.c:
int main()
{
while(1);
}
Run Code Online (Sandbox Code Playgroud)
编译
gcc -c -nostdinc -fno-builtin
file.c ld -dN -nostdlib file.o
Bootloader将a.out加载到RAM并执行.
我有一个想法创建我自己的手机锁应用程序类似于Android模式锁.每当手机启动/重启/手机,锁定/电话和解锁时,我都需要显示或启动我的应用程序.我不知道如何使应用程序显示而不是默认锁定屏幕并隐藏默认锁定屏幕.所以我的问题是:
什么是
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)这有用吗?
什么是
public class BootReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null) {
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
Intent s = new Intent(context,ViewPagerMainActivity.class);
s.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(s);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)这有用吗?
我正在编写一个通过网络启动系统的脚本.然后我需要在另一台主机上运行一些命令.我如何知道系统是否已开机?
我的编程语言是Perl,目标主机是RHEL5.
是否有任何内核中断或网络启动信息表明系统已启动且操作系统已加载?
[在另一种情况下]我也想知道以防我是否只是手动打开我的机器.什么时候才能确切地说已打开电源.何时OS应该完全启动以进行网络相关操作,例如在那里执行网络命令.如果系统在DHCP上,那么远程系统如何搜索这台机器怎么办[我猜它可以通过mac地址.但如果我错了].
如果我错过了任何信息,请随时问我.如果您有任何建议可以使任务更容易,请表明他们:)
thanx imkin
为什么IBM PC体系结构55 AA在引导签名的最后两个字节中使用幻数来进行引导签名?
我怀疑它与它们的位模式有关:01010101 10101010但是不知道是什么.
我的猜测是:
也许你们中的某个人可以帮助我回答这个唠叨的问题?
我记得我曾经读过一些有关这些位模式的内容,但不记得在哪里.而且它会出现在一些纸质书中,因为我在网上找不到任何关于它的东西.
我正在阅读:https : //www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf 我在第 8 页阅读了以下内容:
e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
最初的三个字节,十六进制为 0xe9、0xfd 和 0xff,实际上是 CPU 制造商定义的机器代码指令,用于执行无限跳转。
他们所说的“执行无休止的跳跃”是什么意思?
我试图更多地了解process 0,例如,它是否具有内存描述符(非NULL task_struct->mm字段),以及它与交换或空闲进程有什么关系。在我看来,在启动 cpu 上创建了一个“进程 0”,然后为每个其他 cpu 创建了一个空闲线程idle_threads_init,但我没有找到第一个(我假设是process 0)的创建位置.
更新
根据tychen 引用的live book,这是我对process 0(x86_64)的最新理解,有人可以确认/反驳以下项目吗?
init_task类型化的task_struct定义是静态的,随着任务的内核堆栈init_task.stack = init_stack,内存描述符init_task.mm=NULL和init_task.active_mm=&init_mm,其中堆栈区init_stack和mm_struct init_mm都静态定义。active_mm非空的事实意味着process 0是一个内核进程。还有,init_task.flags=PF_KTHREAD。init_stack的内核堆栈。这使得current宏有意义(自机器启动以来第一次),这使得fork()可能。在这一点之后,内核实际上运行 inprocess 0的上下文。start_kernel-> arch_call_rest_init-> rest_init,在这个函数内部,process 1&2是分叉的。在kernel_init为 调度的函数中,为每个其他逻辑 CPU 创建process …我正在使用x86机器上的引导加载程序.
当BIOS将MBR的内容复制到0x7c00并跳转到该地址时,寄存器的内容是否有标准含义?寄存器是否有标准值?
我知道段寄存器通常设置为0,但有时会为0x7c0.其他硬件寄存器怎么样?
我试图了解内核如何启动.我目前正在尝试将新内核移植到hTC Incredible S VIVO(s710e)设备,但我无法启动它.所以,我查看了设备的原始内核,并查看了一些文档,发现该设备使用了ATAG.现在,我有几个问题,我找不到明确的答案:
我用窗口8.1双启动了arch linux.安装后,第一次启动时,发生此错误.
Here is the error I found.
{ [0.063411] Ignoring BGRT: Invalid status 0 (expected 1)
starting version 218
Arch_Linux: clean, 70622/18677760 files, 1643393/74703025 blocks
[ 15.759913] nouveau E[ PIBUST][0000:01:00.0] HUBO: 0xffffffff (0x1a
[ 15.759952] nouveau E[ PIBUST][0000:01:00.0] GPCO: 0x00000001 (0x1a
[ 15.823494] nouveau E[ PBUS][0000:01:00.0] MMIO: 0x00000000 FAULT a
[ 15.824050] nouveau E[ DRM]Pointer to TMDS table invalid
[ 15.824072] nouveau E[ DRM]Pointer to flat panel table invalid}
Run Code Online (Sandbox Code Playgroud) 我是汇编语言的绿手.这些天我用bochs来模拟虚拟软盘的启动过程.但我不知道的一件事CS是系统初始化时寄存器值是什么.
;; init registers
org 0x7c00
BaseOfStack equ 0x7c00
Label_Start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack
;; clear screen
mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184h
int 10h
Run Code Online (Sandbox Code Playgroud)
上面的代码只是其中的一部分.ORG执行命令时,指令的CS寄存器值是多少mov ax, cs.它与0x7c00相同吗?谢谢.
下面是bochsrc配置:
romimage: file="$BXSHARE/BIOS-bochs-latest"
vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="myboot.img", status=inserted
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=15
cpu: ips=15000000
log: bochsout.txt
mouse: enabled=0 …Run Code Online (Sandbox Code Playgroud) boot ×10
bios ×3
assembly ×2
c ×2
linux-kernel ×2
android ×1
archlinux ×1
arm ×1
bare-metal ×1
bochs ×1
bootloader ×1
cpu ×1
graphics ×1
java ×1
linux ×1
lockscreen ×1
machine-code ×1
perl ×1
sector ×1
signature ×1
uptime ×1
window ×1
x86 ×1
x86-16 ×1