小编ult*_*use的帖子

为什么malloc()和printf()表示不可重入?

在UNIX系统中,我们知道malloc()是一种不可重入的函数(系统调用).这是为什么?

同样,printf()据说也是不可重入的; 为什么?

我知道re-entrancy的定义,但我想知道为什么它适用于这些函数.是什么阻止他们保证可以重入?

c unix operating-system reentrancy

37
推荐指数
3
解决办法
2万
查看次数

SoftIRQ和Tasklet之间的区别

在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行"下半部分"(较低优先级工作)的两种不同方法.我理解这一点(非常真实的需要).

不同的是,SoftIRQ是重要的,而Tasklet则不是.同样的SoftIRQ可以在不同的CPU上运行,而Tasklets不是这种情况.

虽然我从表面上理解这一点,但我无法理解这两个特征的要求.在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklets和SoftIRQs.

另外,Tasklets是在SoftIRQ上制作的?在我用LKML阅读的一本书中,有关删除Tasklets的争论.我完全搞砸了为什么要引入这样的功能?一些短视(没有冒犯意味着)?

任何关于此的指示都会有所帮助.

linux-kernel interrupt-handling softirq tasklet

21
推荐指数
2
解决办法
3万
查看次数

CPU如何找到ISR并区分设备

我应该先分享我所知道的一切 - 那就是完全混乱.关于这个主题有几个不同的问题,所以请不要生气:).

1)为了找到ISR,CPU具有中断号.在x86机器(286/386及以上)中,有一个带有ISR的IVT; 每个4字节大小的条目.所以我们需要将中断数乘以4才能找到ISR.所以第一堆问题是 - 我完全混淆了CPU接收中断的机制.为了引发中断,首先设备应该探测IRQ - 然后是什么?中断号在"IRQ"上向CPU传输?我还读过像数据总线上设置ISR地址的设备; 什么呢?覆盖ISR的设备的概念是什么?有人可以告诉我几个CPU轮询中断的示例设备吗?它在哪里找到它们的ISR?

2)如果两个设备共享IRQ(这是非常可能的),它们之间的CPU有何不同?如果两个设备同时引发相同优先级的中断怎么办 我知道会有相同类型和低优先级中断的屏蔽 - 但这种通信是如何在CPU和设备控制器之间发生的?我研究了PIC和APIC在这个问题上的作用,但是无法理解.

谢谢阅读.非常感谢您的回答.

interrupt irq isr apic

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

printf和scanf如何处理浮点精度格式?

请考虑以下代码段:

float val1 = 214.20;
double val2 = 214.20;

printf("float : %f, %4.6f, %4.2f \n", val1, val1, val1);
printf("double: %f, %4.6f, %4.2f \n", val2, val2, val2);
Run Code Online (Sandbox Code Playgroud)

哪个输出:

float : 214.199997,  214.199997, 214.20 | <- the correct value I wanted 
double: 214.200000,  214.200000, 214.20 |
Run Code Online (Sandbox Code Playgroud)

据我所知,它214.20具有无限的二进制表示.第一行的前两个元素具有预期值的近似值,但最后一个元素似乎根本没有近似值,这引出了以下问题:

如何做scanf,fscanf,printf,fprintf(等)函数将精度格式?

没有提供精确度,printf打印出一个近似值,但是%4.2f它给出了正确的结果.你能解释一下这些函数用来处理精度的算法吗?

c floating-point precision double

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

从 Coredump 中查找 UNIX 信号的来源

这是我心中长久以来悬而未决的问题。我看到 GDB 告诉我们导致进程终止的信号。

如何找到来自内核的信号源?

在两个不同的场合,我的两个应用程序收到了 SIGEMT 和 SIGUSR1。我知道生产中还有其他应用程序可以发送这些信号。

另外,我知道可以在正在运行的程序中看到发件人信息,并且数据将出现在 siginfo_t 结构中。但我没有那么奢侈,事实上我们根本没有处理这个信号的处理程序。

unix crash gdb coredump signals

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

4GB/4GB内核VM拆分

朋友们,

我看过Ingo Molnar的这篇文章,他是着名的Linux内核爱好者,他谈到4GB/4GB分割.

在这篇文章中,他说

使用4G/4G补丁,内核可以在4G/4G模式下编译,在这种情况下,内核有一个完整的独立4GB虚拟机,并且有用于用户空间的单独的完整(和每个进程)4GB虚拟机.

