我正在尝试开发一个引导加载程序。但有一个部分我不明白。我知道当我的汇编文件中定义了 ORG 7C00 时,程序将加载到磁盘 7C00 上。我将其编译为二进制文件并在 Magic ISO 中创建了 iso 文件。然后,当我查看 ISO 文件的十六进制版本时,我看到我编写的代码是从 D800 地址开始的。不是应该安装在7C00吗?
org 0x7C00
bits 16
start:
cli
times 510 - ($ - $$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)
https://i.stack.imgur.com/TFVDE.png
我还有另一个问题。地址 D010 处还有另一个引导加载程序签名。为什么?
https://i.stack.imgur.com/dyZgl.png
另外,我还想知道一件事。我想将一些文件放入我的 ISO 文件中,并且想在此级别读取这些文件。我在 VirtualBox 中进行实验。如何读取 ISO 文件中的文件。或者我如何运行一个程序。所以我想做的就是将内核放置在这里并从引导加载程序加载它。
如果我错了,是否有资源详细说明如何加载引导加载程序以及如何加载 BIOS?
我被赋予了修复用C/C++编写的嵌入式操作系统的任务.正在使用的当前线程调度程序与循环调度非常相似,不同之处在于它缺少一个非常重要的特性,即中断线程然后返回执行的能力,从而创建可执行的"切片"执行时间.
我的问题是,如何中断运行代码,执行另一个任务然后优雅地返回执行?我相信这种行为需要特定于架构的汇编程序.这是操作系统将运行的芯片:http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code = MPC860
另一方面,这是航空电子软件,因此它必须是"确定性的".除此之外,没有堆使用,所有内存必须有界限.
当前系统是"周期性过程",其中下一个任务必须等待第一个任务完成.这很简单,如果操作系统的一部分崩溃,让我们说ATN堆栈,那么整个操作系统就会陷入困境.(在这里插入坠毁的飞机......虽然这是B级软件,这意味着如果系统飞机不会崩溃.)
这应该很简单.然而,它给了我地狱.
问题
我编译了最新的内核,当我重启我的盒子时,它会产生与文件系统相关的内核恐慌.
问题
如何让新内核识别VMWare文件系统?某些地方必须有一些设置让Linux安装知道"硬盘驱动器"不是真正的驱动器,而是实际上代表虚拟机的文件.
背景
首先,我不是Linux大师.这是我第一次编译内核.我为解决这个问题做了什么:
重启后,它失败并出现以下错误:
No volume groups found
Volume group "VolGroup00" not found
Unable to access resume device (/dev/VolGroup00/LogVol01)
mount: could not find filesystem '/dev/root'
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: …Run Code Online (Sandbox Code Playgroud) 我需要创建2个新的系统调用来设置并通过给定的pid从进程获取属性.我更改了task_struct,添加了int z_value(这是我需要设置/获取的)
我还设法为每个创建的进程设置默认的z_value(200).
当我运行get system call时,我可以看到默认的z_value正确.但是当我尝试设置z_value时没有任何反应.
没有编译错误,没有分段错误等.
这是我的系统调用.
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
asmlinkage void sys_set_z_value ( int user_value , pid_t pid )
{
rcu_read_lock();
struct task_struct *p = find_task_by_vpid(pid);
p->z_value = user_value;
rcu_read_unlock();
}
Run Code Online (Sandbox Code Playgroud) 我相信我可能会过度思考这个问题......我的文件系统上有一个文本文件,我在启动时解析它并将结果存储到一个结构数组中.我需要将这个数组从用户空间复制到内核空间(copy_from_user),并且必须随时由内核访问这些数据.内核空间中的数据需要由Sockets.c文件访问.是否有一个特殊的地方可以在内核空间中存储数组,或者我可以简单地在Sockets.c中添加对该数组的引用?我的C有点生疏......
谢谢你的建议.
我想找出处理写入/ sys/power/state的Linux内核(x86,2.6.18或类似)的源文件.我用Google搜索并尝试sysfs_create_file在源代码中搜索(和dir).但到目前为止我没有找到任何有用的东西.谁知道呢?谢谢!
我一直在为Windows做一些黑客攻击,当我做SIDT时遇到了一个事实.当我读SIDT时,我发现IDT限制的值是0xFFF(u4096).
我很惊讶地发现它.我的印象是最大描述符数是256.那么IDTR限制为何是0xFFF?
我的系统是I7在64位运行Win 7.
谢谢.
如何在内核中处理信令(中断)机制?我问的原因是:某种方式我的应用程序收到了SIGABRT信号,我想找到它来自哪里..
例如:
myapp.exe在001b:7c812afb模块kernel32.dll中导致Microsoft C++异常(0xe06d7363).
我出于好奇而问这个,因为我注意到在所有异常和崩溃中,这个数字(001b)始终保持不变,而后一个数字改变(我认为它保存了指令指针的值).
那么001b究竟是什么意思呢?
我/dev按照这里的教程(chardev.c)创建了一个节点,我尝试/dev/chardev使用以下代码访问我创建的设备:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h> //perror(), errno
#include <string.h>
#define RSIZE 50
int main()
{
int fd,err_save;
char receive_buff[RSIZE];
//open device and check for error msg
fd = open("/dev/chardev", "rw");
err_save = errno;
if (fd < 0)
{
perror("open perror");
printf("error opening device, fd = %d, err_save = %d \n", fd,err_save);
}
else
{printf("Device opened\n");}
//read device and check for error msg
//memset(receive_buff, 0, sizeof(receive_buff)); //<--- strange
read(fd, …Run Code Online (Sandbox Code Playgroud)