我最近开始了我的操作系统课程.据我所知,调度程序的工作是保存当前进程的上下文并加载下一个要运行的进程的上下文.但它是如何做到的呢?当进程被抢占时,一旦加载和执行调度程序(因为它也是程序),寄存器中的先前进程的上下文,PSW等将丢失.在加载自身之前如何保存上下文?
我碰到这个代码显示在阅读格式字符串利用此文章.
#include <stdio.h>
int main(void)
{
char secret[]="hack.se is lame";
char buffer[512];
char target[512];
printf("secret = %pn",&secret);
fgets(buffer,512,stdin);
snprintf(target,512,buffer);
printf("%s",target);
}
Run Code Online (Sandbox Code Playgroud)
使用以下输入执行它
[root@knark]$ ./a.out
secret = 0xbffffc68
AAAA%x %x %x %x %x %x %x //Input given
AAAA4013fe20 0 0 0 41414141 33313034 30326566
- [root@knark]$
Run Code Online (Sandbox Code Playgroud)
到目前为止我所理解的是,序列%x将继续打印当前地址以上的值%esp(我假设堆栈向下朝向较低地址增长).
我无法理解的是给定的输入存储在buffer数组中,该数组不能小于当前的512字节%esp.所以,输出如何可以包含41414141(的十六进制表示AAAA)只是4之后%x,即,刚好高于当前的4个地址%esp.我也很努力地盯着汇编代码,但我想我无法跟踪堆栈上字符串的操作.
我有一个场景要讨论Peterson算法:
flag[0] = 0;
flag[1] = 0;
turn;
P0: flag[0] = 1;
turn = 1;
while (flag[1] == 1 && turn == 1)
{
// busy wait
}
// critical section
...
// end of critical section
flag[0] = 0;
P1: flag[1] = 1;
turn = 0;
while (flag[0] == 1 && turn == 0)
{
// busy wait
}
// critical section
...
// end of critical section
flag[1] = 0;
Run Code Online (Sandbox Code Playgroud)
假设两个进程同时开始执行.P0设置flag [0] = 1并且死掉.然后P1开始.它的while条件将被满足为flag [0] = 1(由P0和turn = …
在加州大学伯克利分校的John Kubiatowicz(Kuby教授)关于操作系统的视频讲座中,他提到TLB命中并不意味着相应的页面在主内存中.页面错误仍然可能发生.
从技术上讲,TLB是页表条目的缓存,因为所有页表条目都没有在主内存中提供相应的页面.TLB也是如此.TLB命中可能会导致页面错误.
但根据教科书中给出的算法,我无法找到这样的案例.在TLB未命中内核上引用页表并更新TLB高速缓存以进行适当的地址转换.下一次TLB命中不能导致页面错误.当内核换出页面时,它会更新该页表条目的相应位并使相应的TLB无效,因此下一次TLB命中,直到页面加载到主内存中.
那么有人可以代表kuby教授的主张的正确性并指出一个案例,而不是TLB命中(TLB中找到的相应虚拟地址的翻译物理地址),可能会发生页面错误吗?
operating-system kernel memory-management cpu-architecture tlb
我参与了在Linux机器(Ubuntu)上支持C/C++(如SPOJ,UVA等)的在线编程判断.代码本身是用C++编写的.我必须防止服务器恶意代码.
我打算分两步实现安全性.
1.通过在具有受限环境的文件夹中对chroot系统调用执行代码进行监禁(沙箱).我遇到了一个实用程序Jailkit,但我认为单独的系统调用就足以完成我的工作,因为我不必监禁用户,只执行代码.为了在文件夹中创建运行时环境,我复制了以下文件以及用于创建受限shell的文件(仅允许内置shell)
$ ldd ./a.out
linux-gate.so.1 => (0x00f4c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x007a5000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00b80000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00e0c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00f7c000)
其中a.out是可执行的c ++文件.
遇到的问题:
i)我已经尝试过几个在监狱里运行良好的程序.但任何人都可以确认这些文件对于所有算法密集型代码都是足够的,即不需要显式处理任何系统调用.
ii)如果任何人都可以通过将提供给jail文件夹的运行时库限制为fork(),socket()等而不是代码所期望的,可以建议任何限制某些系统调用的方法.
iii)为了便于了解,我还复制了ldd /usr/bin/gcc和/ usr/bin/gcc所显示的文件.但我无法在监狱中使用gcc,
bash-4.1# /usr/bin/gcc try.c
gcc: error trying to exec 'cc1': execvp: No such file or directory
如何修复错误?
2.在ptrace的帮助下跟踪系统调用,如果它使用了一些可疑的系统调用,则杀死正在运行的代码.现在的问题是应该禁止哪些系统调用?我觉得限制fork(),vfork()和execve()会完成工作,因为每个程序都有一个时间限制(几乎不超过10秒).之后它将自动被杀死,除了fork(),vfork()之外没有其他方法可以创建另一个进程.但是既然我的想法受到了我的想象的束缚,如果有人有其他意见来弯曲这里的事情,那将会很棒.
所以基本上我担心i)和ii)指出"遇到的问题",并且如果有人能够想到在限制指向第二点之后的黑客入侵方式.
我正在尝试编写一个启动加载程序(hello world sort).我正在使用Bochs进行模拟(平台Linux-Ubuntu).但我无法为我的二进制文件制作可引导的iso.虽然在教程中使用了VFD(虚拟软盘)但它适用于Windows平台.这是我的bootloader代码(仅用于测试)
;*********************************************
; Boot1.asm
; - A Simple Bootloader for testing if cd is booting or not
;
; Operating Systems Development Tutorial
;*********************************************
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
Start:
cli ; Clear all Interrupts
hlt ; halt the system
times 510 - ($-$$) db 0 ; We have to be 512 bytes. Clear the rest of the bytes with 0 …Run Code Online (Sandbox Code Playgroud) 这是一个代码,用于打印2D数组的第一个元素的地址,然后添加1.尽管所有4个基址都相同,但由于它们的"类型"不同,它们的加法显然不会给出相同的结果.我可以找出一些类型(如果它们是正确的)但不是全部.
int main()
{
int array[4][3];
printf("array %u\n",array); //of type int(*)[3]
printf("array+1 %u\n",array+1);
printf("&array %u\n",&array); //....???
printf("&array+1 %u\n",&array+1);
printf("array[0] %u\n",array[0]); //of type int*
printf("array[0]+1 %u\n",array[0]+1);
printf("&array[0] %u\n",&array[0]); //....???
printf("&array[0]+1 %u\n",&array[0]+1);
}
Run Code Online (Sandbox Code Playgroud)
您能否详细解释每个基址的"类型",以便了解添加1后所涉及的指针算法.下面给出了gcc机器的示例输出,以供快速参考.
array 3214383040
array+1 3214383052
&array 3214383040
&array+1 3214383088
array[0] 3214383040
array[0]+1 3214383044
&array[0] 3214383040
&array[0]+1 3214383052
Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一个使用cusparse库的cuda程序.我收到链接错误:
kernel.cu.obj : error LNK2019: unresolved external symbol _cusparseSetMatIndexBase@8 referenced in function _main
Run Code Online (Sandbox Code Playgroud)
和cusparse库有很多相同的错误.我已经包含了"cusparse_v2.h".如何在编辑期间链接visual studio 2010中的cusparse库?
我遇到了这段代码:
#include<stdio.h>
void main()
{
int x;
float t;
scanf("%f",&t);
printf("%d\n",t);
x=90;
printf("%f\n",x);
{
x=1;
printf("%f\n",x);
{
x=30;
printf("%f\n",x);
}
printf("%f\n",x);
}
printf("%f\n",x);
}
Run Code Online (Sandbox Code Playgroud)
看了一眼,我认为它是标准中引用的一些未定义的输出:
警告:printf使用其第一个参数来决定跟随的参数数量以及它们的类型.它会变得混乱,如果没有足够的参数,如果它们是错误的类型,你会得到错误的答案.
但是输出结果并没有让我离开这个问题而不给它第二个想法.
(给出的输入是23).
23
0
23.000000
23.000000
23.000000
23.000000
23.000000
Run Code Online (Sandbox Code Playgroud)
为什么总是23.00000?编译器实际上在这里尝试做什么?而不是弄乱存储的值x,为什么它打印的值t?它是否有任何解释,因为似乎有一些关于这个未定义的输出(双关语)的定义.
我在32位机器上使用gcc编译器.
我必须逐个打开文件才能用C/C++阅读.文件的名称是in0,in1,in2,in3 .....我试图使用预处理器指令来创建文件名.我想要类似的东西.
for(int i=0;i<n;i++)
{
string inp_file="/path/"+"in"+APPEND(i); //to generate /path/in1 etc
open(inp_file);
}
Run Code Online (Sandbox Code Playgroud)
其中APPEND是MACRO.以来
#define APP(i) i
Run Code Online (Sandbox Code Playgroud)
可以生成价值
#define APP(i) #i
Run Code Online (Sandbox Code Playgroud)
可以将令牌转换为字符串.
我试图在很多方面将它们结合起来但却失败了.如何获得所需的结果,或者甚至可以用宏获得这样的结果?
我的代码在ubuntu上的php 5.3.2-1中运行良好.我最近将它移植到安装了XAMPP的Windows中.它使用php 5.3.8.我收到了错误.
Non-static method Following::getUpdates() should not be called statically, assuming $this from incompatible context
Run Code Online (Sandbox Code Playgroud)
什么是路?我应该更正我的代码来替换代码中每个地方的声明或者
是否有办法模拟旧的行为(php 5.3.2 with php.ini file)因为我不确定在纠正之后会有多少错误会被抛到我脸上它.
更新(代码示例)
public function actionIndex(){
if(yii::app()->user->isGuest){
$this->render('guestIndex');
}
else{
$dataProvider = Following::getUpdates(yii::app()->user->id); //genrerate data for the homepage of user i.e updates from followers
$this->render('userIndex',array('dataProvider'=>$dataProvider));
}
}
Run Code Online (Sandbox Code Playgroud)
在线获取错误$dataProvider = Following::getUpdates(yii::app()->user->id);
我正在使用yii框架.