By: Linus Torvalds (torvalds.delete@this.linux-foundation.org), September 22, 2021 11:50 am
Room: Moderated Discussions
sr (nobody.delete@this.nowhere.com) on September 22, 2021 6:55 am wrote:
>
> Why would segments need different page tables? What would
> be point of doing so instead of different processes?
A segment (or whatever you want to call it: as mentioned, people don't like some of the historical connotations, and depending on which part of the problem you care about you might want to call it a "capability pointer") is much more interesting if it gives you access to other peoples address spaces.
If it only partitions up an existing address space - like the x86 segments did - it means that segments are no good for data sharing. You can only share data if you share the page tables, so you don't actually get any advantage from using segments.
End result: all sane operating systems ended up saying "we'll just make segments the maximum size, and you can just use a flat address space to access all memory".
IOW, The i386 segments fundamentally didn't really add any functionality, they only made it more inconvenient to access memory.
The only time segments are useful is if they give you added capabilities. And no, "limiting access" is not really an added capability from a user standpoint, despite how many computer architects want to do it. You need to give people something, and in that context you can then add permissions as a part of the parcel. Not just say "this adds no other value than limit you".
So in the original 8086, people used segments - not because they liked them, but because segments was how you could access more than 64kB of memory.
In the 80286, people used segments - again not because they liked them, but because they could (repeat after me) access more than 64kB of memory, but also because they could use them to handle fragmented memory (the 286 segments were virtual addresses, not just extra phyiscal bits) and to implement security in the OS.
In the 80386 world? Nobody sane uses segments, because you can access the full address space without them, and you can do better security without them too. Paging is just so superior. Segments don't really add anything. They only make for problems, they don't make for solutions.
(Yeah, there is one special case: people use segments to get access to some thread-local storage. So honesty in advertising - segments are still used even in the 64-bit world, but they aren't actually used "as segments" - they are used pretty much purely as a thread-local base address pointer, and the "segment" use is really just a convenient special addressing mode).
But segments could be used to add something. You could use segments as a way to reach into another process' address space, and use them for controlled cross-process communication. Or on a kernel or VMM level, you could use segments as the way to access user memory or the virtual guest memory, or things like memory-mapped IO.
IOW, you could use segments to get a bigger address space, like they did in 8086.
That's not how 80386+ segments work, but other architectures have that kind of functionality (although they tend to be called "address spaces", not segments), where instead of having segment overrides like x86 has, they have address space bits in the instructions to do special loads from other memory domains.
Segments could do things like that. Would it be a good idea? Probably not - history really hasn't been gentle to the idea of having complicated memory indirection, and segments very much are just an "added indirection and complication". But things like that could at least make segments part of the solution rather than being part of the problem, like they mostly are now.
But back when segments very much were part of the solution, people pretty much universally hated them. They hated them on 8086, they hated them even more on 80286. And they weren't good in any other architecture either, it's just that at least on x86 they were successful.
Linus
>
> Why would segments need different page tables? What would
> be point of doing so instead of different processes?
A segment (or whatever you want to call it: as mentioned, people don't like some of the historical connotations, and depending on which part of the problem you care about you might want to call it a "capability pointer") is much more interesting if it gives you access to other peoples address spaces.
If it only partitions up an existing address space - like the x86 segments did - it means that segments are no good for data sharing. You can only share data if you share the page tables, so you don't actually get any advantage from using segments.
End result: all sane operating systems ended up saying "we'll just make segments the maximum size, and you can just use a flat address space to access all memory".
IOW, The i386 segments fundamentally didn't really add any functionality, they only made it more inconvenient to access memory.
The only time segments are useful is if they give you added capabilities. And no, "limiting access" is not really an added capability from a user standpoint, despite how many computer architects want to do it. You need to give people something, and in that context you can then add permissions as a part of the parcel. Not just say "this adds no other value than limit you".
So in the original 8086, people used segments - not because they liked them, but because segments was how you could access more than 64kB of memory.
In the 80286, people used segments - again not because they liked them, but because they could (repeat after me) access more than 64kB of memory, but also because they could use them to handle fragmented memory (the 286 segments were virtual addresses, not just extra phyiscal bits) and to implement security in the OS.
In the 80386 world? Nobody sane uses segments, because you can access the full address space without them, and you can do better security without them too. Paging is just so superior. Segments don't really add anything. They only make for problems, they don't make for solutions.
(Yeah, there is one special case: people use segments to get access to some thread-local storage. So honesty in advertising - segments are still used even in the 64-bit world, but they aren't actually used "as segments" - they are used pretty much purely as a thread-local base address pointer, and the "segment" use is really just a convenient special addressing mode).
But segments could be used to add something. You could use segments as a way to reach into another process' address space, and use them for controlled cross-process communication. Or on a kernel or VMM level, you could use segments as the way to access user memory or the virtual guest memory, or things like memory-mapped IO.
IOW, you could use segments to get a bigger address space, like they did in 8086.
That's not how 80386+ segments work, but other architectures have that kind of functionality (although they tend to be called "address spaces", not segments), where instead of having segment overrides like x86 has, they have address space bits in the instructions to do special loads from other memory domains.
Segments could do things like that. Would it be a good idea? Probably not - history really hasn't been gentle to the idea of having complicated memory indirection, and segments very much are just an "added indirection and complication". But things like that could at least make segments part of the solution rather than being part of the problem, like they mostly are now.
But back when segments very much were part of the solution, people pretty much universally hated them. They hated them on 8086, they hated them even more on 80286. And they weren't good in any other architecture either, it's just that at least on x86 they were successful.
Linus
Topic | Posted By | Date |
---|---|---|
POWER10 SAP SD benchmark | anon2 | 2021/09/06 03:36 PM |
POWER10 SAP SD benchmark | Daniel B | 2021/09/07 02:31 AM |
"Cores" (and SPEC) | Rayla | 2021/09/07 07:51 AM |
"Cores" (and SPEC) | anon | 2021/09/07 03:56 PM |
POWER10 SAP SD benchmark | Anon | 2021/09/07 03:24 PM |
POWER10 SAP SD benchmark | Anon | 2021/09/07 03:27 PM |
Virtually tagged L1-caches | sr | 2021/09/08 05:49 AM |
Virtually tagged L1-caches | dmcq | 2021/09/08 08:22 AM |
Virtually tagged L1-caches | sr | 2021/09/08 08:56 AM |
Virtually tagged L1-caches | Hugo Décharnes | 2021/09/08 08:58 AM |
Virtually tagged L1-caches | sr | 2021/09/08 10:09 AM |
Virtually tagged L1-caches | Hugo Décharnes | 2021/09/08 10:46 AM |
Virtually tagged L1-caches | sr | 2021/09/08 11:35 AM |
Virtually tagged L1-caches | Hugo Décharnes | 2021/09/08 12:23 PM |
Virtually tagged L1-caches | sr | 2021/09/08 12:40 PM |
Virtually tagged L1-caches | anon | 2021/09/09 03:16 AM |
Virtually tagged L1-caches | Konrad Schwarz | 2021/09/10 05:19 AM |
Virtually tagged L1-caches | Hugo Décharnes | 2021/09/10 06:59 AM |
Virtually tagged L1-caches | anon | 2021/09/14 03:17 AM |
Virtually tagged L1-caches | dmcq | 2021/09/14 09:34 AM |
Or use a PLB (NT) | Paul A. Clayton | 2021/09/14 09:45 AM |
Or use a PLB | Linus Torvalds | 2021/09/14 03:27 PM |
Or use a PLB | anon | 2021/09/15 12:15 AM |
Or use a PLB | Michael S | 2021/09/15 03:21 AM |
Or use a PLB | dmcq | 2021/09/15 03:42 PM |
Or use a PLB | Konrad Schwarz | 2021/09/16 04:24 AM |
Or use a PLB | Michael S | 2021/09/16 10:13 AM |
Or use a PLB | --- | 2021/09/16 01:02 PM |
PLB reference | Paul A. Clayton | 2021/09/18 02:35 PM |
PLB reference | Michael S | 2021/09/18 04:14 PM |
Demand paging/translation orthogonal | Paul A. Clayton | 2021/09/19 07:33 AM |
Demand paging/translation orthogonal | Michael S | 2021/09/19 09:10 AM |
PLB reference | Carson | 2021/09/20 10:19 PM |
PLB reference | sr | 2021/09/20 06:02 AM |
PLB reference | Michael S | 2021/09/20 07:03 AM |
PLB reference | Linus Torvalds | 2021/09/20 12:10 PM |
Or use a PLB | sr | 2021/09/20 04:32 AM |
Or use a PLB | sr | 2021/09/21 09:36 AM |
Or use a PLB | Linus Torvalds | 2021/09/21 10:04 AM |
Or use a PLB | sr | 2021/09/21 10:48 AM |
Or use a PLB | Linus Torvalds | 2021/09/21 01:55 PM |
Or use a PLB | sr | 2021/09/22 06:55 AM |
Or use a PLB | rwessel | 2021/09/22 07:09 AM |
Or use a PLB | Linus Torvalds | 2021/09/22 11:50 AM |
Or use a PLB | sr | 2021/09/22 01:00 PM |
Or use a PLB | dmcq | 2021/09/22 04:07 PM |
Or use a PLB | Etienne Lorrain | 2021/09/23 08:50 AM |
Or use a PLB | anon2 | 2021/09/22 04:09 PM |
Or use a PLB | dmcq | 2021/09/23 02:35 AM |
Or use a PLB | ⚛ | 2021/09/23 09:37 AM |
Or use a PLB | Linus Torvalds | 2021/09/23 12:01 PM |
Or use a PLB | gpd | 2021/09/24 03:59 AM |
Or use a PLB | Linus Torvalds | 2021/09/24 10:45 AM |
Or use a PLB | dmcq | 2021/09/24 12:43 PM |
Or use a PLB | sr | 2021/09/25 10:19 AM |
Or use a PLB | Linus Torvalds | 2021/09/25 10:44 AM |
Or use a PLB | sr | 2021/09/25 11:11 AM |
Or use a PLB | Linus Torvalds | 2021/09/25 11:31 AM |
Or use a PLB | sr | 2021/09/25 11:52 AM |
Or use a PLB | Linus Torvalds | 2021/09/25 12:05 PM |
Or use a PLB | sr | 2021/09/25 12:23 PM |
Or use a PLB | rwessel | 2021/09/25 03:29 PM |
Or use a PLB | sr | 2021/10/01 12:22 AM |
Or use a PLB | rwessel | 2021/10/01 06:19 AM |
Or use a PLB | David Hess | 2021/10/01 10:35 AM |
Or use a PLB | rwessel | 2021/10/02 04:47 AM |
Or use a PLB | sr | 2021/10/02 11:16 AM |
Or use a PLB | rwessel | 2021/10/02 11:53 AM |
Or use a PLB | Linus Torvalds | 2021/09/25 11:57 AM |
Or use a PLB | sr | 2021/09/25 12:07 PM |
Or use a PLB | Linus Torvalds | 2021/09/25 12:21 PM |
Or use a PLB | sr | 2021/09/25 12:40 PM |
Or use a PLB | nksingh | 2021/09/27 09:07 AM |
Or use a PLB | ⚛ | 2021/09/27 09:02 AM |
Or use a PLB | Linus Torvalds | 2021/09/27 10:20 AM |
Or use a PLB | Linus Torvalds | 2021/09/27 12:58 PM |
Or use a PLB | dmcq | 2021/09/28 10:59 AM |
Or use a PLB | sr | 2021/09/25 10:34 AM |
Or use a PLB | rwessel | 2021/09/25 03:44 PM |
Or use a PLB | sr | 2021/10/01 01:04 AM |
Or use a PLB | rwessel | 2021/10/01 06:33 AM |
I386 segmentation highlights | sr | 2021/10/04 07:53 AM |
I386 segmentation highlights | Adrian | 2021/10/04 09:53 AM |
I386 segmentation highlights | sr | 2021/10/04 10:19 AM |
I386 segmentation highlights | rwessel | 2021/10/04 04:57 PM |
I386 segmentation highlights | sr | 2021/10/05 11:16 AM |
I386 segmentation highlights | Michael S | 2021/10/05 12:27 PM |
I386 segmentation highlights | rwessel | 2021/10/05 04:20 PM |
Or use a PLB | JohnG | 2021/09/25 10:18 PM |
Or use a PLB | ⚛ | 2021/09/27 07:37 AM |
Or use a PLB | Heikki Kultala | 2021/09/28 03:53 AM |
Or use a PLB | rwessel | 2021/09/28 07:29 AM |
Or use a PLB | David Hess | 2021/09/23 06:00 PM |
Or use a PLB | Adrian | 2021/09/24 01:21 AM |
Or use a PLB | dmcq | 2021/09/25 12:41 PM |
Or use a PLB | blaine | 2021/09/26 11:19 PM |
Or use a PLB | David Hess | 2021/09/27 11:35 AM |
Or use a PLB | blaine | 2021/09/27 05:19 PM |
Or use a PLB | Adrian | 2021/09/27 10:40 PM |
Or use a PLB | Adrian | 2021/09/27 10:59 PM |
Or use a PLB | dmcq | 2021/09/28 07:45 AM |
Or use a PLB | rwessel | 2021/09/28 07:45 AM |
Or use a PLB | David Hess | 2021/09/28 12:50 PM |
Or use a PLB | Etienne Lorrain | 2021/09/30 01:25 AM |
Or use a PLB | David Hess | 2021/10/01 10:40 AM |
MMU privileges | sr | 2021/09/21 11:07 AM |
MMU privileges | Linus Torvalds | 2021/09/21 01:49 PM |
Virtually tagged L1-caches | Konrad Schwarz | 2021/09/16 04:18 AM |
Virtually tagged L1-caches | Carson | 2021/09/16 01:12 PM |
Virtually tagged L1-caches | anon2 | 2021/09/16 05:16 PM |
Virtually tagged L1-caches | rwessel | 2021/09/16 06:29 PM |
Virtually tagged L1-caches | sr | 2021/09/20 04:20 AM |
Virtually tagged L1-caches | --- | 2021/09/08 02:28 PM |
Virtually tagged L1-caches | anonymou5 | 2021/09/08 08:28 PM |
Virtually tagged L1-caches | anonymou5 | 2021/09/08 08:34 PM |
Virtually tagged L1-caches | --- | 2021/09/09 10:14 AM |
Virtually tagged L1-caches | anonymou5 | 2021/09/09 10:44 PM |
Multi-threading? | David Kanter | 2021/09/09 09:32 PM |
Multi-threading? | --- | 2021/09/10 09:19 AM |
Virtually tagged L1-caches | sr | 2021/09/11 01:19 AM |
Virtually tagged L1-caches | sr | 2021/09/11 01:36 AM |
Virtually tagged L1-caches | --- | 2021/09/11 09:53 AM |
Virtually tagged L1-caches | sr | 2021/09/12 12:43 AM |
Virtually tagged L1-caches | Linus Torvalds | 2021/09/12 11:10 AM |
Virtually tagged L1-caches | sr | 2021/09/12 11:57 AM |
Virtually tagged L1-caches | dmcq | 2021/09/13 08:31 AM |
Virtually tagged L1-caches | sr | 2021/09/20 04:11 AM |
Virtually tagged L1-caches | sr | 2021/09/11 02:49 AM |
Virtually tagged L1-caches | Linus Torvalds | 2021/09/08 12:34 PM |
Virtually tagged L1-caches | dmcq | 2021/09/09 02:46 AM |
Virtually tagged L1-caches | dmcq | 2021/09/09 02:58 AM |
Virtually tagged L1-caches | sr | 2021/09/11 01:29 AM |
Virtually tagged L1-caches | dmcq | 2021/09/11 08:59 AM |
Virtually tagged L1-caches | sr | 2021/09/12 12:57 AM |
Virtually tagged L1-caches | dmcq | 2021/09/12 08:44 AM |
Virtually tagged L1-caches | sr | 2021/09/12 09:48 AM |
Virtually tagged L1-caches | dmcq | 2021/09/12 01:22 PM |
Virtually tagged L1-caches | sr | 2021/09/20 04:40 AM |
Where do you see this information? (NT) | anon2 | 2021/09/09 02:45 AM |
Where do you see this information? | sr | 2021/09/11 01:40 AM |
Where do you see this information? | anon2 | 2021/09/11 01:53 AM |
Where do you see this information? | sr | 2021/09/11 02:08 AM |
Thank you (NT) | anon2 | 2021/09/11 04:31 PM |