小编Mar*_*ark的帖子

操作系统内核和主内存中的进程

继续我在操作系统开发研究方面的努力,我已经构建了一个几乎完整的图片.还有一件事让我望而却步.

根据我的理解,这是基本的启动过程:

1)BIOS/Bootloader执行必要的检查,初始化所有内容.

2)内核加载到RAM中.

3)内核执行其初始化并开始调度任务.

4)加载任务时,会为其提供一个虚拟地址空间.包括.text,.data,.bss,堆和堆栈.此任务"维护"自己的堆栈指针,指向其自己的"虚拟"堆栈.

5)上下文切换仅将寄存器文件(所有CPU寄存器),堆栈指针和程序计数器推入某个内核数据结构,并加载另一个属于另一个进程的集合.

在这个抽象中,内核是一个"母"过程,其中所有其他进程都是托管的.我试图在下图中表达我最好的理解:

在此输入图像描述

问题是,首先这个简单的模型是否正确?

其次,可执行程序如何识别其虚拟堆栈?是OS作业来计算虚拟堆栈指针并将其放在相关的CPU寄存器中吗?堆栈簿记的其余部分是由CPU弹出和推送命令完成的吗?

内核本身是否有自己的主堆栈和堆?

谢谢.

c linux ram operating-system kernel

12
推荐指数
2
解决办法
2084
查看次数

查找文件名中的数字并与其他人交叉引用它们

首先,我将快速描述我对此的动机和实际问题:
我经常处理大批量文件,更具体地说,我发现自己必须按照以下规则重命名:
它们可能都包含单词和数字,但仅限于一组数字正在递增而不是"常量".我需要提取那些只有那些数字并相应地重命名文件.例如:

Foo_1_Bar_2015.jpg
Foo_2_Bar_2015.jpg
Foo_03_Bar_2015.jpg
Foo_4_Bar_2015.jpg
Run Code Online (Sandbox Code Playgroud)

将被重命名:

1.jpg
2.jpg
3.jpg or 03.jpg (The leading zero can stay or go)
4.jpg
Run Code Online (Sandbox Code Playgroud)

所以我们开始的是一个带有std::wstring对象的向量,用于指定目录中的所有文件名.我敦促你停止阅读3分钟,并在继续我的尝试和问题之前考虑如何处理这个问题.我不希望我的想法在一个方向或另一个方向推动你,我总是发现新的想法是最好的.

现在,我有两种方法可以想到:

1)旧式C字符串操作和比较:
在我看来,这需要解析每个文件名并记住每个数字序列的位置和长度.这很容易存储在矢量中,或者存储在每个文件中.这很好用(基本上使用字符串搜索增加偏移量):

while((offset = filename_.find_first_of(L"0123456789", offset)) != filename.npos)
{
    size = filename.find_first_not_of(L"0123456789", offset) - offset;
    digit_locations_vec.emplace_back(offset, size);
    offset += size;
}
Run Code Online (Sandbox Code Playgroud)

之后我所拥有的是(位置,大小)对的向量,用于文件名中的所有数字,常量(通过使用动机中的定义)与否.
在此之后,随之而来的是混乱,因为您需要交叉引用字符串并找出需要提取的数字.这将随着文件数量(往往是巨大的)而呈指数增长,而不是提到每个字符串中的数字序列数.此外,不是非常易读,可维护或优雅.不行.

2)正则表达式

如果有正则表达式的使用,那就是这个.从第一个文件名中创建一个正则表达式对象,并尝试将其与下一个文件名匹配.成功?即时提取所需数量的能力.失败?添加有问题的文件名作为新的正则表达式对象,并尝试匹配现有的两个正则表达式.冲洗并重复.正则表达式看起来像这样:

Foo_(\d+)_Bar_(\d+).jpg
Run Code Online (Sandbox Code Playgroud)

或分别为每个数字序列创建一个正则表达式:

Foo_(\d+)_Bar_2015.jpg
Foo_1_Bar_(\d+).jpg
Run Code Online (Sandbox Code Playgroud)

其余的是蛋糕.随便继续匹配,在最好的情况下,它可能只需要一次通过!问题是......

我需要知道的是:

1)你能想到任何其他优越的方法来实现这一目标吗?几天来,我一直在撞墙.
2)尽管在第一种方法中字符串操作和矢量构造\破坏的成本可能很大,但与正则表达式对象的成本相比,它可能相形见绌.第二种方法,最坏的情况:与文件一样多的正则表达式对象.对于潜在的数千个文件,这会是灾难性的吗?
3)第二种方法可以根据两种可能性中的一种进行调整:很少有std::regex对象构造,很多regex_match调用或者反过来.哪个更昂贵,正则表达式对象的构造或尝试匹配字符串?

c++ regex string filenames

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

裸骨OS内核编程

我最近开始对操作系统的主题感兴趣.我有几件事情让我头疼,但我决定分开问题.

让我们假设我们正在为市场上出现的新指令集架构设计内核.没有C运行时库,没有任何东西.只有该ISA的兼容编译器.

据推测,这意味着内核程序员可用的唯一C构造只是基本赋值运算符,按位运算符和循环.它是否正确?

如果是这样,那么如何在最低级别实现主存储器I/O和进程调度等更复杂的事情?它们只能用纯装配实现吗?

那么,用C语言编写内核(例如Linux)意味着什么.内核的某些部分本身是用汇编语言编写的吗?

c linux assembly operating-system kernel

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

标签 统计

c ×2

kernel ×2

linux ×2

operating-system ×2

assembly ×1

c++ ×1

filenames ×1

ram ×1

regex ×1

string ×1