# Segmentation exercise ```c= int bigdata[10000] int main() { int index=0; for (i=0; i<10000; i++) { check_and_increment(&bigdata[i]); } for (i=0; i<10000; i++) { printf("%d ", &bigdata[i]); } } int check_and_increment(int* p){ if (*p % 10 == 0) { *p ++; } return 0; } ``` This code is compiled into `test` executable ELF file. From the file we can gather the following information: ``` Code segment size: 8KiB Code segment offset in file: 0x1000 Global data symbols: bigdata - 32bit integer, size: 40000 bytes ``` Status of the physical memory: | Start | Stop | Status | -------- | -------- | -------- | 0x0000 | 0x0FFF | P3, Code Segment CS=1 | 0x1000 | 0x3FFF | Free | 0x4000 | 0x4100 | P3, Stack Segment SS=3 | 0x4101 | 0x8FFF | Free | 0x9000 | 0xAFFF | Free | 0xB000 | 0xFFFF | Kernel ## Scenario #1 The process `P0` is forked. Describe how the segment descriptor and the physical memory will look like after the following: - Code segment will be `CS=0` is fully loaded - Data segment `DS=1` is not loaded (not present) - Stack segment `SS=2` is not loaded (not present) - The code execution has not yet started :::spoiler One possible answer Status of the physical memory: | Start | Stop | Status | -------- | -------- | -------- | 0x0000 | 0x0FFF | P3, Code Segment CS=1 | 0x1000 | 0x2FFF | P2, Code Segment CS=0 | 0x3000 | 0x3FFF | Free | 0x4000 | 0x4100 | P3, Stack Segment SS=3 | 0x4101 | 0x8FFF | Free | 0x9000 | 0xAFFF | Free | 0xB000 | 0xFFFF | Kernel | #Segment | Base | Limit | Misc | | -------- | -------- | -------- | --------------- | | 0 | 0x1000 | 25600 | Code, Present | | 1 | | 40000 | Data, Not Present | | 2 | | | Stack, Not Present | Limit is expressed in bytes ::: ## Scenario #2 The process starts executing. When execution reaches line number 7, the Memory Management Unit (MMU) interrupts the CPU, claiming `SS=2` is not present. Explain what is happening and give some indications of what will the operating system do in order to resume the execution of the process. ## Scenario #3 After solving the previous scenario, the code continues until the line 15. When trying to do read from the memory position pointed by `p`, the MMU interrupts again. Explain what is happening and give some indications of what will the operating system do in order to resume the execution of the process. ## Scenario #4 In some other part of the code, the process tries to execute the next fragment of code: ```c= int* n; ... ... n[0] = 10; ``` The variable `n` is a pointer to integer, but is has not been initialized, therefore, its value is 0. If this variable has been assigned to `DS=3`, what would happen then? ###### tags: `SOA` `Segmentation`