Я заводил тему про set_fs http://www.linux.org.ru/forum/development/4535285 с ней все понятно, но встает другой вопрос: как работает этот самый addr_limit который задается через set_fs ? Как все уже поняли KERNEL SPACE (KERNEL_DS) это от 3 до 4Gb, USER SPACE (USER_DS) это от 0 до 3 Gb. Но это голые слова, на практике же мы имеем
KERNEL_DS = 4294967295 = 0xFFFFFFFF = 4Gb
USER_DS = 3221225472 = 0xC0000000 (задается в конфиге) = 3Gb
с юсер спейсом предположим все понятно, адреса идут от 0 и до < USER_DS (addr_limit) а как это работает в случае с KERNEL_DS Oo ? Откуда процессу известно что оно должно начинать нумеровать адреса не с 0 а с 3Gb ?
А еще я не могу понять следующего: в GDT в десктрипторах __KERNEL_CS, __KERNEL_DS, USER_CS, USER_DS есть поля отвечающие за начало (base) и конец (linux) адресного пространства, и в них оно во всех от 0x00000000 до 0xffffffff. Тобишь от 0Gb до 4Gb. А адресное адресное пространство процесса подчиняется выше описанному правилу (от 0 до 3, от 3 до 4). Но здесь я пиняю на то что процессы использую виртуальное адресное пространство а в GDT указывается логические адреса. Я ошибаюсь ?
Буду рад любым ответам, советам, посылваниям :) Боветте и чезатти я читал, читаю. Это как раз от тудова такие вопросы и возникают.