分段选择器什么时候出现在图片中.英特尔指南中的一行说:
"每个段描述符都有一个关联的段选择器.段选择器提供使用它的软件,其中包含GDT或LDT的索引(其相关段描述符的偏移量),全局/本地标志(确定选择器是否指向GDT或LDT)和访问权限信息."
我没理得.
是否有单独的段选择器寄存器?它是如何计算的?为什么我们需要它.
英特尔表示,复位后处理器处于实模式,软件初始化代码从0xFFFFFFF0H开始.我的问题:
如果处理器处于实模式,它如何访问内存> 1MB(0xFFFFFFF0H)
如何发生这种情况或当RAM <4GB(比如2GB)时会发生什么
如果BIOS映射到0x000FFFFFH,为什么处理器开始在0xFFFFFFF0H执行
请帮我解决这些问题.谢谢.
你好,我是内核开发新手,
创建了一个简单的程序:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kthread.h>
MODULE_LICENSE("Dual BSD/GPL");
int messager(void*);
struct task_struct* kthrstr;
static int start_module(void)
{
printk(KERN_INFO "Loading the messager\n");
kthrstr = kthread_create(messager,NULL,"MESSAGER");
wake_up_process(kthrstr);
return 0;
}
static void stop_module(void)
{
printk(KERN_INFO "Unloading the messager\n");
kthread_stop(kthrstr);
}
int messager(void* varg)
{
daemonize("MESSAGER");
allow_signal(SIGKILL);
while(1)
{
printk(KERN_INFO "Timeout: Hello");
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(10 * HZ);
if (signal_pending(current))
break;
}
return 0;
}
module_init(start_module);
module_exit(stop_module);
Run Code Online (Sandbox Code Playgroud)
模块正确加载,消息也按预期显示在syslog中.但是当使用rmmod卸载模块时,它会发生恐慌,如下所示.请帮助我确定发生了什么错误以及如何纠正:
[ 2207.466086] Timeout: Hello
[ 2215.756784] Unloading the messager
[ 2217.461846] BUG: unable …Run Code Online (Sandbox Code Playgroud) 另一个新手问题:
在下面的代码中,如果在调用'set_current_state'之后但在调用'schedule'之前线程被抢占了怎么办?再次安排代码时,是否从"schedule"调用开始并从运行队列中删除?或者这次忽略'schedule'调用并从set_current_state(TASK_RUNNING)语句开始?
{
...
set_current_state(TASK_INTERRUPTIBLE); /* suppose thread is preempted just after this function call */
schedule();
set_current_state(TASK_RUNNING);
...
}
Run Code Online (Sandbox Code Playgroud)