我的问题从这里开始:

  1. 我的假设是,在像Linux一样的单片内核中,进程的内核用户部分共享相同的PROCESS ADDRESS SPACE.因此,与Linux内核,它具有这种4G/4G补丁,我们有3/1拆分分别为用户虚拟空间和内核虚拟空间.
    事实上,内核的1GB虚拟空间映射在每个进程的虚拟地址空间中.简单来说,PROCESS ADDRESS SPACE是4GB,其中1GB分配给内核.这是真的吗?

  2. 通过问题中的文章 - 如果我的假设如1)是正确的 - 他是否意味着内核地址空间不再映射到PROCESS ADDRESS SPACE并且我们有一个不同的内核虚拟地址空间并且没有共享地址空间?
    那就是PROCESS ADDRESS SPACE是4GB而KERNEL ADDRESS SPACE是另一个4GB; 而不是PROCESS ADDRESS SPACE扩大到8GB,其中4GB是内核共享的.

我知道我听起来有点愚蠢:)

linux memory virtual kernel

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

为什么在 UNIX 中只分配最低的可用文件描述符?

在一次小组讨论中,我对这个问题很感兴趣——

为什么 UNIX 标准要求保证只为进程分配最低的可用文件描述符?

我能想到的唯一可能的答案是可扩展性。由于我们总是选择最不可用的描述符,描述符位图的使用部分大部分是密集的,因此数组的增长较慢。

我只是想知道是否还有其他我不知道的原因。

此外,如果我们知道给定的描述符比另一个更大/更小,我们是否有一些可以得出逻辑结论(我们可以在程序中使用的结论)的场景。我的理解虽然不允许使用这种技术,因为它不能保证描述符的年龄

c unix linux

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

在GDB中反汇编重载成员函数-C ++

有多个实现特定类的库-我不确定包含哪个库-我也没有make文件。

我想通过反汇编类的成员方法来直接在GDB中确认这一点。

如何在GDB中反汇编重载成员函数?

c++ gdb c++11 c++14

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

scheduler_tick - 从哪里调用Linux?

当处理器有机会获得内核代码并执行维护和调节工作时,我想了解中断机制.我所知道的是,定时器中断为操作系统提供了这种功能.

1)我想知道究竟什么是相关的中断号,以及在Linux情况下调用的第一个OS例程是什么.如果我知道文件和函数名称,那将会很好.

对于Linux,scheduler_tick是调用新任务的内核函数,但是未知的是谁调用scheduler_tick及其父代?

2)是否还有其他中断在Linux中调用scheduler_tick?他们是哪一个,如果有的话?

 /*
   This function gets called by the timer code, with HZ frequency.
   We call it with interrupts disabled.
 */

 void scheduler_tick(void)
 {
         int cpu = smp_processor_id();
         struct rq *rq = cpu_rq(cpu);
         struct task_struct *curr = rq->curr;
.......
Run Code Online (Sandbox Code Playgroud)

linux schedule interrupt

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

在调用者内部扩展callee的指导原则是什么(内联 - 编译器优化)

我的理解是编译器遵循某些语义来决定是否应该内联扩展函数.例如,如果被调用者无条件地(无if /élse-if返回)返回一个值,它可以在调用者本身中扩展.同样,函数调用开销也可以指导这种扩展.(我可能完全错了)

类似地,诸如高速缓存使用之类的硬件参数也可以在扩展中起作用.

作为程序员,我想了解这些语义和指导内联扩展的算法.最终,我应该能够编写(或识别)一个肯定会内联的代码(非内联).我并不是要覆盖编译器,或者我认为我能够比编译器本身更好地编写代码.问题是要理解编译器的内部.

编辑:由于我在工作中使用gcc/g ++,我们可以将范围限制在这两个范围内.虽然,我认为在这种情况下编译器会有几个共同点.

c c++ caching inline compiler-optimization

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

如果A <B,处理器如何计算

这可能是我脑子里一个愚蠢的问题,但我想我没有回答这个问题 -

如果A <B,处理器将如何找到?事实上还有其他的东西,比如A> B或A == B.

但如果我们解决A

我知道不同的处理器可能有不同的实现,但我想有一些高水平的想法这样做.

我相信,按位运算符的一些技巧应该这样做.

任何帮助将不胜感激.

comparison bit-manipulation operators

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