小编ven*_*s.w的帖子

bios和实模式

据说bios程序只能在实模式下才能看到,也知道bios是存放在ROM中的,但是CPU映射的通常是RAM,是不是说在实模式下,内存的一部分空间被映射到了ROM ,这样我们就可以看到bios程序了。

x86 operating-system kernel bios

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

asm代码包含%0,这是什么意思?

我的asm知识非常有限,我需要知道以下代码:

movl %%esp %0
Run Code Online (Sandbox Code Playgroud)

%0代表寄存器,内存地址还是其他什么?什么%0意思?

x86 assembly inline-assembly linux-kernel

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

页面错误,页面短缺或访问冲突?

众所周知,当访问存储器中不存在的页面可能导致页面错误时,写入只读页面也会导致页面错误?如何在异常处理程序中识别两种类型的页面错误?

x86 operating-system kernel exception-handling exception

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

从中断返回时必须使用IRET吗?

IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自己恢复寄存器.例如,"movl"可用于恢复%esp寄存器,"jmp"可以跳转指向存储在堆栈上的EIP的地址.

linux内核通过IRET从所有中断返回,这是一个权重指令.

一些内核操作(如上下文切换)经常发生.

IRET不是浪费吗?

linux x86 assembly operating-system linux-kernel

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

关于同一来源的中断的事情

有人说

当PIC发送中断时,PIC将不会从同一源发送另一个中断,直到通过I/O端口确认.这是因为中断处理程序通常操纵关键数据结构,并且不会经受新自身调用的中断(即它们不是可重入的).

我不明白.同一来源和不同来源的中断之间有什么不同吗?

linux kernel interrupt linux-kernel

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

锁前缀的范围是什么?

据说以"lock"为前缀的汇编指令是原子的.我想知道"锁定"是否只能影响一个汇编指令; 汇编指令本身不是原子的吗?

以下是linux内核中的原子函数示例:

static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
 { unsigned char c;
 __asm__ __volatile__(
 LOCK "subl %2,%0; sete %1" 
    :"=m" (v->counter), "=qm" (c) 
     :"ir" (i), "m" (v->counter) : "memory"); 
return c; }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,subl和sete可以被中断吗?

x86 assembly kernel linux-kernel

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

mmap真的会将数据复制到内存中吗?

据说mmap()将文件映射到内存,并且它花费在调用进程的虚拟地址空间内存中.它是否真的将数据复制到内存中,或者数据是否仍存在于磁盘中?是mmap()不是更快read()

c linux

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

在ac程序中,当主线程终止时整个进程是否终止?

在linux中,整个进程在主线程无论如何终止时终止,由函数exit()或从main返回.如果主线程从main()返回,它将返回到称为crt.o的"C运行时"或类似的东西.在crt.o中,其c代码如下:exit(main(argc,argv)); exit()
最终将被主线程调用,因此所有线程都会终止.

我的想法是否正确?

如果在crt.o exit()中被一个线程终止函数替换,如void thread_exit(int),它只能终止一个退出状态的线程,那么crt.o的c源代码就好像是thread_exit(main(argc, argv)),当主线程终止时,其他线程是否还在运行?

c unix multithreading process linux-kernel

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

在内核模式下切换上下文时如何保持原子性?

毫无疑问,内核模式下的上下文切换被硬件中断或软件中断所困。众所周知,上下文切换应该保持原子性,但是如何实现原子性呢?众所周知,中断门会禁用所有中断(我不知道是否包含NMI)。中断门本身是否自然可以视为原子序列?

linux x86 operating-system kernel linux-kernel

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

宏观替代

我写了以下代码:

#define GATE(name, num)do{\
  name##list[num] = #name;\
}while(0)

char* name[] = {"hello", "world", "byebye"};

int i;
for(i = 0; i < 3; i++)
{
    GATE(name[i],0);
}
Run Code Online (Sandbox Code Playgroud)

显然,我无法得到我想要的GATE(name[0],0)被替换的东西hellolist[0] = "hello",但是name[0]list[0] = "hello",这会导致gcc错误.

我想知道如何使用宏制作我想要的东西?

c linux macros

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

虚拟内存页面替换

众所周知,当所有帧都已满时,需要在页面需求中替换一些页面.但是,页面可以用作文本,rodata,数据,这些都是从磁盘I/O调用的,但页面如堆栈,程序堆只在内存中分配,磁盘中没有副本.我想知道堆栈和堆的页面是否涉及页面替换,如果是这样,它们是否应暂时交换到磁盘中?否则,它们应该固定在内存中吗?也许这个问题与具体实施密切相关,可以采用不同的策略,但我很想知道通常的做法.

x86 operating-system kernel memory-management

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

当我调用我的DBI模块时出错"无法在@INC中找到version.pm"

我在我的计算机上安装了DBI和DBD模块,但是当我执行perl脚本时,会出现"无法在@INC中找到version.pm"之类的错误.我的DBD有问题吗?还是需要安装一些依赖项?

我的操作系统是Redhat Linux,perl版本5.8.8,满足DBD安装的要求.

以下是@INC包含的内容:

/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl/5.8.7
/usr/lib/perl5/site_perl/5.8.6
/usr/lib/perl5/site_perl/5.8.5
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.7/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl/5.8.7
/usr/lib/perl5/vendor_perl/5.8.6
/usr/lib/perl5/vendor_perl/5.8.5
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8

locate version returns:
/opt/app/ora11g/product/11.2.0/client_1/perl/lib/5.10.0/version.pm
Run Code Online (Sandbox Code Playgroud)

perl cpan

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

什么是asm()的"长形式"?

众所周知的是ASM()是把汇编代码转换成C代码的方式,但它是在一些资源,"除非你使用ASM的'长表格’(),它正确地宣布为编译器C-说您的汇编代码的语言效果,您可能会面临很大的风险,即不同的编译器版本,不同的编译标志,甚至是对C代码的微小更改都可能产生灾难性的干扰影响." 我想知道asm()的"长形式"是什么?

c assembly

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