标签: kernel

虽然我定义了 ORG 7C00,但 ISO 文件显示 D800

我正在尝试开发一个引导加载程序。但有一个部分我不明白。我知道当我的汇编文件中定义了 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?

x86 kernel nasm osdev bootloader

1
推荐指数
1
解决办法
63
查看次数

实时嵌入式操作系统的线程调度程序

我被赋予了修复用C/C++编写的嵌入式操作系统的任务.正在使用的当前线程调度程序与循环调度非常相似,不同之处在于它缺少一个非常重要的特性,即中断线程然后返回执行的能力,从而创建可执行的"切片"执行时间.

我的问题是,如何中断运行代码,执行另一个任务然后优雅地返回执行?我相信这种行为需要特定于架构的汇编程序.这是操作系统将运行的芯片:http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code = MPC860

另一方面,这是航空电子软件,因此它必须是"确定性的".除此之外,没有堆使用,所有内存必须有界限.

当前系统是"周期性过程",其中下一个任务必须等待第一个任务完成.这很简单,如果操作系统的一部分崩溃,让我们说ATN堆栈,那么整个操作系统就会陷入困境.(在这里插入坠毁的飞机......虽然这是B级软件,这意味着如果系统飞机不会崩溃.)

assembly multithreading kernel real-time

0
推荐指数
1
解决办法
792
查看次数

在VMWare Fusion下的RedHat Linux中引导时出现内核严重错误:找不到文件系统

这应该很简单.然而,它给了我地狱.

问题
我编译了最新的内核,当我重启我的盒子时,它会产生与文件系统相关的内核恐慌.

问题
如何让新内核识别VMWare文件系统?某些地方必须有一些设置让Linux安装知道"硬盘驱动器"不是真正的驱动器,而是实际上代表虚拟机的文件.

背景
首先,我不是Linux大师.这是我第一次编译内核.我为解决这个问题做了什么:

  • 从kernel.org下载内核版本2.6.34
  • 将源解压缩到目录中
  • 按照安装说明进行操作:
  • http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html
  • 基本上,运行:make menuconfig,make,make modules,make modules_install,make install,reboot
  • 我没有真正改变make menuconfig部分中的任何内容

重启后,它失败并出现以下错误:

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)

linux kernel redhat linux-kernel vmware-fusion

0
推荐指数
1
解决办法
2万
查看次数

我的系统调用无法正常工作

我需要创建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)

c linux kernel system-calls linux-kernel

0
推荐指数
1
解决办法
1101
查看次数

在Linux内核空间中存储struct数组

我相信我可能会过度思考这个问题......我的文件系统上有一个文本文件,我在启动时解析它并将结果存储到一个结构数组中.我需要将这个数组从用户空间复制到内核空间(copy_from_user),并且必须随时由内核访问这些数据.内核空间中的数据需要由Sockets.c文件访问.是否有一个特殊的地方可以在内核空间中存储数组,或者我可以简单地在Sockets.c中添加对该数组的引用?我的C有点生疏......

谢谢你的建议.

c linux kernel linux-kernel data-structures

0
推荐指数
1
解决办法
2691
查看次数

linux内核如何处理写入/ sys/power/state

我想找出处理写入/ sys/power/state的Linux内核(x86,2.6.18或类似)的源文件.我用Google搜索并尝试sysfs_create_file在源代码中搜索(和dir).但到目前为止我没有找到任何有用的东西.谁知道呢?谢谢!

linux kernel acpi sysfs

0
推荐指数
1
解决办法
2756
查看次数

IDTR限制超过256

我一直在为Windows做一些黑客攻击,当我做SIDT时遇到了一个事实.当我读SIDT时,我发现IDT限制的值是0xFFF(u4096).

我很惊讶地发现它.我的印象是最大描述符数是256.那么IDTR限制为何是0xFFF?

我的系统是I7在64位运行Win 7.

谢谢.

x86 kernel x86-64 windows-7

0
推荐指数
1
解决办法
268
查看次数

在内核中发送或处理linux信号的地方?

如何在内核中处理信令(中断)机制?我问的原因是:某种方式我的应用程序收到了SIGABRT信号,我想找到它来自哪里..

linux kernel signals abort

0
推荐指数
1
解决办法
695
查看次数

001b在"模块kernel32.dll在001b:7c812afb中的异常"中的含义是什么

例如:

myapp.exe在001b:7c812afb模块kernel32.dll中导致Microsoft C++异常(0xe06d7363).

我出于好奇而问这个,因为我注意到在所有异常和崩溃中,这个数字(001b)始终保持不变,而后一个数字改变(我认为它保存了指令指针的值).

那么001b究竟是什么意思呢?

windows kernel exception crash-reports cpu-registers

0
推荐指数
1
解决办法
880
查看次数

额外的memset()导致系统调用open()失败

/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)

c linux kernel system-calls memset

0
推荐指数
1
解决办法
630
查看次数