据说bios程序只能在实模式下才能看到,也知道bios是存放在ROM中的,但是CPU映射的通常是RAM,是不是说在实模式下,内存的一部分空间被映射到了ROM ,这样我们就可以看到bios程序了。
我的asm知识非常有限,我需要知道以下代码:
movl %%esp %0
Run Code Online (Sandbox Code Playgroud)
是%0代表寄存器,内存地址还是其他什么?什么%0意思?
众所周知,当访问存储器中不存在的页面可能导致页面错误时,写入只读页面也会导致页面错误?如何在异常处理程序中识别两种类型的页面错误?
IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自己恢复寄存器.例如,"movl"可用于恢复%esp寄存器,"jmp"可以跳转指向存储在堆栈上的EIP的地址.
linux内核通过IRET从所有中断返回,这是一个权重指令.
一些内核操作(如上下文切换)经常发生.
IRET不是浪费吗?
有人说
当PIC发送中断时,PIC将不会从同一源发送另一个中断,直到通过I/O端口确认.这是因为中断处理程序通常操纵关键数据结构,并且不会经受新自身调用的中断(即它们不是可重入的).
我不明白.同一来源和不同来源的中断之间有什么不同吗?
据说以"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可以被中断吗?
据说mmap()将文件映射到内存,并且它花费在调用进程的虚拟地址空间内存中.它是否真的将数据复制到内存中,或者数据是否仍存在于磁盘中?是mmap()不是更快read()?
在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)),当主线程终止时,其他线程是否还在运行?
毫无疑问,内核模式下的上下文切换被硬件中断或软件中断所困。众所周知,上下文切换应该保持原子性,但是如何实现原子性呢?众所周知,中断门会禁用所有中断(我不知道是否包含NMI)。中断门本身是否自然可以视为原子序列?
我写了以下代码:
#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错误.
我想知道如何使用宏制作我想要的东西?
众所周知,当所有帧都已满时,需要在页面需求中替换一些页面.但是,页面可以用作文本,rodata,数据,这些都是从磁盘I/O调用的,但页面如堆栈,程序堆只在内存中分配,磁盘中没有副本.我想知道堆栈和堆的页面是否涉及页面替换,如果是这样,它们是否应暂时交换到磁盘中?否则,它们应该固定在内存中吗?也许这个问题与具体实施密切相关,可以采用不同的策略,但我很想知道通常的做法.
我在我的计算机上安装了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) 众所周知的是ASM()是把汇编代码转换成C代码的方式,但它是在一些资源,"除非你使用ASM的'长表格’(),它正确地宣布为编译器C-说您的汇编代码的语言效果,您可能会面临很大的风险,即不同的编译器版本,不同的编译标志,甚至是对C代码的微小更改都可能产生灾难性的干扰影响." 我想知道asm()的"长形式"是什么?