哈工大李治军老师操作系统实验之地址映射与共享

实验目的

  • 深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念
  • 实践段、页式内存管理的地址映射过程
  • 编程实现段、页式内存管理的内存共享,从而深入理解操作系统的内存管理

实验内容

  • 用Bochs调试工具跟踪Linux 0.11 的地址翻译(地址映射)过程,了解IA-21和Linux 0.11 的内存管理机制
  • 在Ubuntu上编写多进程的生产者-消费者程序,用共享内存作为缓冲区
  • 在信号量实验的基础上,为Linux0.11 增加共享内存功能,并将生产者-消费者程序移植到Linux 0.11当中。

实验过程

1. 跟踪Linux 0.11 的地址翻译过程

略,按照教程走就不会出现问题

2. 在Ubuntu上实现多进程的生产者-消费者出现,用共享缓冲区

这部分直接给出代码,主要是知道怎么调用函数。

//生产者producer.c
#define __LIBRARY__
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>

#define MAX_NUMBER 500
#define MAX_BUFFER 10

_syscall2(int, sem_open, const char*,name, unsigned int,value);
_syscall1(int, sem_wait, sem_t*, sem);
_syscall1(int, sem_post, sem_t*, sem);
_syscall1(int, sem_unlink, const char*, name);
_syscall3(int, shmget, int, key, size_t, size, int, shmflg);
_syscall3(int, shmat, int, shmid, const void *, shmaddr, int, shmflg);

int main(int argc, char * argv[]){
   
    sem_t* full = (sem_t*)sem_open("full", 0);
    sem_t* mutex = (sem_t*)sem_open("mutex", 1);
    sem_t* empty = (sem_t*)sem_open("empty", MAX_BUFFER);

    int position, shmid;
    int *data;
    int key = 9999;
    int i;

    shmid = shmget(key, (MAX_BUFFER+1)*sizeof(int), 0);
    data = (int*)shmat(shmid, 0, 0);
    /*
    printf("the shmid is %d, the data is %x\n", shmid, data);
    */

    for(i=0; i < MAX_NUMBER+1; i++){
   
        sem_wait(empty);
        sem_wait(mutex);

        position = (i % MAX_BUFFER);
        data[position] = i
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值