Обробка системних викликів

Додатки користувача не можуть безпосередньо виконувати код ядра Вони не можуть просто викликати функцію, яка існує в просторі ядра, так як ядро ​​знаходиться в захищеній області памяті Якщо програми зможуть безпосередньо читати і писати в адресний простір ядра, то безпеку системи вилетить в трубу.

Користувальницькі програми повинні будь-яким чином сигналізувати ядру про те, що їм необхідно виконати системний виклик і що система повинна перемкнутися в режим ядра, де системний виклик повинен бути виконаний за допомогою ядра, що працює від імені програми

Таким механізмом, який може подати сигнал ядру, є програмне переривання: створюється виняткова ситуація (exception) і система перемикається в режим ядра для виконання обробника цієї виняткової ситуації Оброблювач виняткової ситуації в даному випадку і є обробником системного виклику (system call handler) Для апаратної платформи х8б це програмне переривання визначено як машинна інструкція in t $ 0x80 Вона приводить в дію механізм перемикання в режим ядра і виконання вектора виняткової ситуації з номером 128, який є обробником системних викликів Оброблювач системних викликів-це функція з дуже відповідним імям system_cal l () Дана функція залежна від апаратної платформи і визначена у файлі entryS 6 У нових процесорах зявилася така нова функція, якsysenter Ця функція забезпечує більш швидкий і спеціалізований спосіб входу в ядро ​​для виконання системного виклику, ніж використання інструкції програмного переривання – int Підтримка такої функції була швидко додана в ядро Незалежно від того, яким чином виконується системний виклик, основним є те, що простір користувача викликає виняткову ситуацію, або переривання, щоб викликати перехід в ядро

Визначення необхідного системного виклику

Простий перехід в простір ядра сам по собі не є достатнім, тому що існує багато системних викликів, кожен з яких здійснює перехід в режим ядра однаковим чином Тому ядру повинен передаватися номер системного виклику

6 великачастина подальшого опису процесу обробки системних викликів базується на версії для апаратної платформи x86 Але не варто хвилюватися, для інших апаратних платформ це виконується аналогічним чином

Для апаратної платформи х86 номер системного виклику зберігається в регістрі процесора ЕАХ перед тим, як викликається програмне переривання Оброблювач системних викликів після цього зчитує це значення з регістра ЕАХ Для інших апаратних платформ виконується щось аналогічне

Функція system_call () перевіряє правильність переданого номера системного виклику шляхом порівняння його із значенням постійної NR_syscalls Якщо значення номера більше або дорівнює значенню NR_syscalls, то функція повертає значення-ENOSYS В іншому випадку викликається відповідний системний виклик таким чином:

call *sys_call_table(,%eax,4)

Так як кожен елемент таблиці системних викликів має довжину 32 біт (4 байт), то ядро ​​множить даний номер системного виклику на 4 для отримання потрібної позиції в таблиці системних викликів (рис 52)

Виклик функції

read()

Оболонка функції

read()

Виклик функції

system_call()

Виклик функції

sys_read()

Додаток Оболонка функції read () в бібліотеці З

Оброблювач Системних викликів

Функція

sys_read()

Простір користувача

Простір ядра

Рис 52 Запуск обробника системних викликів і виконання системного виклику

Передача параметрів

На додаток до номером виклику, більшість системних викликів вимагає передачі ним одного або декількох параметрів Під час перехоплення виняткової ситуації простір користувача повинне будь-яким чином передати ядру ці параметри Найпростіший спосіб здійснити таку передачу – це зробити за аналогією з передачею номера системної функції: параметри зберігаються в регістрах процесора Для апаратної платформи х86 регістри ebx, ecx, edx, esi, ed i містять відповідно перші пять аргументів У разі рідкісних ситуацій з шістьма або більше аргументами, використовується один регістр, який містить покажчик на память простору користувача, де зберігаються всі параметри

Значення, що повертається також передається в простір користувача через регістр Для апаратної платформа х86 воно зберігається в регістрі ЕАХ

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*